C# AES GCM IV/暂时使用

C# AES GCM IV/暂时使用,c#,encryption,aes,aes-gcm,C#,Encryption,Aes,Aes Gcm,我正在WCF项目中实现AES GCM加密。 在阅读和搜索之后,我发现了这个(第一个类,AESGCM),它似乎写得很好,更新得很好 据我所知,nonce将尽可能独特是非常重要的,我想确保我了解这个类的工作方式 当我过去在CBC模式下使用IV时,有必要保存它以备将来解密,但在所附的示例中,我看到IV(nonce)没有保存 我的问题是,密码文本的nonce部分是否使用以下方法提取: cipherReader.ReadBytes(NonceBitSize / 8) 还是我遗漏了什么,应该保存IV/no

我正在WCF项目中实现AES GCM加密。 在阅读和搜索之后,我发现了这个(第一个类,AESGCM),它似乎写得很好,更新得很好

据我所知,nonce将尽可能独特是非常重要的,我想确保我了解这个类的工作方式

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

我的问题是,密码文本的nonce部分是否使用以下方法提取:

cipherReader.ReadBytes(NonceBitSize / 8)
还是我遗漏了什么,应该保存IV/nonce


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

在链接的代码段中,nonce在密文前面。因此,它是可回收的。丢失nonce意味着丢失数据


在评论中,我看到了一个危险的想法:不以加密安全的方式生成nonce。这不是一个好主意,因为你有可能会以这种方式碰撞nonce。它不必要地削弱了安全性。

IVs和Nonce之间通常的区别不是IV应该是加密安全的,但Nonce的唯一要求是不重用它们吗?也就是说,只要取序列中的下一个数字,你知道序列不会重复,就足以证明使用nonce的算法的安全性了。@Damien_不相信这是真的。但该评论建议使用弱RNG,据说内部状态很小。例如,两个
System.Random
实例将具有相同的种子和输出,概率约为1/int.MaxValue。这将破坏安全性,因为攻击者可以尝试所有int.MaxValue可能的种子。因此,我建议:如果您有任何帮助,请使用加密功能强大的RNG。此外,CodesInChaos也在评论中提到了这一点,如果您忽略代码,您将承担风险:)谢谢。用以下代码替换相关代码是否会产生更好的结果?RandomNumberGenerator rng=新的RNGCryptoServiceProvider();字节[]nonce=新字节[NonceBitSize/8];rng.GetBytes(nonce);对别忘了处理。