Khóa (mật mã)

Trong mật mã học, khóa là một đoạn thông tin điều khiển hoạt động của thuật toán mật mã hóa. Nói một cách khác, khóa là thông tin để cá biệt hóa quá trình mã hóa cũng như giải mã. Khóa cũng được sử dụng trong các thuật toán khác trong mật mã học như thuật toán tạo chữ ký số hay hàm băm mật mã.

Với một thuật toán được thiết kế tốt, mã hóa cùng một văn bản với các khóa khác nhau sẽ cho ra các bảng mã hoàn toàn khác nhau. Tương tự, khi giải mã với khóa sai thì kết quả sẽ cho ra một bản rõ hoàn toàn ngẫu nhiên. Trong trường hợp khóa bị thất lạc thì không thể phục hồi lại bản rõ ban đầu với điều kiện là thuật toán đảm bảo chất lượng và độ dài khóa đủ lớn.

==Nhu cầu giữ bí mật==
Khi thiết kế hệ thống an ninh, cần phải giả định rằng kẻ tấn công nắm được các thông tin chi tiết về thuật toán. Điều này được biết đến với tên là nguyên lý Kerckhoff - "chỉ bí mật về khóa đảm bảo an toàn" hay "kẻ thù nắm được các thông tin hệ thống". Lịch sử mật mã học đã khẳng định nguyên lý này: hầu như không thể giữ bí mật về thiết kế các thuật toán được sử dụng rộng rãi. Trái lại, việc giữ bí mật về khóa dễ hơn rất nhiều vì khóa thường chỉ là một đoạn thông tin ngắn và ta dễ dàng thay đổi chúng khi có dấu hiệu bị lộ. Vì thế, an ninh của một hệ thống mật mã hóa thường dựa trên việc giữ bí mật các khóa.

Việc giữ bí mật các khóa là vấn đề khó khăn nhất trong các hệ thống thực tế (Xem thêm: quản lý khóa). Bất kỳ kẻ tấn công nào có được khóa (bằng bất kỳ cách gì, trong nhiều trường hợp do sơ suất của người giữ khóa) cũng có khả năng giải mã các thông tin mật.

Các thuật toán sử dụng chung một khóa cho cả quá trình mã hóa và giải mã được gọi là các thuật toán mã hóa khóa đối xứng. Từ những năm 1970, người ta tìm ra một phương pháp mới dùng hai khóa khác nhau cho 2 quá trình nói trên. Các thuật toán này (thuật toán mã hóa khóa bất đối xứng) cho phép một khóa có thể công bố rộng rãi và giữ bí mật khóa còn lại. Hai khóa được thiết kế sao cho việc tìm ra khóa bí mật là không thể thực hiện được kể cả khi biết khóa công cộng tương ứng. Một người dùng trong hệ thống này có thể công bố khóa công cộng một cách rộng rãi để người khác có thể gửi thông điệp mã hóa cho mình.

=== Độ lớn khóa ===
Đối với hệ thống mật mã hóa sử dụng một lần (one-time pad) thì khóa có độ dài ít nhất bằng độ dài của bản rõ cần mã hóa. Đối với các hệ thống mã hóa khác thì khóa có thể nhỏ hơn văn bản khá nhiều. Tuy nhiên khóa cũng cần đủ dài để kẻ tấn công không thể thử từng khóa một.

Hiện nay (năm 2006), đối với các thuật toán mật mã hóa khóa đối xứng, khóa với độ dài 80 bít được xem là đủ an toàn. Trong thực tế, các hệ thống thường dùng mặc định khóa 128 bít.

Các khóa sử dụng trong các hệ thống mật mã hóa khóa bất đối xứng thường có một cấu trúc toán học nào đó. Chẳng hạn, trong thuật toán RSA, khóa công khai là tích của hai số nguyên tố lớn. Vì vậy khóa đòi hỏi có độ dài lớn hơn đáng kể so với khóa trong các hệ thống khóa đối xứng. Để đạt độ an toàn tương đương với hệ thống đối xứng dùng khóa 128 bít, các hệ thống mã hóa công khai dựa trên bài toán phân tích thừa số và lôgarit rời rạc cần khóa có độ dài khoảng 3072 bít. Mật mã hóa đường cong ellip (ECC) có thể chỉ cần đến khóa có chiều dài nhỏ hơn nhưng các thuật toán này mới được phát triển nên các ước đoán có thể không chính xác. Gần đây hệ thống dạng này với khóa 109 bít đã bị phá vỡ bằng phương pháp tấn công duyệt toàn bộ. Theo những ước lượng chưa được kiểm chứng thì khóa của hệ thống ECC cần có độ dài gấp đôi hệ thống mật mã hóa khóa đối xứng để đạt được độ an toàn tương đương.

Ngoại trừ hệ thống mật mã một lần, an ninh của các hệ thống mật mã đều chưa được chứng minh về toán học (thời điểm năm 2004). Vì vậy, không loại trừ khả năng một phát hiện đột phá nào đó có thể khiến cho các hệ thống trở nên mất hiệu quả.

== Lựa chọn khóa ==
Để tránh khả năng có thể dự đoán được, khóa cần được tạo ra thực sự ngẫu nhiên và chứa đựng đủ lượng entropy. Đây là một vấn đề khó và đã được rất nhiều nghiên cứu đề cập tới (có cả khuyến nghị về vấn đề này: RFC 1750, "Khuyến nghị về tính ngẫu nhiên để đảm bảo an toàn"). Một số hệ điều hành thậm chí có cả những công cụ để thu thập entropy từ các sự kiện ngẫu nhiên, chẳng hạn như sự di chuyển của đầu đọc ổ cứng... Đối với việc tạo ra những lượng thông tin ngẫu nhiên không lớn, việc tung xúc xắc cũng có khả năng cung cấp số ngẫu nhiên đạt chất lượng yêu cầu.

Khi dùng mật khẩu để tạo khóa, một hệ thống được thiết kế tốt sẽ dùng một thuật toán tạo khóa để chèn thêm thông tin rồi đưa về độ dài cần thiết để tạo thành khóa.