Tôi biết họ phải ngẫu nhiên
Vâng, loại. Chính xác hơn, họ phải không thể phân biệt với ngẫu nhiên.
Mục tiêu khi chọn khóa là đối thủ (âkẻ xấuâ) sẽ không thể tìm thấy khóa. Vì đối thủ có thể biết hệ thống của chúng ta hoạt động như thế nào (Nguyên lý Kerckhoffs), chúng ta cần tìm cách tạo khóa không chỉ phụ thuộc vào tính toán xác định (mà kẻ thù có thể sao chép). Do đó, tất cả các khóa phải phụ thuộc vào thứ gì đó mà kẻ thù không biết. Một thứ như vậy được gọi là giá trị ngẫu nhiên âtrueâ.
Các giá trị ngẫu nhiên có thể được tạo bằng các quy trình vật lý không thể đoán trước khác nhau. Một thiết bị thực hiện một quá trình như vậy được gọi là một phần cứng hoặc trình tạo số ngẫu nhiên âtrueâ (HRNG hoặc TRNG). Gần như tất cả các điện thoại thông minh và PC hiện đại, cũng như ngày càng có nhiều thiết bị nhúng, bao gồm HRNG.
Khi một hệ thống đã được âgieoâ với một giá trị ngẫu nhiên thực sự, nó có thể sử dụng một phép tính xác định được gọi là trình tạo giả ngẫu nhiên an toàn bằng mật mã (CSPRNG) (viết tắt là trình tạo giả ngẫu nhiên) để tạo ra một luồng giá trị ngẫu nhiên thực tế vô hạn. Các giá trị này là ngẫu nhiên theo nghĩa là một đối thủ có khả năng tính toán hữu hạn không thể phân biệt chúng với các giá trị ngẫu nhiên âtrueâ. Trong ngữ cảnh mật mã, trình tạo ngẫu nhiên (RNG) là một CSPRNG được tạo bởi một HRNG.
đó là tất cả các thuộc tính cần thiết?
Mỗi khóa phải không thể phân biệt được với ngẫu nhiên, từ quan điểm của các đối thủ tiềm năng. Điều này có nghĩa là khóa được tạo ngẫu nhiên (như đã giải thích ở trên). Nhưng không phải tất cả các khóa đều được tạo ngẫu nhiên: một số khóa được tính toán một cách xác định từ hỗn hợp các khóa và đầu vào khác. Các quá trình như vậy được gọi là phái sinh khóa. HKDF là một ví dụ về hàm phái sinh khóa. Hàm giả ngẫu nhiên (PRF) có thể là khối xây dựng cho KDF. Ví dụ: khi hai máy tính giao tiếp qua một kênh được mã hóa, chúng thường lấy các khóa giống nhau từ một bí mật được chia sẻ.
âNgẫu nhiênâ, đối với một khóa, có nghĩa là càng gần càng tốt với sự ngẫu nhiên thống nhất giữa tập hợp các khóa có thể. Điều này có nghĩa là gì tùy thuộc vào loại khóa.
Nói chung, mã hóa đối xứng sử dụng các khóa chỉ là một mảng byte và do đó tạo ra một $n$khóa -bit chỉ có nghĩa là tạo $n$ bit ngẫu nhiên và gọi đó là khóa. Ví dụ, điều này đúng với mật mã khối như AES và Camellia, mật mã dòng như Chacha20, thuật toán MAC như HMAC và Poly1305, v.v.
Mã hóa bất đối xứng cổ điển sử dụng các khóa là các số có các thuộc tính nhất định và do đó, việc tạo các khóa như vậy có thể yêu cầu các phép tính bổ sung. Một cách chung để tạo khóa có thể được biểu diễn bằng một $n$chuỗi -bit là để tạo $n$ bit ngẫu nhiên, hãy kiểm tra xem đây có phải là khóa hợp lệ không và nếu không, hãy thử lại. (Điều này giả định rằng cách biểu diễn là duy nhất, tức là không có hai khóa giống hệt nhau có cùng cách biểu diễn.) Cách tiếp cận này hoạt động tốt đối với điển hình ECC khóa, trong đó khóa riêng là một số nằm giữa $1$ và $2^n - một$ với $a \ll 2^n$, vì vậy nó hoạt động tốt để tạo ngẫu nhiên $n$-bit chuỗi và giải thích nó như là một số giữa $0$ và $2^n-1$ và thử lại nếu bạn đạt một trong số ít giá trị không hợp lệ. Một số hệ thống mật mã khác, chẳng hạn như RSA, liên quan đến các quy trình tạo khóa phức tạp hơn nhiều, nhưng ngay cả như vậy, nó vẫn sử dụng "tạo chuỗi bit ngẫu nhiên" và "thử lại nếu giá trị không phù hợp" làm khối xây dựng.