我目前在C#中开发了一个小工具,可以让我快速加密我的文件。所以我使用this script看起来对我来说是完美的。但我仍然有一个问题:密钥太短(最多8个字符)。我在RijndaelManaged()文档中读到,密钥的最大大小是256位,所以我应该能够使用64个字符的密钥...(如sha256哈希)
但是每当我尝试增加密钥大小时,我都会得到一个很好的加密失败!#34;即使是9个字符也是如此。我一直在谷歌寻找解决方案一段时间,但没什么用处。
我找到的最好的事情is this。所以我试着改变填充:
RMCrypto.Padding = PaddingMode.ISO10126;
// or
RMCrypto.Padding = PaddingMode.ANSIX923;
但它没有改变任何东西......
答案 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}}