Một số thuật toán trong mật mã công khai

Một phần của tài liệu Các thuật toán cơ bản trong lý thuyết số (Trang 28 - 33)

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 toá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 toá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 quá 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ố đó luôn luôn 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 toá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 toá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 toà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. Đó là số d thỏa mãn de ≡ 1(modp−1), có nghĩa d là một nghịch đảo của e

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 toán theo thuật toán đó ta được kết qủa sau đây: (adsbygoogle = window.adsbygoogle || []).push({});

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ã hoá và giải mã cũng như chìa khoá mã hoá. Chỉ cần giữ bí mật chìa khoá giải mã là đủ. Chính vì vậy mà mật mã RSA có tên gọi là mật mã khoá công khai (public key cryptography).

Ý tưởng

Mật mã khoá 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 toá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ố nguyên 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à khoá 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ố nguyên 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 toá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 .

⇒ Khoá 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 (adsbygoogle = window.adsbygoogle || []).push({});

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 toán tìm số nguyên tố lớn

Một thuật toán để tạo ra tất cả các số nguyên tố là không tồn tại, tuy nhiên lại có khá nhiều các thuật toán để kiểm tra xem một số cho trước có phải là số nguyên tố hay không (Bài toán kiểm tra tính nguyên tố). Vì vậy việc tìm số nguyên 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 yêu cầu (tính theo bit).

Bước 2: Kiểm tra tính nguyên tố của p, nếu là nguyên tố thì dừng lại, nếu không thì quay lại Bước 1. Những thuật toá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 toán khá lớn. Tuy nhiên người ta có thể sử dụng các thuật toán đoán xem một số có phải là nguyên 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 toá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ã hoá khoá công khai. Thuật toá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 luôn 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 toá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.

Một phần của tài liệu Các thuật toán cơ bản trong lý thuyết số (Trang 28 - 33)