Tải bản đầy đủ (.doc) (62 trang)

Nghiên cứu các thuật toán mã hóa khóa công khai và ứng dụng trong chữ ký điện tử

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (637.31 KB, 62 trang )

MỤC LỤC
DANH MỤC CÁC HÌNH..............................................................................3
MỞ ĐẦU.........................................................................................................4
CHƯƠNG 1. TỔNG QUAN VỀ CÁC THUẬT TOÁN MÃ HÓA KHÓA
CÔNG KHAI..................................................................................................6
Khởi tạo Diffie Hellman..............................................................................15
Trao đổi khoá Diffie Hellman.....................................................................15
CHƯƠNG 2: HÀM BĂM VÀ CHỮ KÝ ĐIỆN TỬ..................................21
2.1 Hàm băm................................................................................................21
2.1.1 Tổng quan về hàm băm......................................................................21
Giới thiệu hàm băm.....................................................................................21
.......................................................................................................................21
Các yêu cầu của hàm băm...........................................................................21
2.1.2 Một số hàm băm được sử dụng phổ biến..........................................26
2.1.2.1 Họ hàm băm SHA (Secure Hash Algorithm)................................26
Hàm băm SHA-1..........................................................................................26
2.1.2.2 Họ hàm băm MD (Message-Digest algorithm).............................29
Hàm băm MD4.............................................................................................29
Hàm băm MD5.............................................................................................32
2.2 CHỮ KÝ ĐIỆN TỬ...............................................................................36
Đặc điểm của chữ ký điện tử.......................................................................40
Chức năng.....................................................................................................40
2.3 Những vấn đề trao đổi cặp khóa đặt ra trong thực tế........................41
2.3.1 Sự tương tự với bưu chính........................................................41
Phân phối khoá............................................................................................44
KẾT LUẬN...................................................................................................55
GIẢI THÍCH MỘT SỐ THUẬT NGỮ......................................................56
TÀI LIỆU THAM KHẢO...........................................................................57

1



DANH MỤC CÁC CHỮ TIẾNG ANH VIẾT TẮT
NIST

National Institute of Standards and Technology

RSA

R. Rivest, A. Shamir, L. Adleman

MITM

Man-In-The-Middle attack

MD

Message-Digest algorithm

SHA

Secure Hash Algorithm

MAC

Message Authentication Code

PKCS

Public Key Cryptography Standards


2


DANH MỤC CÁC HÌNH
STT

TÊN HÌNH

TRANG

1

Hình 1.1: Kênh liên lạc

9

2

Hình 2.1: Hoạt động của một hàm băm tiêu biểu

21

3

Hình 2.2: Mô hình ký gửi thông điệp sử dụng hàm băm

25

4


Hình 2.3: Mô hình xác minh chữ ký, kiểm tra tính toàn
vẹn của thông điệp

26

5

Hình 2.4: Mô hình chữ ký điện tử

40

6

Hình 3.1: Sơ đồ hệ thống ứng dụng

53

7

Hình 3.2: Giao diện chương trình

55

8

Hình 3.3: Giao diện tao cặp khóa

56

9


Hình 3.4: Giao diện lựa chọn văn bản cần ký

56

10
11

Hình 3.5: Giao diện ký văn bản đã lựa chọn bằng khóa
bí mật
Hình 3.6: Giao diện giải mã văn bản đã ký bằng khóa
công khai

3

57
57


MỞ ĐẦU
1. Lý do nghiên cứu đề tài
Bảo mật thông tin luôn là nhu cầu cần thiết trong các lĩnh vực tình
báo, quân sự, ngoại giao, thông tin thương mại. Bảo mật thông tin cũng
là một vấn đề đã được nghiên cứu từ xưa đến nay.
Bảo mật thông tin là duy trì tính bảo mật, tính toàn vẹn, tính sẵn sàng.
Tính bảo mật là đảm bảo thông tin chỉ được tiếp cận bởi những người được
cấp quyền trao đổi thông tin. Tính toàn vẹn của thông tin là bảo vệ sự chính
xác, hoàn chỉnh của thông tin và thông tin chỉ được thay đổi bởi những
người được cấp quyền. Tính sẵn sàng của thông tin là những người được
quyền sử dụng có thể truy xuất thông tin khi họ cần. Để đảm bảo được các

yêu cầu về thông tin trên thì rất nhiều người trong nước và thế giới đang tập
trung nghiên cứu và tìm mọi giải pháp để đảm bảo an toàn, an ninh cho các
giao dịch điện tử trên máy tính.
Giao dịch điện tử ở Việt Nam hiện nay đã và đang được quan tâm.
Những giao dịch điện tử xuất hiện cùng với sự phổ dụng của máy tính và
mạng Internet. Đã có những luật, văn bản dưới luật cho lĩnh vực an toàn
thông tin trong giao dịch điện tử như: Quốc hội thông qua luật thương mại,
luật giao dịch điện tử... Thủ tướng Chính phủ đã ban hành Quyết định số
1073/QĐ-TTg ngày 12/7/2010 phê duyệt kế hoạch tổng thể phát triển thương
mại điện tử giai đoạn 2010 – 2015...
Cùng với xu thế chung của đất nước, cũng là yêu cầu đặt ra với chính
công việc của mình, học viên đã chọn đề tài về an toàn thông tin, mà ở đây
cụ thể là áp dụng các thuật toán mã hóa khóa công khai, hàm băm, chữ ký
điện tử, làm mục tiêu nghiên cứu. Mong muốn những tìm tòi của mình có thể
xây dựng được ứng dụng phục vụ cho cơ quan, đơn vị nơi học viên công tác.
2. Hướng nghiên cứu đề tài
− Nghiên cứu các giải thuật mã hóa khóa công khai.
− Nghiên cứu về chữ ký điện tử, tìm hiểu về hàm băm và các giải thuật
về hàm băm.
4


− Cài đặt thử nghiệm một giải thuật sinh chữ ký điện tử.
3. Đối tượng nghiên cứu
− Một số thuật toán sinh khóa công khai, khóa bí mật;
− Một số hàm băm thường sử dụng hiện nay;
− Chữ ký điện tử.
4. Phương pháp nghiên cứu đề tài
− Tìm hiểu dựa trên cơ sở lý thuyết, các thuật toán hay về sinh
khóa công khai, khóa bí mật đã có từ trước. So sánh để thấy

những ưu điểm, những hạn chế của từng thuật toán.
− Từ cơ sở đó có thể cải tiến, hoặc triển khai ứng dụng cài đặt
một giải thuật tối ưu nhất vào thực tiễn.
− Trong quá trình triển khai ứng dụng nêu lên những hạn chế của
đề tài và những khó khăn trong thực hiện đề tài.
− Đề xuất hướng phát triển của đề tài trong thời gian tới.
5. Cấu trúc của luận văn
Ngoài phần mở đầu và kết luận đề tài có cơ cấu gồm 3 chương:
Chương 1 : Tổng quan về các thuật toán mã hóa khóa công khai
Chương 2: Hàm băm và chữ ký điện tử
Chương 3: Xây dựng ứng dụng.

5


CHƯƠNG 1. TỔNG QUAN VỀ CÁC THUẬT TOÁN
MÃ HÓA KHÓA CÔNG KHAI
1.1 Khái niệm mã hóa khóa công khai
1.1.1 Mật mã hóa khóa đối xứng
Trong mật mã học, các thuật toán khóa đối xứng (symmetric key
algorithms) là một lớp các thuật toán mật mã hóa trong đó các khóa dùng
cho việc mật mã hóa và giải mã có quan hệ rõ ràng với nhau (có thể dễ dàng
tìm được một khóa nếu biết khóa kia).
Khóa dùng để mã hóa có liên hệ một cách rõ ràng với khóa dùng để
giải mã có nghĩa chúng có thể hoàn toàn giống nhau, hoặc chỉ khác nhau nhờ
một biến đổi đơn giản giữa hai khóa. Trên thực tế, các khóa này đại diện cho
một bí mật được phân hưởng bởi hai bên hoặc nhiều hơn và được sử dụng để
giữ gìn sự bí mật trong kênh truyền thông tin
Thuật toán đối xứng có thể được chia ra làm hai thể loại, mật mã
luồng (stream ciphers) và mật mã khối (block ciphers). Mật mã luồng mã

hóa từng bit của thông điệp trong khi mật mã khối gộp một số bit lại và mật
mã hóa chúng như một đơn vị. Cỡ khối được dùng thường là các khối 64 bit.
Những thuật toán mã hóa khóa đối xứng nổi tiếng là DES và AES.
Các thuật toán đối xứng thường không được sử dụng độc lập. Trong
thiết kế của các hệ thống mật mã hiện đại, cả hai kiểu mật hóa khóa đối xứng
và khóa bất đối xứng thường được sử dụng phối hợp để tận dụng các ưu
điểm của chúng.
1.1.2 Mật mã hóa khóa công khai
Là một dạng mật mã hóa cho phép người sử dụng trao đổi các thông
tin mật mà không cần phải trao đổi các khóa chung bí mật trước đó. Điều
này được thực hiện bằng cách sử dụng một cặp khóa có quan hệ toán học với
nhau là khóa công khai và khóa cá nhân (hay khóa bí mật).
Thuật ngữ "mật mã hóa khóa bất đối xứng" thường được dùng đồng
nghĩa với "mật mã hóa khóa công khai" mặc dù hai khái niệm không hoàn
toàn tương đương. Có những thuật toán mật mã khóa bất đối xứng không có
6


tính chất khóa công khai và bí mật như đề cập ở trên mà cả hai khóa (cho mã
hóa và giải mã) đều cần phải giữ bí mật.
Trong mật mã hóa khóa công khai, khóa cá nhân phải được giữ bí mật
trong khi khóa công khai được phổ biến công khai. Trong 2 khóa, một dùng
để mã hóa và khóa còn lại dùng để giải mã. Điều quan trọng đối với hệ thống
là không thể tìm ra khóa bí mật nếu chỉ biết khóa công khai.
Hệ thống mật mã hóa khóa công khai có thể sử dụng với các mục
đích:
− Mã hóa: giữ bí mật thông tin và chỉ có người có khóa bí mật mới giải
mã được.
− Tạo chữ ký số: cho phép kiểm tra một văn bản có phải đã được tạo
với một khóa bí mật nào đó hay không.

− Thỏa thuận khóa: cho phép thiết lập khóa dùng để trao đổi thông tin
mật giữa 2 bên.
Thông thường, các kỹ thuật mật mã hóa khóa công khai đòi hỏi khối
lượng tính toán nhiều hơn các kỹ thuật mã hóa khóa đối xứng nhưng những lợi
điểm mà chúng mang lại khiến cho chúng được áp dụng trong nhiều ứng dụng.
Có thể hình dung hệ mật này tương tự như sau. A đặt một vật vào một
hộp kim loại và rồi khoá nó lại bằng một khoá số do B để lại. Chỉ có B là
người duy nhất có thể mở được hộp vì chỉ có người đó mới biết tổ hợp mã
của khoá số của mình.
Thuật toán mã hóa công khai là thuật toán được thiết kế sao cho khóa
mã hóa là khác so với khóa giải mã. Mà khóa giải mã hóa không thể tính
toán được từ khóa mã hóa. Khóa mã hóa gọi là khóa công khai (public key),
khóa giải mã được gọi là khóa riêng (private key).

7


Hình 1.1: Kênh liên lạc
Oscar

A

Bộ mã hóa

Bộ giải mã

B

Khóa
hóahệ mã hóa công

Khóakhai
giải là
mãcả khóa công khai
Đặc trưng nổi
bậtmã
của

(public key) và bản tin mã hóa (ciphertext) đều có thể gửi đi trên một kênh
thông tin không an toàn.
Trong hầu hết lịch sử mật mã học, khóa dùng trong các quá trình mã
hóa và giải mã phải được giữ bí mật và cần được trao đổi bằng một phương
pháp an toàn khác (không dùng mật mã) như gặp nhau trực tiếp hay thông
qua một người đưa thư tin cậy. Vì vậy quá trình phân phối khóa trong thực tế
gặp rất nhiều khó khăn, đặc biệt là khi số lượng người sử dụng rất lớn. Mật
mã hóa khóa công khai đã giải quyết được vấn đề này vì nó cho phép người
dùng gửi thông tin mật trên đường truyền không an toàn mà không cần thỏa
thuận khóa từ trước.
Năm 1874, William Stanley Jevons xuất bản một cuốn sách mô tả
mối quan hệ giữa các hàm một chiều với mật mã học đồng thời đi sâu vào bài
toán phân tích ra thừa số nguyên tố (sử dụng trong thuật toán RSA). Tháng 7
năm 1996, một nhà nghiên cứu đã bình luận về cuốn sách trên như sau:
Trong cuốn The Principles of Science: A Treatise on Logic and
Scientific Method được xuất bản năm 1890, William S. Jevons đã phát hiện
nhiều phép toán rất dễ thực hiện theo một chiều nhưng rất khó theo chiều
ngược lại. Một ví dụ đã chứng tỏ mã hóa rất dễ dàng trong khi giải mã thì
không. Vẫn trong phần nói trên ở chương 7 (Giới thiệu về phép tính ngược)
tác giả đề cập đến nguyên lý: ta có thể dễ dàng nhân các số tự nhiên nhưng
phân tích kết quả ra thừa số nguyên tố thì không hề đơn giản. Đây chính là

8



nguyên tắc cơ bản của thuật toán mật mã hóa khóa công khai RSA mặc dù
tác giả không phải là người phát minh ra mật mã hóa khóa công khai.
Thuật toán mật mã hóa khóa công khai được thiết kế đầu tiên bởi
James H. Ellis, Clifford Cocks, và Malcolm Williamson tại GCHQ (Anh)
vào đầu thập kỷ 1970. Thuật toán sau này được phát triển và biết đến dưới
tên Diffie-Hellman, và là một trường hợp đặc biệt của RSA. Tuy nhiên
những thông tin này chỉ được tiết lộ vào năm 1997.
Năm 1976, Whitfield Diffie và Martin Hellman công bố một hệ thống
mật mã hóa khóa bất đối xứng trong đó nêu ra phương pháp trao đổi khóa
công khai. Công trình này chịu sự ảnh hưởng từ xuất bản trước đó của Ralph
Merkle về phân phối khóa công khai. Trao đổi khóa Diffie-Hellman là
phương pháp có thể áp dụng trên thực tế đầu tiên để phân phối khóa bí mật
thông qua một kênh thông tin không an toàn. Kỹ thuật thỏa thuận khóa của
Merkle có tên là hệ thống câu đố Merkle.
Thuật toán đầu tiên cũng được Rivest, Shamir và Adleman tìm ra vào
năm 1977 tại MIT. Công trình này được công bố vào năm 1978 và thuật toán
được đặt tên là RSA. RSA sử dụng phép toán tính hàm mũ môđun (môđun
được tính bằng tích số của 2 số nguyên tố lớn) để mã hóa và giải mã cũng
như tạo chữ ký số. An toàn của thuật toán được đảm bảo với điều kiện là
không tồn tại kỹ thuật hiệu quả để phân tích một số rất lớn thành thừa số
nguyên tố.
Kể từ thập kỷ 1970, đã có rất nhiều thuật toán mã hóa, tạo chữ ký số,
thỏa thuận khóa.. được phát triển. Các thuật toán như ElGamal (mật mã) do
Netscape phát triển hay DSA do NSA và NIST cũng dựa trên các bài toán
lôgarit rời rạc tương tự như RSA. Vào giữa thập kỷ 1980, Neal Koblitz bắt
đầu cho một dòng thuật toán mới: mật mã đường cong elliptic và cũng tạo ra
nhiều thuật toán tương tự. Mặc dù cơ sở toán học của dòng thuật toán này
phức tạp hơn nhưng lại giúp làm giảm khối lượng tính toán đặc biệt khi khóa

có độ dài lớn.
Vấn đề về độ an toàn của thuật toán mật mã hóa khóa công khai
9


Về khía cạnh an toàn, các thuật toán mật mã hóa khóa bất đối xứng
cũng không khác nhiều với các thuật toán mã hóa khóa đối xứng. Có những
thuật toán được dùng rộng rãi, có thuật toán chủ yếu trên lý thuyết; có thuật
toán vẫn được xem là an toàn, có thuật toán đã bị phá vỡ... Cũng cần lưu ý là
những thuật toán được dùng rộng rãi không phải lúc nào cũng đảm bảo an
toàn. Một số thuật toán có những chứng minh về độ an toàn với những tiêu
chuẩn khác nhau. Nhiều chứng minh gắn việc phá vỡ thuật toán với những
bài toán nổi tiếng vẫn được cho là không có lời giải trong thời gian đa thức
(Xem thêm: Lý thuyết độ phức tạp tính toán). Nhìn chung, chưa có thuật
toán nào được chứng minh là an toàn tuyệt đối (như hệ thống mật mã sử
dụng một lần). Vì vậy, cũng giống như tất cả các thuật toán mật mã nói
chung, các thuật toán mã hóa khóa công khai cần phải được sử dụng một
cách thận trọng.
1.2 Các thuật toán mật mã hóa khóa công khai
1.2.1 Thuật toán RSA
Thuật toán được Ron Rivest, Adi Shamir và Len Adleman mô tả lần
đầu tiên vào năm 1977 tại Học viện Công nghệ Massachusetts (MIT). Tên
của thuật toán lấy từ 3 chữ cái đầu của tên 3 tác giả.
Thuật toán RSA có hai khóa: khóa công khai (hay khóa công cộng) và
khóa bí mật (hay khóa cá nhân). Mỗi khóa là những số cố định sử dụng trong
quá trình mã hóa và giải mã. Khóa công khai được công bố rộng rãi cho mọi
người và được dùng để mã hóa. Những thông tin được mã hóa bằng khóa
công khai chỉ có thể được giải mã bằng khóa bí mật tương ứng. Nói cách
khác, mọi người đều có thể mã hóa nhưng chỉ có người biết khóa cá nhân (bí
mật) mới có thể giải mã được.

Ta có thể mô phỏng trực quan một hệ mật mã hóa khoá công khai như
sau: giả sử B muốn gửi cho A một thông tin mật mà B muốn duy nhất A có
thể đọc được. Để làm được điều này, A gửi cho B một chiếc hộp có khóa đã
mở sẵn và giữ lại chìa khóa. B nhận chiếc hộp, cho vào đó một tờ giấy viết
thư bình thường và khóa lại (như loại khoá thông thường chỉ cần sập chốt lại,
10


sau khi sập chốt khóa ngay cả B cũng không thể mở lại được, không đọc lại
hay sửa thông tin trong thư được nữa). Sau đó B gửi chiếc hộp lại cho A và
A mở hộp với chìa khóa của mình và đọc thông tin trong thư. Trong ví dụ
này, chiếc hộp với khóa mở đóng vai trò khóa công khai, chiếc chìa khóa
chính là khóa bí mật.
Tạo khóa
Giả sử A và B cần trao đổi thông tin bí mật thông qua một kênh không
an toàn (ví dụ như Internet). Với thuật toán RSA, A đầu tiên cần tạo ra cho
mình cặp khóa gồm khóa công khai và khóa bí mật theo các bước sau:
1 Chọn 2 số nguyên tố lớn và với

, lựa chọn ngẫu nhiên và độc

lập.
2 Tính:

.

3 Tính giá trị hàm số Ơle
4 Chọn một số tự nhiên sao cho

và là số nguyên tố cùng


nhau với .
5 Tính

sao cho

Một số lưu ý:


Các số nguyên tố thường được chọn bằng phương pháp thử xác suất.



Các bước 4 và 5 có thể được thực hiện bằng giải thuật Euclid mở rộng.

o

Bước 5 có thể viết cách khác: Tìm số tự nhiên

sao cho

cũng là số tự nhiên. Khi đó sử dụng giá trị


Từ bước 3, sử dụng
thay cho

Khóa công khai bao gồm:



n – môđun và e - số mũ công khai (cũng gọi là số mũ mã hóa).

Khóa bí mật bao gồm:


n – môđun và d - số mũ bí mật (cũng gọi là số mũ giải mã).

Mã hóa
11


Giả sử B muốn gửi một thông điệp M cho A. Đầu tiên B chuyển M
thành một số m < n theo một hàm có thể đảo ngược (từ m có thể xác định lại
M) được thỏa thuận trước. Sau đó, B yêu cầu A gửi cho mình khóa công khai
của A gồm n và e.
B sẽ tính c là bản mã hóa của m theo công thức:
Có thể dễ dàng tính được c bằng cách sử dụng phương pháp tính hàm
mũ (theo môđun) bằng thuật toán bình phương và nhân. Cuối cùng B gửi c
cho A.
Giải mã
A nhận c từ B và tính được m từ c theo công thức sau:
Biết m, A tìm lại M theo phương pháp đã thỏa thuận trước. Quá trình
giải mã hoạt động vì ta có
.
Do ed ≡ 1 (mod p-1) và ed ≡ 1 (mod q-1), (theo Định lý Fermat nhỏ)
nên:

Do p và q là hai số nguyên tố cùng nhau, áp dụng định lý số dư Trung
Quốc, ta có:
.

hay:
.

Ví dụ tạo khóa công khai và khóa bí mật:
12


Sau đây là một ví dụ với những số cụ thể. Ở đây chúng ta sử dụng
những số nhỏ để tiện tính toán còn trong thực tế phải dùng các số có giá trị
đủ lớn.
1. Chọn các số nguyên tố:
2. Tính n = pq,

p=17 & q=11.

n = 17×11=187

3. Tính Ф(n)=(p–1)(q-1)=16×10=160
4. Chọn e : gcd(e,160)=1; Lấy e=7
5. Xác định d: de=1 mod 160 và d < 160
Giá trị cần tìm là d=23, vì 23×7=161= 1×160+1
6. In khoá công khai KU={7,187}
7. Giữ khoá riêng bí mật KR={23,187}
8. Hủy bỏ các giá trị bí mật p = 17 và q = 11
Ví dụ mã hóa, giải mã dựa trên cặp khóa công khai, bí mật:

• Cho mẩu tin M = 88 (vậy 88<187)
• Mã

C = 887 mod 187 = 11


• Giải mã

M = 1123 mod 187 = 88

• Có thể dùng định lý phần dư Trung Hoa để giải mã cho nhanh như sau:
a. Tính 1123 mod 11 = 0
b. Tính 1123mod 17 = (-6)23 mod 17 = (-6)16(-6)4 (-6)2 (-6) mod 17 = 3
Vì (-6)2 mod 17 = 2, nên (-6)4 mod 17 = 4, (-6)8 mod 17 = -1
(-6)16 mod 17 = 1
c. 11-1 mod 17 = (-6)-1 mod 17 = 14 nên c2 = 11(11-1 mod 17) = 11
(14 mod 17) = 154
Vậy

M = (3.154) mod 187 = 462 mod 187 = 88
13


Độ an toàn của thuật toán RSA
Độ an toàn của thuật toán RSA dựa vào độ khó giải của việc tính
Ф(N) và điều này đòi hỏi chúng ta cần phân tích N ra thừa số nguyên tố.
Thuật toán phân tích số nguyên tố hiệu quả nhất hiện nay là Berent-Pollard,
chúng ta hãy xem bảng thống kê sau để thấy được tốc độ hoạt động của nó:
Số chữ số trong hệ thập phân của N
Số các thao tác bit để phân tích N
20
7.20e+03
40
3.11e+06
60

4.63e+08
80
3.72e+10
100
1.97e+12
120
7.69e+13
Các nghiên cứu về phân tích các số nguyên tố lớn hiện nay tiến triển
rất chậm, các tiến bộ lớn nhất cũng chỉ cải tiến về thuật toán và có thể nói
rằng trừ khi có các đột phá trong việc phân tích các số 1024 bit, RSA là thuật
toán an toàn trong thời điểm này.
Trên thực tế việc để cài đặt RSA cần phải thực hiện các thao tác
modulo với các số 300 chữ số (hay 1024 bit) mà hiện nay các máy tính mới
chỉ thao tác với các số nguyên 128 bit, điều này dẫn đến nhu cầu về các thư
viện số học nhân chính xác để làm việc với các số nguyên lớn này. Ngoài ra
việc sử dụng RSA cần tới các số nguyên tố lớn nên chúng ta cũng phải có
một cơ sở dữ liệu các số nguyên tố.
1.2.2 Trao đổi và thỏa thuận khóa Diffie-Hellman
Thuật toán thỏa thuận khóa Diffie-Hellman là một thuật toán dùng để
trao đổi khóa chứ không dùng để mật mã hóa dữ liệu. Tuy nhiên DiffieHellman lại có ích trong giai đoạn trao đổi khóa bí mật của các thuật toán
mật mã đối xứng. Thuật toán thỏa thuận khóa Diffie-Hellman thúc đẩy việc
nghiên cứu đề xuất các mã khoá công khai, một trong những vấn đề quan
trọng liên quan trực tiếp đến tính an toàn của các thuật toán mật mã đối
xứng là vấn đề thống nhất khoá bí mật giữa các thực thể thông tin.
Giả sử A và B muốn liên lạc sử dụng hệ mật khoá bí mật. Để thoả
thuận mật khoá K chung cho cả hai bên qua một kênh không an toàn mà
14


không ai khác có thể biết được, A và B có thể dùng thủ tục thoả thuận

khoá Diffie -Hellman sau:
Thuật toán:
Khởi tạo Diffie Hellman
• Mọi người dùng thỏa thuận dùng tham số chung:
o Số nguyên tố rất lớn q hoặc đa thức.
o α
o

là căn nguyên tố của mod q.

• Mỗi người dùng (A chẳng hạn) tạo khoá của mình:
o Chọn một khoá mật (số) của A: xA < q
x
o Tính khoá công khai của A: yA = α A mod q.

o Mỗi người dùng thông báo công khai khoá của mình yA.
Trao đổi khoá Diffie Hellman
• Khoá phiên dùng chung cho hai người sử dụng A, B là KAB
KAB = αxA.xB mod q
= yAxB mod q (mà B có thể tính)
= yBxA mod q (mà A có thể tính)
• KAB được sử dụng như khoá phiên trong sơ đồ khoá riêng giữa A và B
• A và B lần lượt trao đổi với nhau, họ có khoá chung KAB cho đến khi họ
chọn khoá mới.
• Kẻ thám mã cần x, do đó phải giải tính logarit rời rạc
Ví dụ:
Hai người sử dụng A & B muốn trao đổi khoá phiên:
• Đồng ý chọn số nguyên tố q=353 và α=3
15



• Chọn các khoá mật ngẫu nhiên:
A chọn xA=97, B chọn xB=233
• Tính các khoá công khai:
yA=397 mod 353 = 40

(A)

yB=3233 mod 353 = 248 (B)
• Tính khoá phiên chung:
KAB= yBxA mod 353 = 24897 = 160 (A)
KAB= yAxB mod 353 = 40233 = 160 (B)
1.2.3 Hệ mã ElGammal
Hệ mã ElGammal là một biến thể của sơ đồ phân phối khóa DiffieHellman. Ḥệ mã này được ElGammal đưa ra vào năm 1985. Tính an toàn
của nó dựa trên tính khó giải của bài toán logarit rời rạc. Nhược điểm chính
của nó là kích thước thông tin sau khi mã hóa gửi đi sẽ tăng gấp đôi so với
thông tin gốc. Tuy nhiên so với thuật toán RSA, ElGammal không có nhiều
rắc rối về vấn đề bản quyền sử dụng. Trong thuật toán ElGammal một thông
điệp bất kỳ có thể có nhiều chữ ký hợp lệ khác nhau.
Thuật toán:
Ban đầu chọn một số nguyên tố lớn p và hai số nguyên tùy ý nhỏ hơn
p là a (a là một phần tử nguyên thủy của Z *p) và x (x là của người nhận, bí
mật), sau đó tính:
y = ax mod p
Để mã hóa một thông điệp M (là một số nguyên trên Z p) thành bản mã
C người gửi chọn một số ngẫu nhiên k nhỏ hơn p và tính khóa mã K:
K = yk mod p
Sau đó tính cặp bản mã:
. C1 = ak mod p
.C2 = K.M mod p

Và gửi bản mã C = (C1,C2) đi (lưu ý là sau đó k sẽ bị hủy).
16


Để giải mã thông điệp đầu tiên ta cần tính lại khóa mã hóa thông
điệp K:
K = C1x mod p = akx mod p
Sau đó tính M bằng cách giải phương trình sau:
M = C2.K-1 mod p
Việc giải mã bao gồm việc tính lại khóa tạm thời K (rất giống với mô
hình của Diffie – Hellman đưa ra). Khóa công khai của hệ mã (p,a,y), khóa
bí mật là x.
Ví dụ: Cho hệ mã ElGammal có P = 97, a = 5, x = 58.
- Tìm khóa của hệ mã này.
- Mã hóa bản rõ M = 3 với k được chọn bằng 36.
Trước hết ta tính y = 558 mod 97 = 44, từ đó suy ra Kp = (P,a,y) =
(97,5,44) và Ks = (58)
Để mã hóa thông điệp M = 3 ta tính khóa K = 44 36 mod 97 = 75 sau
đó tính:
. C1 = 536 = 50 mod 97
. C2 = 75.3 mod 97 = 31 mod 97
Vậy bản mã thu được là C = (50,31)
Vấn đề đối với hệ mã công khai nói chung và ElGammal nói riêng là
tốc độ (do phải làm việc với số nguyên lớn), bên cạnh đó dung lượng bộ nhớ
dành cho việc lưu trữ các khóa cũng lớn. Với hệ mã ElGammal chúng ta cần
gấp đôi bộ nhớ để chứa bản mã so với các hệ mã khác. Ngoài ra do việc sử
dụng các số nguyên tố nên việc sinh khóa và quản lý khóa cũng khó khăn
hơn so với các hệ mã khối. Trên thực tế các hệ mã khóa công khai thường
được sử dụng kết hợp với các hệ mã khối (mã hóa khóa của hệ mã) hoặc để
mã hóa các thông tin có dung lượng nhỏ và là một phần quan trọng của một

phiên truyền tin nào đó.
Thám mã với hệ mã ElGmamal:

17


Để thực hiện thám mã hệ mã ElGammal chúng ta cần giải bài toán
logarit rời rạc. Ở đây chúng ta sẽ xem xét thuật toán có thể áp dụng để giải
bài toán này.
Thuật toán Shank:
Thuật toán này còn có tên gọi khác là thuật toán cân bằng thời gian –
bộ nhớ (time – memory trade off), có nghĩa là nếu chúng ta có đủ bộ nhớ thì
có thể sử dụng bộ nhớ đó để giảm thời gian thực hiện của thuật toán xuống.
Input: số nguyên tố p, phần tử nguyên thủy a của Zp*, số nguyên y
Output: tìm x sao cho ax mod p = y
Thuật toán:
Gọi m = [(p-1)1/2] (lấy phần nguyên)
Bước 1: tính amj mod p với 0 <= j <= m-1
Bước 2: sắp xếp các cặp (j, a mj mod p) theo amj mod p và lưu vào
danh sách L1
Bước 3: tính ya-I mod p với 0 <= I <= m-1
Bước 4: sắp xếp các cặp (i, ya -i mod p) theo amj mod p và lưu vào
danh sách L2
Bước 5: tìm trong 2 danh sách L 1, L2 xem có tồn tại cặp (j, a -i mod p)
và (i, ya-i mod p) nào mà amj mod p = ya-I mod p (tọa độ thứ hai của cặp bằng
nhau)
Bước 6: x = (mj + i) mod (p - 1). Kết quả này có thể kiểm chứng từ
công thức amj mod p = ya-i mod p => amj + i mod p = y mod p => x = (mj + i)
mod (p - 1).
Độ phức tạp của thuật toán phụ thuộc vào m = [(p-1) 1/2], với giá trị

của m, chúng ta cần tính các phần tử thuộc hai danh sách L 1, L2 đều là các
phép toán lũy thừa phụ thuộc vào j và i, i và j lại phụ thuộc vào m nên có thể
nhận thấy là thuật toán này chỉ có thể áp dụng trong trường hợp mà p nhỏ.
1.3 So sánh ưu nhược điểm của các thuật toán
1.3.1 Ưu điểm

18


- Thuật toán RSA: Thực tế triển khai cho đến nay chứng tỏ rằng hệ
mã RSA là rất an toàn. Độ an toàn của hệ thống RSA dựa trên 2 vấn đề của
toán học: bài toán phân tích ra thừa số nguyên tố các số nguyên lớn và bài
toán RSA. Nếu 2 bài toán trên là khó (không tìm được thuật toán hiệu quả để
giải chúng) thì không thể thực hiện được việc phá mã toàn bộ đối với RSA.
Phá mã một phần phải được ngăn chặn bằng các phương pháp chuyển đổi
bản rõ an toàn.
- Thuật toán Diffie-Hellman: Có ích trong giai đoạn trao đổi khóa bí
mật của các thuật toán mật mã đối xứng. Tính an toàn trong trao đổi khóa
dựa trên việc khó giải của bài toán logarit rời rạc, Tuy nhiên, thuật toán này
không ngăn chặn được các tấn công theo phương thức người xen giữa ManIn-The-Middle (MITM). Có thể hiểu nôm na về kiểu tấn công này như là
một kẻ nghe trộm. MITM hoạt động bằng cách thiết lập các kết nối đến máy
tính nạn nhân và lấy cắp các thông tin trao đổi giữa họ. Trong trường hợp bị
tấn công, nạn nhân cứ tin tưởng là họ đang truyền thông một cách trực tiếp
với nạn nhân kia, trong khi đó sự thực thì các luồng truyền thông lại bị thông
qua máy tính của kẻ tấn công. Kết quả là các máy tính này không chỉ có thể
giải mã được các dữ liệu nhạy cảm mà nó còn có thể gửi xen vào cũng như
thay đổi luồng dữ liệu để kiểm soát sâu hơn những nạn nhân của nó.
- Hệ mã ElGammal giống như sơ đồ phân phối khóa Diffie-Hellman
tính an toàn của nó dựa trên tính khó giải của bài toán logarit rời rạc.
1.3.2 Hạn chế

- Hệ mã RSA có nhược điểm là mã hoá chậm, cho nên thường dùng để
mã hoá các bản tin ngắn, trao đổi chìa khoá của các hệ mã đối xứng, đặc biệt
là trong giao thức xác nhận chủ thể.
-Thuật toán Diffie-Hellman: dùng để trao đổi khóa chứ không dùng để
mật mã hóa dữ liệu.
- ElGammal: nhược điểm chính là kích thước thông tin sau khi mã hóa
gửi đi sẽ tăng gấp đôi so với thông tin gốc. Tuy nhiên so với RSA,
ElGammal không có nhiều rắc rối về vấn đề bản quyền sử dụng.
19


Nhận xét chung:
Kỹ thuật mật mã bất đối xứng hoàn toàn có thể đáp ứng được những
yêu cầu về bảo mật hệ thống như trong kỹ thuật mật mã đối xứng, mặc dù
tốc độ thực thi của mã bất đối xứng thường thấp hơn do bản chất thuật toán
dựa trên các thao tác số học chứ không dựa trên các thao tác xử lý bit. Hơn
nữa, mã bất đối xứng chỉ phù hợp với việc thực thi bằng phần mềm.
Mật mã bất đối xứng đảm bảo được 2 yêu cầu cơ bản của thông tin là
tính bí mật và tính toàn vẹn.

20


CHƯƠNG 2: HÀM BĂM VÀ CHỮ KÝ ĐIỆN TỬ
2.1 Hàm băm
2.1.1 Tổng quan về hàm băm
Giới thiệu hàm băm
Hàm băm (hash function) là một giải thuật nhằm sinh ra các giá trị
băm tương ứng với mỗi khối dữ liệu (có thể là một chuỗi kí tự, một đối
tượng trong lập trình hướng đối tượng, v.v...). Giá trị băm đóng vai gần như

một khóa để phân biệt các khối dữ liệu, tuy nhiên, người ta chấp nhận hiện
tượng trùng khóa hay còn gọi là đụng độ và cố gắng cải thiện giải thuật để
giảm thiểu sự đụng độ đó.
Hàm băm có nhiệm vụ băm thông điệp được đưa vào theo một thuật
toán h một chiều nào đó, rồi đưa ra một giá trị băm, có kích thước cố định.
Do đó người nhận không biết được nội dung hay độ dài ban đầu của thông
điệp đã được băm bằng hàm băm.
Giá trị của hàm băm là duy nhất, và không thể suy ngược lại được nội
dung thông điệp từ giá trị băm này.

Hình 2.1: Hoạt động của một hàm băm tiêu biểu
Các yêu cầu của hàm băm
Nén thông tin bất kỳ về kích thước cố định, và giả thiết hàm băm là
công khai và không dùng khoá. Hàm băm chỉ phụ thuộc thông tin.
Hàm băm được sử dụng để phát hiện thay đổi của thông tin. Hàm băm
có thể sử dụng nhiều cách khác nhau với thông tin, Hàm băm thường được
kết hợp dùng để tạo chữ ký trên thông tin.
21


Có thể áp dụng cho mọi thông tin có kích thước tuỳ ý. Tuy nhiên phải
tạo đầu ra h có kích thước cố định, thường là 128 bit đến 1024 bit.
Dễ tính h = H(M) cho mọi mẫu tin M, hàm H tính toán nhanh, hiệu
quả phụ thuộc chặt vào thông tin M và không tính toán ngược lại.
Cho trước h không thể tìm được (rất khó) x sao cho H(x) = h. Tính
chất này gọi là tính chất một chiều, chiều tìm nghịch ảnh rất khó khăn, tuy
chiều tìm ảnh lại dễ dàng.
Cho x không thể tìm được y sao cho H(y) = H(x). Đây là tính chất
chống đỡ va chạm yếu, không tìm được thông điệp có cùng Hàm băm với
thông tin đã cho; và không thể tìm được x, y sao cho H(y) = H(x). Đây gọi

là tính chất chống đỡ va chạm mạnh, đây là yêu cầu cao hơn tính chống đỡ
va chạm yếu.
Đặc trưng của hàm băm
Hàm băm h là hàm một chiều (one-way hàm băm) với các đặc tính:
- Với thông điệp đầu vào x thu được giá trị băm z = h(x) là duy nhất.
- Nếu dữ liệu trong thông điệp x thay đổi để thành thông điệp x’ thì
h(x’) ≠ h(x) => Hai thông điệp hoàn toàn khác nhau thì giá trị hàm băm cũng
khác nhau.
Nội dung của thông điệp gốc không thể bị suy ra từ giá trị hàm băm
=> Với thông điệp x thì dễ dàng tính được z = h(x), nhưng lại không thể
(thực chất là khó) suy ngược lại được x nếu chỉ biết giá trị hàm băm h.
Vai trò hàm băm trong mật mã hiện đại
Được dùng để xác thực tính nguyên vẹn dữ liệu;
Được dùng trong quá trình tạo chữ kí số trong giao dịch điện tử;
Vai trò cơ bản của các hàm băm mật mã là một giá trị băm coi như
ảnh đại diện thu gọn, đôi khi gọi là một dấu vết (imprint), vân tay số (digital
fingerprint), hoặc tóm lược thông báo (message digest) của một xâu đầu vào,
và có thể được dùng như là một định danh duy nhất với xâu đó;
Các hàm băm thường được dùng cho toàn vẹn dữ liệu kết hợp với các
lược đồ chữ kí số;
22


Một lớp các hàm băm riêng được gọi là mã xác thực thông báo (MAC)
cho phép xác thực thông báo bằng các kĩ thuật mã đối xứng.
Tính toàn vẹn của dữ liệu của hàm băm
Việc sử dụng các hệ mật mã và các sơ đồ chữ ký số, thường là mã hóa
và ký số trên từng bit của thông tin, sẽ tỷ lệ với thời gian để mã hóa và dung
lượng của thông tin.
Thêm vào đó có thể xảy ra trường hợp: Với nhiều bức thông điệp đầu

vào khác nhau, sử dụng hệ mật mã, sơ đồ ký số giống nhau (có thể khác
nhau) thì cho ra kết quả bản mã, bản ký số giống nhau (ánh xạ N-1: nhiều –
một). Điều này sẽ dẫn đến một số rắc rối về sau cho việc xác thực thông tin
Với các sơ đồ ký số, chỉ cho phép ký các bức thông điệp (thông tin) có
kích thước nhỏ và sau khi ký, bản ký số có kích thước gấp đôi bản thông
điệp gốc. Ví dụ: với sơ đồ chữ ký chuẩn DSS chỉ ký trên các bức thông điệp
có kích thước 160 bit, bản ký số sẽ có kích thước 320 bit.
Trong khi đó trên thực tế, ta cần phải ký các thông điệp có kích thước
lớn hơn nhiều, chẳng hạn vài chục MB. Hơn nữa, dữ liệu truyền qua mạng
không chỉ là bản thông điệp gốc, mà còn bao gồm cả bản ký số (có dung
lượng gấp đôi dung lượng bản thông điệp gốc), để đáp ứng việc xác thực sau
khi thông tin đến người nhận. Một cách đơn giản để giải bài toán (với thông
điệp có kích thước vài chục MB) này là chia thông điệp thành nhiều đoạn
160 bit, sau đó ký lên các đoạn đó độc lập nhau. Nhưng biện pháp này có
một số vấn đề trong việc tạo ra các chữ ký số:
- Thứ nhất: với một thông điệp có kích thước a, thì sau khi ký kích
thước của chữ ký sẽ là 2a (trong trường hợp sử dụng DSS).
- Thứ hai: với các chữ ký “an toàn” thì tốc độ chậm vì chúng dùng
nhiều phép tính số học phức tạp như số mũ modulo.
- Thứ ba: vấn đề nghiêm trọng hơn đó là kết quả sau khi ký, nội dung
của thông điệp có thể bị xáo trộn các đoạn với nhau, hoặc một số đoạn trong
chúng có thể bị mất mát, trong khi người nhận cần phải xác minh lại thông
điệp. Ta cần phải bảo vệ tính toàn vẹn của thông điệp.
23


Giải pháp cho các vấn đề vướng mắc đến chữ ký số là dùng “hàm
băm” để trợ giúp cho việc ký số. Các thuật toán băm với đầu vào là các bức
thông điệp có dung lượng, kích thước tùy ý (vài KB đến vài chục MB …) –
các bức thông điệp có thể là dạng văn bản, hình ảnh, âm thanh, file ứng dụng

v.v… - và với các thuật toán băm: MD2, MD4, MD5, SHA cho các giá trị
băm đầu ra có kích thước cố định: 128 bit với dòng MD, 160 bit với SHA1.
Như vậy, bức thông điệp kích thước tùy ý sau khi băm sẽ được thu gọn thành
những giá trị băm (còn được gọi là các “văn bản đại diện” nó có kích thước
cố định (128 bit hoặc 160 bit) tùy từng hàm băm cụ thể).
Với mỗi thông điệp đầu vào chỉ có thể tính ra được một văn bản đại
diện (shay giá trị băm) tương ứng, duy nhất. Hai thông điệp khác nhau chắc
chắn có hai văn bản đại diện khác nhau. Khi đã có văn bản đại diện duy nhất
cho bức thông điệp, áp dụng các sơ đồ chữ ký số ký trên văn bản đại diện đó.
Ví dụ về tính toàn vẹn dữ liệu khi sử dụng hàm băm:
Giả sử A muốn gửi cho B thông điệp x. A thực hiện các bước sau:
(1) A băm thông điệp x, thu được bản đại diện z = h(x) – có kích
thước cố định 128 bit hoặc 160 bit.
(2) A ký số trên bản đại diện z, bằng khóa bí mật của mình, thu được
bản ký số y = sig(z).
(3) A gửi (x, y) cho B.

24


Hình 2.2: Mô hình ký gửi thông điệp sử dụng hàm băm
Khi B nhận được (x, y). B thực hiện các bước sau:
(4) B kiểm tra chữ ký số để xác minh xem thông điệp mà mình nhận
được có phải được gửi từ A hay không bằng cách giải mã chữ ký số y, bằng
khóa công khai của A, được z’. B dùng một thuật toán băm – tương ứng với
thuật toán băm mà A dùng – để băm thông điệp x đi kèm, nhận được h(x)’.
(5) B so sánh 2 giá trị băm h(x)’ và h(x), nếu giống nhau thì chắc chắn
rằng thông điệp x – mà A muốn gửi cho B – còn nguyên vẹn, bên cạnh đó
cũng xác thực được người gửi.


25


×