Kích thước khóa cho AES được chọn là 256 vì đó được coi là kích thước khóa tối thiểu có thể bảo vệ chống lại cuộc tấn công vũ phu - tức là $2^{256}$ cố gắng.
Điều đó không đúng, $2^{128}$ hoặc - chính xác hơn - kích thước khóa 128 bit cho $2^{127}$ cố gắng ở mức trung bình được coi là nhiều, chắc chắn chống lại bất kỳ cuộc tấn công thực tế nào.
Tuy nhiên, trong thực tế, đối với nhiều ứng dụng, mật khẩu do người dùng chọn được sử dụng để lấy khóa kích thước 256 bằng KDF. Giả sử ứng dụng yêu cầu mật khẩu 8 ký tự - đó là mật khẩu 64 bit - vì vậy lực lượng vũ trang giảm xuống còn $2^{64}$ cố gắng. Và nó có thể còn giảm nhiều hơn vì một byte từ một mật khẩu thông thường có entropy nhỏ hơn nhiều so với một byte từ một khóa.
64 bit là một hy vọng hão huyền, mật khẩu do con người tạo ra trung bình đến khoảng 40 bit. Tất nhiên, ngay cả những mật khẩu 8 ký tự được lựa chọn kỹ lưỡng cũng sẽ thường sử dụng một tập hợp con của ASCII, mà bản thân nó là một tập hợp con của tất cả các giá trị byte có thể. Với tất cả 24 giá trị đặc biệt thường được sử dụng, tôi nhận được tới 86 giá trị trong số 256, tức là $log_2(86) \khoảng 6,43$ bit entropy trên mỗi byte, hoặc $\khoảng 51,41$ bit cho 8 ký tự như vậy. Nhưng đó chỉ là khi phân phối hoàn hảo được giả định và con người rất tệ trong việc tạo ra các giá trị ngẫu nhiên.
Lực lượng vũ phu có thể được thử theo byte khôn ngoan hơn là khôn ngoan theo bit, do đó làm giảm lực lượng vũ phu xuống thậm chí còn thấp hơn $2^{64}$ cố gắng.
Thông thường, bạn sẽ cố gắng chống lại các mật khẩu đã biết trước đó từ các cơ sở dữ liệu bị hỏng hoặc các cuộc tấn công từ điển. Bạn sẽ không cố gắng dù muốn dù không.Các cuộc tấn công khác có thể xảy ra nếu quá trình triển khai bị hỏng, chẳng hạn như nếu không có muối nào được sử dụng trong dẫn xuất khóa.
Vì vậy, điều này có nghĩa là AES256 với mật khẩu thậm chí 32 ký tự sẽ yếu hơn AES256 với khóa được tạo ngẫu nhiên.
Đúng. Mặt sau của khăn ăn sẽ cho bạn thấy rằng bạn đang thiếu $16 \times 1,5 = 24$ bit tại ít nhất.
Vậy tại sao đây không phải là một mối quan tâm? Hay tôi đang thiếu một cái gì đó?
Nó là một to lớn mối quan tâm, nói chung bạn sẽ cố gắng và tránh sử dụng mật khẩu. Nếu không, bạn sẽ sử dụng Hàm dẫn xuất khóa dựa trên mật khẩu áp dụng kéo dài khóa, chẳng hạn như một trong các biến thể Argon2 (PBKDF2, scrypt và bcrypt có thể được biết đến nhiều hơn). Nhưng những điều này chỉ cung cấp một sự bảo vệ nhỏ cho mỗi dẫn xuất khóa. Đó là khoảng 20 bit cho một triệu lần lặp lại (như $log_2(1.000.000)$ là gần 20). Nó chắc chắn sẽ không nâng bạn lên $2^{128}$ cho mật khẩu chung; $40 + 20 = 60$ bit, vì vậy việc phá vỡ mã hóa sẽ rất tốn kém, nhưng không khả thi.
Khi không thể tránh mật khẩu, bạn nên sử dụng trình quản lý mật khẩu, ví dụ: sử dụng. Mật khẩu gồm 12 ký tự được tạo ngẫu nhiên (có thể yêu cầu phải có một số ký hiệu, phòng trường hợp bạn không may mắn). Điều đó sẽ không giúp bạn đạt được gần 128 bit, nhưng nó sẽ đủ để ngăn chặn bất kỳ ai cố gắng sử dụng vũ lực hoặc các kỹ thuật tương tự. Tất nhiên, cũng có thể sử dụng 32 ký tự hex ngẫu nhiên và chỉ cần lưu trữ một khóa, giả sử rằng không có giới hạn về kích thước mật khẩu.
Một thủ thuật đơn giản cho thấy bạn có thể sử dụng $$l_p = \bigg\lceil {l_k - \log_2(i) \over log_2(N)} \bigg\rceil$$ như một cách để biết số lượng ký tự cho mỗi mật khẩu, vì vậy giả sử chúng tôi sử dụng các giá trị ở trên: $$\bigg\lceil {128 - \log_2(1.000.000) \over \log_2(86)} \bigg\rceil = \bigg\lceil {{128 - 20} \over 6,43} \bigg\rceil = 17$$ mật khẩu ký tự mở rộng để đạt 128 bit bằng cách sử dụng KDF với 1.000.000 lần lặp lại, giả sử nó hoàn toàn ngẫu nhiên.
Một cách để tránh điều này là sử dụng mã hóa khóa chung và giữ an toàn cho khóa riêng.Một bước để bảo vệ khóa riêng được sử dụng để giải mã có thể là mã hóa dựa trên mật khẩu, nhưng bạn có thể bắt đầu bằng cách giữ nó trên thẻ nhớ chẳng hạn để kẻ tấn công không có quyền truy cập vào nó khi không cần thiết. Tất nhiên có nhiều cách khác để lưu trữ khóa an toàn.
Lưu ý rằng đây không phải là vấn đề khi có thể thực hiện các biện pháp đối phó. Ví dụ. mã PIN thường chỉ có 4-6 chữ số, nhưng thực tế là bạn chỉ có thể thử ba lần để bảo vệ mã đó trước các cuộc tấn công (mã PUK thường lớn hơn nhiều, vì chúng thường không chặn, vì điều đó có thể dẫn đến tấn công từ chối dịch vụ tấn công). Tuy nhiên, ví dụ: mã hóa tập tin tấn công ngoại tuyến nói chung có thể được giả định.