RijndaelManaged 密钥长度是否与 AES [密钥长度] 相同?

Is RijndaelManaged key length the same as AES[key length]?

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

如果我有这样的钥匙:

key = "mytestkey";

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

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

您不应互换 AES 和 Rijndael。 AES 标准源自 Rijndael,但它们并不完全相同。如果您希望使用 AES,请将 AES 用于所有操作;如果您想使用 Rijndael,请使用 Rijndael 进行所有操作。

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

如果您使用密码,一种典型的方法是使用 key stretching, using hash algorithms such as PBKDF2 or Scrypt。 PBKDF 代表 "Password-based key derivation function",这基本上就是您正在做的事情 - 从密码中导出密钥。

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

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

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