Wednesday, July 06, 2005

Rắc rối hóa chương trình (3)


Hệ thống mật mã khóa công cộng (public key crypto-system, hay PKC) là ý tưởng đột phá của ngành mật mã học (cryptography). Các PKC như RSA hiện nay đóng vai trò thiết yếu trong các hoạt động cần bảo mật máy tính như thương mại điện tử (e-commerce), chữ ký điện tử ( digital signature), vân vân. Whitfield Diffie , Martin Hellman, và Ralph Merkle có thể được coi là cha đẻ của ý tưởng mật mã hóa không cần bí mật này, mặc dù tổ chức GCHQ của Anh nói rằng họ có ý tưởng này trước đó vài năm, nhưng không đăng báo vì là bí mật quốc gia.

Bài báo đầu tiên về đề tài này của Diffie và Hellman đăng năm 1976 (W. Diffie and M. Hellman. New Directions in Cryptography. IEEE Trans. Info. Theory 22(6): 644-654 (1976) ). Tuy nhiên họ đã trình bày ý tưởng này ở một hội nghị vào tháng 6 năm 1975.

"Mật mã hóa không cần bí mật" nghe có vẻ nghịch lý. Chính vì thế mà ý tưởng PKC là một đột phá của thế kỷ 20 trong ngành mật mã học. Trước khi có ý tưởng PKC, để gửi hay lưu trữ một tài liệu mật nào đó, ta cần một khóa bí mật ( secret key - còn gọi là khóa riêng - private key). Khi mật mã hóa tài liệu, ta dùng khóa bí mật. Khi giải mã tài liệu, ta cũng cần nó. Mức độ bảo mật của hệ thống bằng với mức độ bảo mật của khóa này, và trong chừng mực nào đó, mức độ bảo mật của giải thuật mã hóa và giải mã. Hiển nhiên là một giải thuật tốt thì có nhiều người cần dùng, và vì thế ta chỉ có thể giữ bí mật cái khóa riêng thôi, còn giải thuật thì không phải là bí mật.

Khó khăn của hệ thống mật mã khóa riêng (private key crypto-system) kiểu này nằm ở việc phân phối khóa riêng. Nếu một người ở Mỹ muốn gửi tài liệu bí mật cho người ở Việt Nam mà phải mang cái khóa này sang Việt Nam thì mang luôn cái tài liệu mật cho xong. Như vậy, ta cần một hệ thống mật mã mà trong đó người gửi có thể mã hóa và gửi tài liệu bằng cách nào đó mà chỉ có người nhận mới giải mã được, ngoài ra người gửi không cần biết một bí mật nào đó thì mới làm được việc này. Đây là lý do tại sao ta gọi PKC là hệ thống mật mã không cần bí mật.

Ý tưởng của một hệ thống PKC như sau. Người nhận có một cặp khóa D (bí mật) và E (công cộng). Người nhận cho thiên hạ biết khóa E. Để đơn giản, bạn có thể hiểu E như một hàm số hay một chương trình mà cho một thông điệp M thì E(M) là thông điệp M đã được mật mã hóa. Dĩ nhiên việc giải mã ra M từ E(M) là cực kỳ khó, trừ khi ta có D. Ta chỉ cần D(E(M)) = M với mọi M là xong. ( Chú ý rằng cả ED đều có thể xem như các chương trình máy tính. E là chương trình công cộng, còn D là chương trình bí mật.)

Vậy PKC thì liên quan gì đến rắc rối hóa chương trình?