所以我在线检查一些实现,我注意到有些人使用以下方式生成密钥:
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库中,只是想知道它们之间是否存在实际差异,如果是,我应该选择哪一个?
答案 0 :(得分:5)
两个版本都做同样的事情。 Aes.GenerateKey
将使用与第一个示例相同的RandomNumberGenerator.Create()
来生成新密钥。
但是我更喜欢使用第二个版本,因为:
1)它表达了非常明确的意图。您正在生成AES密钥,而不仅仅是任意随机字节数组。
2)AES可以有不同的密钥大小。不仅如此,一些密钥大小对AES无效。第一个示例现在仅生成32字节密钥。如果您将其修改为接受密钥大小 - 有人可以将无效(对于AES)密钥大小传递给它。因此,您需要验证传递的大小,以验证它是AES的有效密钥大小。但是,为什么Aes
类已经为你做了那个呢?
旁注:不需要拨打GenerateKey
,但也不会造成伤害。如果还没有密钥 - 它将在您第一次访问Key
属性时生成。
答案 1 :(得分:2)
好问题。两者都使用相同的底层CSPRNG。结果同样安全。
中查看