【问题标题】:Is RijndaelManaged key length the same as AES[key length]?RijndaelManaged 密钥长度是否与 AES[密钥长度] 相同?
【发布时间】:2016-03-03 22:32:11
【问题描述】:

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

如果我有这样的钥匙:

key = "mytestkey";

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

【问题讨论】:

  • 我觉得你需要read this
  • Rijndael 的未修改版本与 AES 支持的密钥大小完全相同,但唯一的区别是 Rijndael 支持不同的块大小,而 AES 仅支持单个固定块大小。
  • 问题是 RijndaelManaged 的​​ MDN 文档没有指定默认块大小,所以最好指定它。

标签: c# .net encryption aes rijndaelmanaged


【解决方案1】:

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,使用诸如PBKDF2 或Scrypt 之类的哈希算法。 PBKDF 代表“基于密码的密钥派生函数”,这基本上就是您正在做的事情 - 从密码中派生密钥。

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

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

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

【讨论】:

  • 它至少需要 128 位,为什么“mytestkey”有效?一切都被加密和解密,没有问题。
  • 许多库为空填充键,但不使用完全正确的键大小是一种不好的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2015-04-03
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多