RandomNumberGenerator vs Aes生成密钥。在使用AES加密时,我应该使用哪个来获取密钥(C#)

时间:2018-03-22 11:17:17

标签: c# encryption random aes

所以我在线检查一些实现,我注意到有些人使用以下方式生成密钥:

        using (var random = RandomNumberGenerator.Create())
        {
            var key = new byte[32];
            random.GetBytes(key);
        }

其他人使用AES类中构建的generateKey方法:

        using (Aes myAes = Aes.Create())
        {
            myAes.GenerateKey();
            var key = myAes.Key;
        }

它们都在System.Security.Cryptography库中,只是想知道它们之间是否存在实际差异,如果是,我应该选择哪一个?

2 个答案:

答案 0 :(得分:5)

两个版本都做同样的事情。 Aes.GenerateKey将使用与第一个示例相同的RandomNumberGenerator.Create()来生成新密钥。

但是我更喜欢使用第二个版本,因为:

1)它表达了非常明确的意图。您正在生成AES密钥,而不仅仅是任意随机字节数组。

2)AES可以有不同的密钥大小。不仅如此,一些密钥大小对AES无效。第一个示例现在仅生成32字节密钥。如果您将其修改为接受密钥大小 - 有人可以将无效(对于AES)密钥大小传递给它。因此,您需要验证传递的大小,以验证它是AES的有效密钥大小。但是,为什么Aes类已经为你做了那个呢?

旁注:不需要拨打GenerateKey,但也不会造成伤害。如果还没有密钥 - 它将在您第一次访问Key属性时生成。

答案 1 :(得分:2)

好问题。两者都使用相同的底层CSPRNG。结果同样安全。

您可以在.NET Reference Source

中查看