AES 256 的盐大小和位置是多少?

And*_*man 3 c# cryptography aes salt

我有一段时间没有写加密了,忘记了一些东西。

我记得为了让使用相同密钥的相同数据的输出不同,我想在字节数组的一端对数据加盐,然后使用 CBC 模式,以便盐可以发挥作用。

但是我不记得加密的方向。盐应该放在位置0,然后要加密的数据放在它后面,还是盐放在最后?我知道当盐是链中的第一个块时,CBC 模式效果最好。

另外,AES 256 的块大小是多少?wiki 文章说所有 AES 都使用 128 位块大小,并且 256 部分仅与密钥长度相关。那么 AES 256 的盐应该是 16 字节还是 32 字节?

我使用的是 AesCryptoServiceProvider,而不是 RijndaelManaged。

Cod*_*aos 5

首先,在分组密码的上下文中,我们通常将随机每次加密值初始化向量(IV)称为“盐”。

AES-256 有 128 位块,因此 IV 应该有 128 位。实现 CBC 模式的典型库有一个特殊的 IV 参数。您不应该自己将其混合到明文中。

AesCryptoServiceProvider实例化时默认创建一个新的随机 IV。您只需将其与密文一起存储并在解密之前将其恢复即可。由于您需要 IV 来开始解密,因此我更喜欢将其放在密文的开头。但 IV 的存储方式和位置对安全性没有影响。


除了您的问题之外的附加提示:在密文上添加 MAC(例如 HMAC-SHA-2)。请务必在包括 IV 的密文(先加密后加密)上进行计算,而不是在明文上进行计算(先加密后加密)。否则,主动攻击者通常可以使用填充预言机来解密消息。不要忘记使用恒定时间比较函数进行 MAC 验证。

  • @NullUserException是的,对于[CBC,您可以在不知道IV的情况下解密除第一个块之外的所有内容](http://crypto.stackexchange.com/questions/2865/why-does-cbc-decryption-with-a-wrong-iv -仍然给出可读结果)。IV 影响每个块的“加密”,但仅影响第一个块的“解密”。 (3认同)