Trước những năm 70 của thế kỉ XX, Số học vẫn được xem là một trong những ngành tốn học thuần túy, chỉ có ý nghĩa lý thuyết. Cách đây khoảng 30 năm, khó có thể hình dung được rằng, một số kết quả lý thuyết số trong Số học lại làm nên một cuộc cách mạng trong bảo mật thông tin. Cơ sở của những ứng dụng đó lại chính là Số học thuật tốn. Ở đây tơi chỉ trình bày ứng dụng của Số học trong mã mũ và hệ RSA
1.7.1 Mã mũ
Hệ mã này được Pohlig và Hellraman đưa ra năm 1978.
Thuật toán Giả sử p là một số nguyên tố lẻ, và chọn khóa lập mã e là một số nguyên dương sao cho (e, p−1) = 1. Để mã hóa một thông báo,
trước tiên ta chuyển các chữ cái thành dạng các chữ số tương ứng (thêm số 0 vào trước những số có một chữ số). Ta dùng bảng sau đây:
a ă â b c d đ e ê g h i k l m
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
n o ô ơ p q r s t u ư v x y
16 17 18 19 20 21 22 23 24 25 26 27 28 29
Sau đó ta nhóm các số nhận được thành từng nhóm 2m chữ số (2m là số nguyên chẵn lớn nhất sao cho mọi số tương ứng vớim chữ cái đều nhỏ hơn
p. Giả sử p là số nguyên tố trong khoảng 2929 < p < 292929. Mỗi chữ
cái được biểu diễn bằng một số khơng vượt q 29. Một số có m chữ cái sẽ được biểu diễn bằng một số không vượt quá m lần số 29 viết liên tiếp. Như vậy, để đảm bảo số đó ln ln nhỏ hơn p, m chỉ có thể là 1 hoặc 2. Ta lấy m = 2.
Công thức lập mã đối với một khối P trong văn bản.
C ≡ Pe(modp),0 ≤ P < p.
Văn bản mật sẽ chứa những khối chữ số là các số nguyên tố nhỏ hơn p.
Ví dụ 1.16 Ta cần mã hóa thơng báo sau: VÊ NHA NGAY Giả sử p= 3137 và khóa lập mã e= 31, như vậy
(e, p−1) = (31,3136) = 1.
Trong trường hợp này, m = 2 và ta nhóm văn bản nhận được khi chuyển sang chữ số thành từng nhóm bốn chữ số
2708 1611 0116 1001 2928.
Để khối cuối cùng đủ bốn chữ số, ta thêm chữ X trong văn bản (có thể thay chữ X bằng bất kỳ chữ cái nào không gây hiểu nhầm). Tiếp theo ta chuyển khối P trong văn bản thành các khối C trong văn bản mật theo công thức sau:
C ≡ P31(mod3137),0≤ C < 3137.
Chẳng hạn, để mã hóa khối đầu tiên ta tính: C ≡ 270831(mod3137). Để
tính được C một cách nhanh chóng ta dùng thuật tốn bình phương liên tiếp. Trước tiên ta viết 31 dưới dạng cơ số 2. Tính tốn đơn giản cho ta
27082 ≡ 2095,27084 ≡362,27088 ≡2427,270816 ≡2180 (mod3137).
Từ biểu diễn của 31 dưới dạng cơ số 2, ta được
270831 = (2708.2095.362.2427.2180) ≡ 2450 (mod3137).
Sau khi mã hóa tồn bộ văn bản, ta được văn bản mật cần chuyển là 2450 723 2177 2222 2050.
Để giải mã khối C trong văn bản mật, ta cần biết khóa giải mã d. Đó
modulo p−1. Nghịch đảo đó tồn tại do giả thiết (e, p−1) = 1. Để tìm
lại được khối C trong văn bản, ta chỉ việc nâng khối C lên lũy thừa d
modulo p. Thật vậy,
Cd ≡ (Pe)d ≡Pde ≡ Pk(p−1)+1 ≡ P (modp).
Trong đó de = k(p−1) + 1 đối với số nguyên k nào đó, bởi vì
de ≡ 1(modp−1).
Ví dụ 1.17 Để giải mã một khối trong văn bản mật được mã hóa bằng cách sử dụng modulo p = 3137 và khóa lập mã e = 31, ta cần tìm số
nghịch đảo d của e = 31 theo modulo p−1 (p−1 = 3136). Thuật toán
Euclid mở rộng giúp ta dễ dàng tìm được d. Thật vậy, theo các ký hiệu
của thuật toán Euclid mở rộng, ta đặt: u = 3136, v = 31. Tính tốn theo
thuật tốn đó ta được kết qủa sau đây:
q u1 u2 u3 v1 v2 v3
- 1 0 3136 0 1 31
101 0 1 31 1 -101 5
6 1 -101 5 -6 607 1
5 -6 607 1 31 -3136 0
Như vậy, ta có : 607.31 – 6.3136 = 1 suy ra 607.31 ≡ 1 (mod3136). Vậy
d = 607. Để giải mã khối C ta dùng công thức P ≡ C607(mod3136).
1.7.2 Hệ mã RSA
Hiện nay nhiều tổ chức quân sự, kinh tế, tài chính hay các cơ quan chính phủ khi truyền đi các tin tối mật thường sử dụng một loại mật mã gọi là mật mã công khai, viết tắt là RSA, do ba nhà khoa học Rivest, Shamir và Adleman đề xuất. Ưu điểm nổi bật của mã RSA là khơng cần giữ bí mật
phương pháp mã hố và giải mã cũng như chìa khố mã hố. Chỉ cần giữ bí mật chìa khố giải mã là đủ. Chính vì vậy mà mật mã RSA có tên gọi là mật mã khố cơng khai (public key cryptography).
Ý tưởng
Mật mã khố cơng khai được xây dựng trên cơ sở mã mũ và dựa trên tính khó của bài tốn phân tích các số lớn ra thừa số nguyên tố. Biết một số số nguyên tố nhân với nhau để thu được hợp số thì dễ cịn biết hợp số, phân tích nó ra thành các thừa số ngun tố là rất khó. Giả sử ta cần chuyển một bức điện. Trước tiên ta chuyển các chữ cái thành các số tương ứng theo một từ điển nào đó với một số chẵn chữ số. Chẳng hạn theo từ điển ASCII (American Standart Code for information Interchange) đang được sử dụng rộng rãi trong các mạng thơng tin thì a → 97, g → 71, u → 117...
Để mã hóa một khối văn bảnP, ta lập khốiC trong văn bản mật theo cách sau: Lấy hai số nguyên tố khá lớn p, q, nhân chúng với nhau để được số n= p.q. Chọn một số e sao cho (e, φ(n)) = 1, trong đó φ(n) là hàm Euler
φ(n) = (p−1).(q −1).
Cặp số (e, n) gọi là khố lập mã. Cơng thức mã hóa
E(P) ≡ C ≡Pe(modn),0< C < n.
Khi nhận được văn bản mật C, để tìm lại văn bản P ta cần tính φ(n),
sau đó chọn e và d sao cho: ed ≡ 1(modφ(n)). Công thức giải mã:
D(C) ≡ Cd ≡ (Pe)d ≡ Ped ≡Pkφ(n)
k
P ≡P(modn).
Hàmφ(n) được tính khơng mấy khó khăn khi đã biết cơng thức phân tích ra thừa số nguyên tố của n. Cụ thể là nếu đã biết n = p.q (p, q là hai số ngun tố) thì
Nhưng do bí mật nên việc tìm được d là vơ cùng khó. Cặp số (d, n) gọi là
khoá giải mã.
Mơ tả thuật tốn
- Chọn hai số nguyên tố lớn p và q. Tính n = p.q và m = φ(n) = (p−1).(q −1).
- Chọn 1 ≤e ≤ m−1, sao cho gcd(e, m)=1.
- Tìm d sao cho ed ≡1(modm), giải theo thuật toán Euclid mở rộng .
⇒ Khố cơng khai (Public key) là (e, n).
⇒ Khoá dùng riêng (Private key) là (d, p, q).
Các vấn đề xung quanh thuật toán RSA
Vấn đề chọn p và q
p và q phải là những số nguyên tố lớn (ít nhất là cỡ khoảng 200 chữ số),
p và q phải lớn cỡ xấp xỉ nhau.
Bài tốn tìm số nguyên tố lớn
Một thuật toán để tạo ra tất cả các số ngun tố là khơng tồn tại, tuy nhiên lại có khá nhiều các thuật tốn để kiểm tra xem một số cho trước có phải là số ngun tố hay khơng (Bài tốn kiểm tra tính ngun tố). Vì vậy việc tìm số ngun tố lớn cho RSA là một vịng lặp.
Bước 1: Chọn một số ngẫu nhiên p nằm trong một khoảng có độ lớn u cầu (tính theo bit).
Bước 2: Kiểm tra tính ngun tố của p, nếu là ngun tố thì dừng lại, nếu
khơng thì quay lại Bước 1. Những thuật tốn để kiểm tra tính nguyên tố khơng phải đơn giản, nó địi hỏi độ phức tạp tính tốn khá lớn. Tuy nhiên người ta có thể sử dụng các thuật tốn đốn xem một số có phải là ngun tố hay khơng với một xác suất sai nhất định. Xác suất này càng nhỏ nếu thời gian bỏ ra chạy chương trình càng lớn.
Giải thuật Euclide mở rộng tìm nghịch đảo theo modul n
Chúng ta đã biết thuật tốn Euclide nổi tiếng tìm ước số chung lớn nhất với hai số tự nhiên n1, n2. Việc tính giá trị nghịch đảo của một số w
theo modul n được dùng nhiều trong các bài toán mã hố khố cơng khai. Thuật tốn tìm x = w−1 theo modul n được gọi là thuật toán GCD mở rộng hay Euclide mở rộng. Sở dĩ như vậy là vì khi đi tìm ước số chung GCD(n1, n2) của hai số n1, n2 người ta sẽ tính ln các giá trị a, b
sao cho
GCD(n1, n2) =a.n1 +b.n2.
Như vậy nếu biết (n1, n2) = 1 thì thuật tốn này sẽ cho ta tìm được a, b
thoả mãn a.n1+b.n2 = 1 vàn1 chính là nghịch đảo của a theo modulo n2.