【问题标题】:What Salt size and position for AES 256?AES 256 的盐大小和位置是多少?
【发布时间】:2013-12-03 07:53:04
【问题描述】:

好久没写加密了,有些东西忘记了。

我记得要让使用相同键的相同数据的输出不同,我想在字节数组的一端对数据进行加盐,然后使用 CBC 模式,以便加盐可以做它的事情.

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

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

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

【问题讨论】:

    标签: c# cryptography aes salt


    【解决方案1】:

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

    AES-256 有 128 位块,所以 IV 应该有 128 位。实现 CBC 模式的典型库具有用于 IV 的特殊参数。您不应该自己将其混入明文中。

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


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

    【讨论】:

    • 嗨 CodesInChaos,我需要知道 IV 才能解密吗?我从来没有真正使用过它,因为我从来没有真正理解过它,一直认为你需要知道 IV 才能解密。
    • @AndrewHoffman 1) 你需要知道 IV 才能解密第一个块。但它不影响以后块的解密。 (对于 CBC,其他模式有所不同)。 2)标准做法是将IV与密文一起以明文形式存储。 IV 不是秘密。
    • 哦,我明白了。我使用它的目的是加密一些数据,并将其发送到网络中,不知道它的去向,然后在稍后的某个时间点取回加密的数据。我没有保留会话,也没有存储数据或 IV。我打算加盐的目的是确保即使数据和密钥相同,包也不同。我隐约开始记得为什么我以前从未使用过 IV .. 有一段时间没有这样做了。那么在 AES 256 中用 salt 代替 IV 时,salt 应该是 16 个字节,并且应该在开头?
    • jbtule's answer 到“在 .NET 中加密/解密字符串”是一个很好的起点。
    • @NullUserException 是的,对于CBC you can decrypt everything except the first block without knowing the IV。 IV 影响每个块的加密,但只影响第一个块的解密。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多