【问题标题】:AES GCM IV/nonce usageAES GCM IV/nonce 使用
【发布时间】:2014-05-12 02:05:50
【问题描述】:

我正在 WCF 项目中实施 AES GCM 加密。 经过阅读和搜索,我发现了这个example(第一类,AESGCM),看起来写得很好,更新得很好。

据我了解,nonce 尽可能唯一非常重要,并希望确保我了解此类的工作方式。

当我过去在 CBC 模式下使用 IV 时,有必要将其保存以供将来解密,但在随附的示例中,我看到 IV(nonce)没有保存。

我的问题是密文的 nonce 部分是否使用:

cipherReader.ReadBytes(NonceBitSize / 8)

或者我错过了什么,应该保存 IV/nonce?

另外 - GCM 不需要使用盐吗?

【问题讨论】:

    标签: c# encryption aes aes-gcm


    【解决方案1】:

    在链接的代码段中,随机数被附加到密文中。因此是可以恢复的。丢失 nonce 意味着丢失数据。

    在 cmets 中,我看到了一个危险的想法:不以加密安全的方式生成 nonce。这不是一个好主意,因为那样会冒着碰撞随机数的风险。它不必要地削弱了安全性。

    【讨论】:

    • IV 和 Nonce 之间的通常区别不是 IV 应该是加密安全的,但对 nonce 的唯一要求是您不重复使用它们吗? IE。只需取序列中的下一个数字,您知道该序列不会重复,就足以为使用 nonce 的算法提供安全证明。
    • @Damien_The_Unbeliever 这是真的。但评论建议使用弱 RNG,据说内部状态很小。例如,两个System.Random 实例将具有相同的种子和输出,概率约为 1/int.MaxValue。这会破坏安全性,因为攻击者可以尝试所有可能的 int.MaxValue 种子。因此,我建议:如果您能提供帮助,请使用加密性强的 RNG。
    • 此外,CodesInChaos 已经在 cmets 中提到了这一点,如果您忽略 Codes,后果自负 :)
    • 谢谢。用以下代码替换相关代码会产生更好的结果吗? RandomNumberGenerator rng = new RNGCryptoServiceProvider();字节[] 随机数 = 新字节[NonceBitSize / 8]; rng.GetBytes(nonce);
    • 是的。不要忘记丢弃。
    猜你喜欢
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2016-11-14
    • 2018-07-20
    • 1970-01-01
    • 2017-10-15
    • 2016-06-04
    • 2021-11-15
    相关资源
    最近更新 更多