TL;DR Bởi vì đó là cách chúng được thiết kế. Bạn có thể sử dụng KDF để lấy các khóa chứa tối đa tính ngẫu nhiên có trong tài liệu khóa đầu vào.
Tôi đã nhận thấy rằng các khóa dành cho nguyên mẫu mã hóa được xác thực như AES phải không thể đoán trước và ngẫu nhiên thống nhất để được bảo mật.
Chà, họ cần phải có 128 bit để có bảo mật ~ 128 bit như lời hứa của AES. Về nguyên tắc, bạn cũng có thể tạo, giả sử, 112 bit của khóa ngẫu nhiên, sau đó sử dụng 16 bit có giá trị bằng 0 để tạo khóa 128 bit. Hầu hết các API chỉ chấp nhận byte - tức là bội số của 8 bit, do đó, đó sẽ là 14 byte ngẫu nhiên và 2 byte bằng 0 cho khóa 16 byte. AES, về nguyên tắc, không yêu cầu các khóa được phân phối tốt.
Tôi đã xóa phần này của câu trả lời nó đã được chỉ ra trong cuộc trò chuyện kênh bên rằng đây không phải là trường hợp. Điều đó nói rằng, các cuộc tấn công khóa có liên quan đã biết vào lịch trình khóa sẽ không trực tiếp hoạt động vì chúng cho rằng cuộc tấn công cụ thể yêu cầu một sự thay đổi cụ thể trong các khóa được cung cấp. Tuy nhiên, nếu không phân tích sâu hơn, chúng tôi không thể nói rằng kết quả là an toàn; thêm thông tin có thể được tìm thấy đây.
Giá trị IV và hạt giống cho PRNG cũng phải ngẫu nhiên và không thể đoán trước.
Không cần thiết. Yêu cầu IV là khác nhau đối với từng chế độ hoạt động. Chẳng hạn, CBC yêu cầu IV không thể đoán trước (thường chuyển thành ngẫu nhiên IV). CFB yêu cầu một nonce có cùng kích thước với kích thước khối. Chế độ CTR có thể sử dụng bất kỳ nonce có kích thước nào, miễn là khối bộ đếm không lặp lại. Chế độ GCM thường sử dụng nonce 12 byte. Nonce - số được sử dụng một lần - có thể được chọn ngẫu nhiên, nhưng chúng cũng có thể là số sê-ri chẳng hạn.
Câu hỏi của tôi là: Các giá trị ngẫu nhiên và không thể đoán trước đó khác với các giá trị có thể dự đoán chứa toàn bộ từ tiếng Anh, chẳng hạn như (như verysecretkey123456) như thế nào?
Chúng thường được tạo bởi một trình tạo số ngẫu nhiên an toàn được gieo hạt tốt (CSPRNG hoặc DRBG). Hoặc chúng có nguồn gốc từ thông tin khác. Chẳng hạn, chúng có thể được tạo bằng cách sử dụng thỏa thuận khóa, thường được theo sau bởi hàm dẫn xuất khóa dựa trên khóa (KBKDF).
Các khóa thực sự cũng có thể được tạo từ mật khẩu bằng PBKDF.Các chức năng đó cũng yêu cầu muối và hệ số công việc (và có thể là các tham số khác) để giảm thiểu nguy cơ kẻ tấn công đoán được mật khẩu. Trừ khi có các biện pháp đối phó khác, kế hoạch vẫn có thể không an toàn vì mật khẩu thường dễ đoán.
"verysecretkey123456" thường không được coi là khóa, nó sẽ được coi là mật khẩu hoặc cụm mật khẩu. Việc nó là một chuỗi chứ không phải nhị phân là đủ gợi ý cho điều đó.
Tôi cho rằng từ quan điểm của thuật toán, điều đó không thành vấn đề (miễn là độ dài khóa là chính xác),
Đúng, mặc dù AES yêu cầu một chuỗi bit làm khóa, vì vậy, để sử dụng nó, trước tiên bạn phải mã hóa mật khẩu hoặc cụm mật khẩu. Lưu ý rằng ví dụ: Các khóa DES có các bit chẵn lẻ trong khóa được mã hóa, vì vậy không phải tất cả các khóa chỉ nhận các bit ngẫu nhiên. Mặc dù vậy, các mật mã hiện đại hơn DES - bao gồm cả AES - thường được thiết kế để lấy các khóa hoàn toàn ngẫu nhiên.
nhưng những kẻ tấn công có thể đoán các khóa/mật khẩu có thể dự đoán dễ dàng hơn vì chúng thử các khóa/mật khẩu yếu trước. Tôi có đúng không?
Vâng, đó thường được gọi là tấn công từ điển khi họ thử những từ cụ thể. Tất nhiên, họ có thể kiểm tra các khóa rất nhỏ một cách riêng biệt và các cuộc tấn công từ điển có thể được tăng cường bằng các thủ thuật khác.
Và ngẫu nhiên thống nhất chỉ có ý nghĩa khi các khóa được tạo nhiều lần? Nếu vậy, điều gì sẽ xảy ra khi chúng ta sử dụng các khóa ngẫu nhiên không đồng nhất?
Không, như đã đề cập trong câu trả lời khác các cuộc nói chuyện ngẫu nhiên thống nhất về quá trình tạo, không phải kết quả như vậy. Nếu bạn có các khóa ngẫu nhiên không đồng nhất thì có khả năng kẻ thù có thể đoán được chúng - ít nhất là nhiều khả năng hơn nếu các khóa là ngẫu nhiên đồng nhất.
Theo các nguyên tắc Kerckhoff, chúng tôi thường cho rằng những kẻ tấn công biết cách tạo khóa hoặc mật khẩu, do đó, từ đó chúng có thể đoán được sự phân phối.