2014-04-23 19 views
7

Trường AesCryptoServiceProvider.LegalKeySizes hiển thị cho bạn kích thước được phép theo bit.Kích thước khóa pháp lý AES có thực sự là giới hạn không?

Tuy nhiên những gì tôi không hiểu là nếu đó là sự thật, làm cách nào tôi có thể sử dụng thành công độ dài khóa 2048 bit (256 byte)?

Tôi cho rằng câu hỏi thực sự của tôi là khóa của tôi có được tạo ra theo kích thước được yêu cầu không (lớn hơn tối đa 32 byte), nhưng chỉ 32 byte đầu tiên (256 bit) thực sự được thực hiện trong quá trình mã hóa/giải mã kích thước khóa lớn hơn là lãng phí không gian?

Tôi không biết liệu có cách nào thực sự nói về những gì được hiển thị trong API ...

Bạn nghĩ gì? Có lẽ tôi đang xem xét điều này một cách sai lầm?

+3

'(new AesCryptoServiceProvider()). Key = new byte [256];' -> "CryptographicException: Khóa được chỉ định không phải là kích thước hợp lệ cho thuật toán này." - Bạn có thể hiển thị mã bạn đang sử dụng với khóa 256 byte không? – Blorgbeard

+0

Tôi đã viết một câu trả lời trực tiếp nhưng tôi đồng ý với Blorgbeard về điều này, tôi không thấy cách 'AesCryptoServiceProvider' có thể được sử dụng với bất kỳ kích thước khóa nào khác với kích thước khóa" hợp pháp ". Điều đó nói rằng, các tài liệu Mickeysoft là - một lần nữa - mơ hồ, đủ để không chỉ định bất kỳ lỗi nào có thể phát sinh. –

+1

Nếu bạn đặt kích thước khóa thành 256 trước, sau đó tạo khóa, API sẽ tạo khóa 256 byte không có lỗi và cho phép bạn sử dụng đúng cách mà không có lỗi. Tôi đã viết một thư viện toàn bộ lớp chức năng sử dụng kích thước khóa 256Byte cho AES và RSA/AES lai để xem nó có hoạt động khi viết chương trình trên nhiều nền tảng hơn không. Và nó ... chỉ giải thích 8 rằng một trong hai khóa hợp pháp là sai hoặc phần lớn khóa không được sử dụng. Im nghiêng để tin sau này. – SteakNinja

Trả lời

5

AES có thể được sử dụng cho 3 kích thước khóa: 128, 192 và 256 bit. Về cơ bản, nếu bạn có thể sử dụng các khóa lớn hơn 256 bit, thì thư viện là "nói dối bạn" tức là một số bit của khóa lớn hơn bị loại bỏ hoặc nén bằng cách nào đó. Ví dụ: PHP mcrypt chỉ cần cắt kích thước của khóa xuống kích thước lớn nhất có thể.

Khóa lớn hơn "hạt giống" khá phổ biến trong thế giới mã hóa. Ví dụ Diffie-Hellman - một thuật toán thỏa thuận chính - thường tạo ra một bí mật lớn hơn kích thước khóa cần thiết. Vì vậy, câu hỏi của giải nén (tập trung) số lượng entropy trong một khóa thường phát sinh. Nếu bit bị cắt ngắn thì entropy trong các bit đó sẽ bị loại bỏ.

Vì vậy, những gì thực sự được sử dụng trong mật mã hiện đại là một KDF, một chức năng dẫn xuất khóa. Nếu đầu vào - hạt giống - là một mật khẩu, bạn nên sử dụng PBKDF (Mật khẩu dựa trên KDF). PBKDF hiện đại là PBKDF2, bcrypt, scrypt và Argon2.

Nếu đầu vào đã là một khóa - dữ liệu cung cấp đủ entropy (ngẫu nhiên) nếu được kết hợp với nhau - bạn nên sử dụng KBKDF (Key Based KDF). Một KBKDF hiện đại là ví dụ HKDF. Lưu ý rằng các thuật toán này yêu cầu đầu vào bổ sung, vì vậy nếu không có dữ liệu bổ sung nào được cung cấp thì rất có thể các bit khóa phụ chỉ đơn giản là bị bỏ qua.

Cường độ mã hóa của AES-128 là và giữ nguyên 128 bit. Miễn là các bit này không thể phân biệt ngẫu nhiên bởi kẻ tấn công, AES-128 should provide enough security for practical needs. AES-256 có thể được sử dụng nếu bạn sợ những đột phá trong Mật mã lượng tử.


Vì vậy, để trả lời: "AES có phải là kích thước khóa pháp lý thực sự là giới hạn không?" câu trả lời là một số điện thoại vang lên có. Kích thước khóa 2048 bit thường được tìm thấy cho các thuật toán không đối xứng như RSA/DSA. Đối với RSA và DSA, kích thước khóa thực sự khá thấp, mặc dù nó vẫn không thể tiếp cận được với các cuộc tấn công thực tế. Có lẽ bản mã đã được mã hóa bằng cách sử dụng hybrid encryption.

+0

Ok để các byte phụ chắc chắn bị bỏ qua? Có lẽ tôi có thể tìm thấy một bài kiểm tra để chứng minh điều này ... có lẽ tạo ra một khóa lớn hơn, sau đó mã hóa với cả kích thước đầy đủ và kích thước hợp pháp tối đa một cách riêng biệt (cùng loại muối) và xem liệu văn bản cypher có giống nhau hay không? – SteakNinja

+0

Tôi không nghĩ rằng chúng bị bỏ qua nếu bạn sử dụng trực tiếp 'AesCryptoServiceProvider'. Mã sẽ tốt đẹp, vâng! Nó có thể sẽ chỉ ra một lỗi mặc dù, xin vui lòng bao gồm API & thông tin thời gian chạy nếu bạn quyết định đăng nó (trong câu hỏi, xin vui lòng). –

+0

Ok tôi đã nhận thấy rằng tài liệu nêu rõ biến để thiết lập khóa là theo bit. Nếu điều này đúng tại sao API trả về số lượng đã nhập vào Byte? 'AES.KeySize = Xbits;' nhưng KeyProduced = Xbytes ... – SteakNinja

1

Bạn có thể sử dụng larger key sizes with Rijndael, thuật toán mã hóa dựa trên AES dựa trên, thường là tối đa một số giới hạn do thư viện xác định. Tuy nhiên, bạn chỉ có thể sử dụng kích thước khóa 128, 192 hoặc 256 bit với AES. Một số triển khai có thể sử dụng các bit X đầu tiên (kích thước khóa là 128, 192 hoặc 256 bit) của một mảng byte hoặc luồng bit (thường là C/C++) nhưng việc triển khai Library Base Library (BCL) không , như @Blorgbeard đề cập trong bình luận của anh ấy.

Chỉnh sửa: Để làm rõ mối quan hệ giữa Rijndael và AES, AES là một đặc điểm kỹ thuật được tạo ra bởi Mỹ National Institute of Standards and Technology (NIST) (FIPS 197 để được chính xác) mà định nghĩa một tập hợp con của Rijndael.AES được bao gồm trong FIPS 140-2, có nghĩa là nó được chấp thuận cho các ứng dụng nhất định của các cơ quan chính phủ Hoa Kỳ.

+1

"dựa trên" có thể sử dụng một số làm rõ ở đây - AES giống hệt với Rijndael, ngoại trừ với kích thước khóa/khối bị giới hạn. –

+0

Không thể sử dụng kích thước khóa * lớn hơn * 256 bit ngay cả với Rijndael, Rijndael sử dụng các khóa 128, 160, 192, 224 hoặc 256 bit, tuy nhiên việc triển khai Rijndael thường chỉ thực hiện khóa AES thay thế. –

Các vấn đề liên quan