2016-03-03 419 views
2

RijndaelManaged是一种算法,AES是标准。当提到AES256时,这是否意味着我在RijndaelManaged中使用的密钥长度必须是256个字符?RijndaelManaged密钥长度是否与AES [密钥长度]相同?

如果我有这样一个关键:

key = "mytestkey"; 

这是只有9个字,这是否意味着我使用AES9?

+0

我认为你需要[阅读此](http://blogs.msdn.com/b/shawnfa/archive/2006/10/09/the-differences-between-rijndael-and-aes.aspx) –

+0

Rijndael的未修改版本与AES支持的密钥大小完全相同,但唯一的区别是Rijndael支持不同的块大小,而AES只有一个固定的块大小。 –

+0

问题是RijndaelManaged的MDN文档没有指定默认的块大小,所以最好指定它。 – zaph

回答

3

埃斯/ Rijndael密钥大小是位,而不是字符; AES256使用256位密钥。你必须给它一个恰好是256位的密钥。 AES标准和Rijndael只接受128,192或256位的密钥大小。

你不应该交换AES和Rijndael。 AES标准来自Rijndael,但它们不完全相同。如果您希望使用AES,请对所有操作使用AES;如果你想使用Rijndael,请使用Rijndael进行所有操作。

"mytestkey"不能直接成为AES256的关键,也不是类似的Rijndael模式;它不是256位长。为了将其用作密钥,您必须将其转换为256位长的字节块。

如果您使用密码,一个典型的方法是使用key stretching,使用散列算法,如PBKDF2Scrypt。 PBKDF代表“基于密码的密钥派生函数”,它基本上就是你正在做的 - 从密码派生密钥。

理论上你也可以只用SHA256(总是有256位输出)来散列密码,并使用该256位块作为AES的密钥;从安全的角度来看,这样做是不明智的,因为预先计算密码SHA散列相对容易。

请记住,如果您使用的密码熵很小,那么加密的安全性会受到影响 - 有人猜测密钥的时间可能会很短。 "mytestkey"熵最多只有42位 - 你只使用小写字母,所以每个地方有26个值,并且有9个地方(9个字符)。因此理论上需要存储的位数是。在这种情况下,你将使用AES256和一个只有〜42位熵的密钥。

我应该注意到,这里给出的建议是从安全角度对如何将密码转换为密钥的不完整处理。如果您想更好地了解如何从密码中正确生成密钥,我建议您从owasp.org上的一些阅读开始,例如Password Storage Cheat Sheet

+0

它需要至少128位,为什么“mytestkey”工作?一切都经过加密和解密没有问题。 – 4thSpace

+1

许多库都是null pad的键,但不正确的做法是不使用*正确的密钥大小。 – zaph