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

C# RijndaelManaged密钥长度是否与AES[密钥长度]相同?,c#,.net,encryption,aes,rijndaelmanaged,C#,.net,Encryption,Aes,Rijndaelmanaged,RijndaelManaged是一种算法,而AES是标准。当提到AES256时,这是否意味着我在RijndaelManaged中使用的密钥长度必须是256个字符 如果我有一把这样的钥匙: key = "mytestkey"; 只有9个字符,这是否意味着我使用的是AES9?Aes/Rijndael密钥大小以位为单位,而不是字符;AES256使用256位密钥。您必须给它一个正好是256位的密钥。AES标准和Rijndael仅接受128、192或256位的密钥大小 您不应该交换AES和Rijndae

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位长的字节块

如果您使用的是密码,一种典型的方法是使用哈希算法,例如或。PBKDF代表“基于密码的密钥派生函数”,基本上就是您正在做的事情——从密码派生密钥

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

请记住,如果您使用的密码的熵非常小,那么加密的安全性就会受到影响——人们猜测密钥可能会很短<代码>“mytestkey”最多有42位熵-您只使用小写字母,因此每个位置有26个值,共有9个位置(9个字符)。因此,理论上需要存储该数据的位数为
log_2(26^9)=42.3
。在这种情况下,您将使用AES256和一个只有~42位熵的密钥


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

我认为您需要了解未修订版本的Rijndael与AES支持的密钥大小完全相同,但唯一的区别是Rijndael支持不同的块大小,而AES只支持单一的固定块大小。问题是RijndaelManaged的MDN文档没有指定默认块大小,因此最好总是指定它。它至少需要128位,为什么“mytestkey”可以工作?所有内容都是加密和解密的,没有任何问题。许多库使用空的pad密钥,但不使用正确的密钥大小是一种不好的做法。