AES合法密钥大小是否真的是限制?

Ste*_*nja 9 c# aes aescryptoserviceprovider

AesCryptoServiceProvider.LegalKeySizes字段显示允许的位大小.

但是,我不明白的是,如果这些是真的,我怎么能成功利用2048位密钥长度(256字节)?

我想我的真正问题是,我的密钥是否产生了所请求的大小(大于最大32字节),但是在加密/解密过程中实际只采用了前32字节(256位),从而呈现更大的密钥大小浪费空间?

我不知道是否有一种方法可以实际告知API中暴露的内容......

有什么想法吗?也许我是以错误的方式看待这个?

Maa*_*wes 6

AES可用于3种密钥大小:128,192和256位密钥.基本上如果你能够使用比256位更大的密钥,那么这个库就"撒谎",即较大密钥的某些位被丢弃或以某种方式压缩.例如,PHP mcrypt只是将键的大小缩小到最大可能的大小.

密码学领域中较大的关键"种子"相当普遍.例如,Diffie-Hellman--一种密钥协商算法 - 通常生成一个大于所需密钥大小的秘密.因此,经常出现提取(集中)密钥中的熵量的问题.如果比特被截断,则丢弃那些比特中的熵.

因此,现代密码学中实际使用的是KDF,即密钥派生函数.如果输入 - 种子 - 是密码,则应使用PBKDF(基于密码的KDF).现代PBKDF是PBKDF2,bcrypt,scrypt和Argon2.

如果输入已经是一个密钥 - 如果一起提供足够的熵(随机性)的数据 - 你应该使用KBKDF(基于密钥的KDF).现代KBKDF例如是HKDF.请注意,这些算法需要额外的输入,因此如果没有提供额外的数据,则很可能只是忽略了额外的关键位.

AES-128的加密强度当然是128位.只要这些位与攻击者无法区分,AES-128就应该为实际需要提供足够的安全性.如果您担心量子密码学的突破,可以使用AES-256.


所以答案是:"AES合法密钥大小真的是极限吗?" 答案是肯定的.对于非对称算法(如RSA/DSA),更常见的是2048位密钥大小.对于RSA和DSA,密钥大小实际上相当低,即使实际攻击仍然无法实现.也许密文是使用混合加密加密的.