C# Rijndael键大小(C)#

C# Rijndael键大小(C)#,c#,encryption,rijndael,symmetric-key,C#,Encryption,Rijndael,Symmetric Key,我目前正在用C语言开发一个小工具,它可以让我快速加密我的文件。所以我用了看起来很适合我的。但我仍然有一个问题:密钥太短(最多8个字符)。我在RijndaelManaged()文档中读到密钥的最大大小是256位,所以我应该能够使用64个字符的密钥。。。(比如sha256散列) 但每次我尝试增加密钥大小时,都会得到一个不错的“加密失败!”,即使是9个字符。我在谷歌上寻找解决方案已经有一段时间了,但没有什么有用的 我找到的最好的东西。所以我试着改变填充物,比如: RMCrypto.Padding =

我目前正在用C语言开发一个小工具,它可以让我快速加密我的文件。所以我用了看起来很适合我的。但我仍然有一个问题:密钥太短(最多8个字符)。我在RijndaelManaged()文档中读到密钥的最大大小是256位,所以我应该能够使用64个字符的密钥。。。(比如sha256散列)

但每次我尝试增加密钥大小时,都会得到一个不错的“加密失败!”,即使是9个字符。我在谷歌上寻找解决方案已经有一段时间了,但没有什么有用的

我找到的最好的东西。所以我试着改变填充物,比如:

RMCrypto.Padding = PaddingMode.ISO10126;

// or
RMCrypto.Padding = PaddingMode.ANSIX923;

但是它没有改变任何东西…

Padding用于将明文填充到块长度的大小,它与keysize无关

在Rijndael中,只允许使用长度为128、160、192、224或256位的密钥。(AES-128-->128位密钥,AES-256-->256位密钥。两种密钥中的块长度仍为128)

您不能简单地更改密码的密钥长度。通常您会使用密钥派生函数(术语中使用哈希函数)从密码字符串中获取128位(或您需要的任何大小)密钥

简言之,您误解了要使用的密码的填充和密钥长度。如果需要任意长度的密码字符串,请使用密钥派生函数。您发布的第一个链接中的代码使用例如类

要设置密钥长度,请首先更改属性
.KeySize
,然后设置密钥

RijndaelManaged rijndaelCSP = new RijndaelManaged();
rijndaelCSP.KeySize = 256;
//derive key from password and set as .Key.

Rhindael的密钥大小不能自由选择。它必须是128位、192位或256位。比如说,它不能是9字节、18字节或36字节。它必须严格为16字节、24字节或32字节

此外,在正确使用该类之前,应该首先适当地指定密钥大小。虽然128位和192位的密钥大小都是允许的,但是您不能将密钥大小指定为128位,而使用192位密钥。指定的密钥大小必须与使用的密钥大小匹配

这是一个示例,说明了您是如何做到这一点的:

您可以在
RjindaelManaged.KeySize
属性中指定密钥大小(不要与
BlockSize
混淆):

RMCrypto.KeySize = 256;
然后字节[]中的密钥大小应与上面的密钥大小匹配:

byte[] key = new byte[]{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; 
RMCrypto.Key = key;
确保使用看起来像随机噪声的密钥以获得安全性

当前您的密钥太短:

string password = @"myKey123";
byte[] key = UE.GetBytes(password);

Rhindael密钥大小不能自由选择。它必须是128位、192位或256位。它不能是9字节、18字节或36字节。它必须严格为16字节、24字节或32字节。此外,在正确使用该类之前,应该首先指定密钥大小。虽然128位和192位的密钥大小都是允许的,但是您不能将密钥大小指定为128位,而使用192位密钥。指定的密钥大小必须与使用的密钥大小匹配。指定密钥大小和指定/使用密钥时,请检查/发布代码。@ArtjomB。我建议进行必要的更新,以便更恰当地回答问题。好的,我理解。我想使用256位密钥,但我不知道在哪里指定le key lengh。你能告诉我该把它写在哪里吗?@ArtjomB。我想建议对这个问题进行修改。好的,谢谢你的回答。有没有简单的方法可以修改代码,使其使用128或256位密钥?我添加了一些经过编辑的代码,它只是在Rijndael对象的
.KeyLength
属性中。@ArtjomB。我有一个问题,在设置了
KeyLength
之后,它将
键更改为绝对随机键,从而有效地使先前的键设置无效,这就是为什么我认为必须这样。非常感谢!我刚刚替换了byte[]key=UE.GetBytes(密码);通过你的代码,它可以工作@没问题。一旦找到问题,解决方案自然更容易提出。你也可以看看其他Rhindael的帖子。。。您的更新实际上很关键。@ArtjomB。更新。我错误地将BlockSize作为KeySize,而BlockSize实际上是您一次要处理的数据字节数。KeySize应该是要使用的,而不是您提到的BlockSize。@ArtjomB。同意,这个例子非常简单。仍然有一个问题。。。字节[]键=新字节[]{0x00、0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08、0x09、0x0A、0x0B、0x0C、0x0D、0x0E、0x0F、0x00、0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08、0x09、0x0A、0x0B、0x0C、0x0D、0x0E、0x0F};这是一把固定的钥匙,我需要换一下。。。这就是为什么byte[]key=UE.GetBytes(密码);使用