C#

时间:2016-04-24 17:19:49

标签: c# encryption rijndael symmetric-key

我目前在C#中开发了一个小工具,可以让我快速加密我的文件。所以我使用this script看起来对我来说是完美的。但我仍然有一个问题:密钥太短(最多8个字符)。我在RijndaelManaged()文档中读到,密钥的最大大小是256位,所以我应该能够使用64个字符的密钥...(如sha256哈希)

但是每当我尝试增加密钥大小时,我都会得到一个很好的加密失败!#34;即使是9个字符也是如此。我一直在谷歌寻找解决方案一段时间,但没什么用处。

我找到的最好的事情is this。所以我试着改变填充:

RMCrypto.Padding = PaddingMode.ISO10126;

// or
RMCrypto.Padding = PaddingMode.ANSIX923;

但它没有改变任何东西......

2 个答案:

答案 0 :(得分:2)

Rjindael的密钥大小可供选择。它必须是128位,192位或256位。它不能是,例如,9个字节或18个字节或36个字节。它必须严格为16个字节,24个字节或32个字节。

此外,您应该先指定您的密钥大小,然后才能正确使用该类。虽然允许128位和192位密钥大小,但您不能将密钥大小指定为128位但使用192位密钥。您指定的密钥大小必须与您使用的密钥大小相匹配。

这是一个如何操作的示例:

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

RMCrypto.KeySize = 256;

然后byte []中的密钥大小应与上面密钥的大小匹配:

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);

答案 1 :(得分:1)

填充用于将明文填充到块长度的大小,它与密钥大小无关。

在Rijndael中,您只能使用长度为128,160,192,224或256位的密钥。 (AES-128 - > 128位密钥,AES-256 - > 256位密钥。两者的块长度仍然是128。

你无法轻易改变密码的密钥长度。通常,您仍然使用密钥派生函数(在术语中使用散列函数)从密码字符串中获取128位(或您需要的任何大小)密钥。

简而言之,您误解了填充以及您尝试使用的密码的密钥长度。如果您想要任意长度的密码字符串,请使用密钥派生函数。您发布的第一个链接中的代码使用例如Rfc2898DeriveBytes课程。MSDN documentation

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

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

{{3}}