6

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

但是每次我尝试增加密钥大小时,我都会得到一个很好的“加密失败!”,即使是 9 个字符。我一直在谷歌上寻找解决方案,但没有任何用处。

我发现的最好的就是这个。所以我试图改变填充,如:

RMCrypto.Padding = PaddingMode.ISO10126;

// or
RMCrypto.Padding = PaddingMode.ANSIX923;

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

4

2 回答 2

3

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

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

这是一个示例:

您可以在属性中指定您的密钥大小(不要与 混淆BlockSizeRjindaelManaged.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);
于 2016-04-24T17:38:16.260 回答
1

填充是把明文填充到块长度的大小,它与密钥大小无关。

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

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

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

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

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

MSDN 文档

于 2016-04-24T17:29:39.307 回答