Hỏi 1 chút về mã hóa khóa mở (public key cryptography)

Nguyễn Thành Trung
(nt2)

New Member
Trong lý thuyết của Shannon, ông ấy có nói là : mã hóa khóa bí mật (secret key) không thuận tiện khi phân phối khóa. Ví dụ A gửi cho B 1 message đã được mã hóa, B muốn giải được cipher đấy thì phải cần khóa để mở. Tức là A cũng phải chuyển cho B khóa đó 1 cách an toàn để những người khác không biết.
Nhưng nếu dùng phương pháp khóa mở, ví dụ như pp RSA, có 2 khóa mở, có thể cho người khác biết, còn 1 khóa bí mật, người khác không được biết. Lúc giải mã thì vẫn cần khóa đóng này. Vậy việc phân phối khóa này có gì khác so với phân phối khóa bí mật của pp trên?
Tiện thể các bạn có thể cho biết các ứng dụng của pp mã hóa khóa mở này không? Ngoài được sử dụng trong chữ kí điện tử (Digital Signature) ra thì nó còn được ứng dụng ở đâu?
 
Khác nhau cơ bản là trong trường hợp chỉ dùng khóa đóng, A phải gửi cho B khóa để B mở, nhưng thế thì còn gì là bí mật nữa vì khi chuyển khóa đi không an toàn, sẽ bị đánh cắp ngay. Trong khi dùng khóa mở vd. RSA thì, người nhận hay người gửi không cần phải chuyển khóa bí mật đi đâu hết, người gửi dùng public key của người nhận để mã hóa thông điệp, và chỉ có người nhận có secret private key để mở thông điệp mà những ng khác gửi cho mình. An toàn hơn chính là ở chỗ secret key không phải chuyển cho ai hết.

Algorithm của RSA rất đơn giản, dựa trên giả thuyết không có algorithm đủ nhanh để phân tích số cực lớn thành tích thừa số nguyên tố. Bạn trẻ nào ở đây chứng minh được là không có, hoặc tìm ra được algorithm tối ưu thì đó là kết quả cực kỳ quan trọng. Không cần phải đi theo con đường khoa bảng làm gì phí thời gian! :-$

Thiết kế khóa chỉ có 3 bước như sau:
1) Chọn 2 số nguyên tố P, Q khác nhau rất lớn ngẫu nhiên, tính tích N=P*Q và R=(P-1)*(Q-1).
2) Chọn số tự nhiên L nhỏ hơn N sao cho L và R nguyên tố cùng nhau, i.e. d(L,R) =1.
3) Tìm số tự nhiên S sao cho S*L=1 mod R, dĩ nhiên nhờ bước 2) mà tồn tại S.

Public keys là 2 số N và L, còn "secret" private key là số S. Biết (N,L) cho phép mã hóa thông tin, nhưng không có S thì chịu không mở khóa được.

Khi A muốn gửi mã hóa 1 thông điệp tới B, đầu tiên A chuyển thông tin cần gửi cho B thành 1 số, vd. n, và sau đó thông tin mà A sẽ gửi cho B là số m = n^L mod N. Người ngoài có thể đánh cắp số m (dễ dàng) nhưng có m cũng sẽ không thể tìm ra được số n. Còn B biết N,L,S sẽ tìm ra số n ra sao? Đơn giản thôi, vì m^S = n mod N. Chứng minh điều này là một bài tập về nhà cho học sinh chuyên toán! :)

Phải thừa nhận, sau khi nghẫm nghĩ kỹ từng bước, những tên nghĩ ra cái algorithm đơn giản này thông minh thật!! Chú ý là hiện nay N phải có độ dài >= 2048 bit thì mới được coi là an toàn. Nếu N có 512 bit thôi thì có thể break được, tìm ra S, nếu chạy song song trên khoảng 100 PC cùng một lúc trong thời gian ngắn. N mà có 256 bit thì chỉ cần 1 PC cũng tìm ra được S, thời gian để break tăng như hàm mũ với N. Để an toàn thì phải chọn L lớn (>>1) và đặc biệt là private key S là số lớn, hiểu theo nghĩa S~Sqrt(N). Tại sao? Hmmm, lý thuyết số!

Với khả năng ra đời của Quantum Computer (sau vài chục năm nữa) cái RSA algorithm này sẽ không còn an toàn nữa. Thời gian cần thiết để tìm ra S sẽ chỉ tăng như đa thức với chiều dài của N, cho N lớn lên bao nhiêu đi nữa (hàng tỉ bít) vẫn có thể tìm ra khóa S không tốn quá nhiều thời gian.
 
Chỉnh sửa lần cuối:
Bổ sung thêm 1 chút: từ nhiều năm nay người ta cố gắng tìm những thuật toán tối ưu để phân tích các số lớn ra thừa số nguyên tố nhưng vẫn chưa tìm ra được, nên chỉ còn cách dùng những siêu máy tính hoặc dùng sức mạnh của nhiều máy tính. 1 thuật toán đơn giản mà hầu như ai trong chúng ta cũng biết đó là chia số đó (số n) cho các số nguyên tố nhỏ hơn căn hai của n. Theo thống kê thì số các số nguyên tố nhỏ hơn căn 2 của n tiệm cận bằng 2*sqrt(n)/ln(n). Giả sử số n có 100 chữ số ở hệ thập phân thì sẽ có không ít hơn 4*10^42 số nguyên tố nhỏ hơn sqrt(n). Giả sử 1 máy tính có thể thực hiện 1 triệu phép chia trong 1 giây thì để phân tích số n > 10^99 sẽ cần khoảng thời gian là 10^35 năm.:)

Mình xin hỏi tiếp về thuật toán RSA này. Mình nghe nói passwords trong windows được mã hóa bằng thuật toán này có đúng không? Vì thường thì passwords được mã hóa bằng các thuật toán 1 chiều, sử dụng các hash functions, thông thường nhất là thuật toán MD5. Tại sao windows không mã hóa passwords bằng phương pháp này?
 
Back
Bên trên