为什么RijndaelManaged 256位给我“指定密钥不是这个算法的有效大小”错误?

时间:2014-08-25 21:23:45

标签: c# rijndael rijndaelmanaged

我无法使用PHP mcrypt_encrypt进行C#RijndaelManaged加密工作,因为我一直得到"指定密钥不是此算法的有效大小"。

PHP规范使用256位,具有ECB密码模式。我的理解是在ECB模式下不使用Initization Vector。

我们正在使用临时密钥使其在开发项目中工作,继续构建开发应用程序,并且我们将在稍后发布新的安全密钥。

[PHP]
$plaintext = '1~ABCDEFG~1408740350~0~';

for($i = 1; $i <= 32; $i++) { $key .= chr($i); }

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $plaintext, 'ecb', '');


[C#]
string postFormData = "1~ABCDEFG~1408740350~0~";
StringBuilder sb = new StringBuilder();
foreach (var b in Encoding.ASCII.GetBytes(String.Concat(Enumerable.Range(1, 32)))) { sb.AppendFormat("{0}", b); }
postedFormData = RijndaelAES.Encrypt(postedFormData, sb.ToString());

public static string Encrypt(string plainText, string key)
{
    string cipherText;
    var rijndael = new RijndaelManaged()
    {
        Key = Encoding.UTF8.GetBytes(key),
        Mode = CipherMode.ECB,
        BlockSize = 256, //128,
        Padding = PaddingMode.Zeros//, 
        //IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
    };
    ICryptoTransform encryptor = rijndael.CreateEncryptor(rijndael.Key, null);

    using (var memoryStream = new MemoryStream())
    {
        using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
        {
            using (var streamWriter = new StreamWriter(cryptoStream))
            {
                streamWriter.Write(plainText);
                streamWriter.Flush();
            }
            cipherText = Convert.ToBase64String(memoryStream.ToArray());
        }
    }
    return cipherText;
}

1 个答案:

答案 0 :(得分:1)

Rijndael / AES的固定块大小为128(在所有实现中)。您可能需要设置密钥大小,而不是块大小。

此外,将密钥转换为字节的方式非常不寻常(实际上是惊人的)。我不认为你真的了解编码。这是一个重要的研究课题。也许,PHP版本假设字符串是ASCII。在C#中,你可以这样做:

string keyStr = ...;
Debug.Assert(keyStr.Length == (256 / 8));

byte[] keyBytesASCII = Encoding.ASCII.GetBytes(keyStr);
Debug.Assert(keyBytesASCII.Length == (256 / 8));
Debug.Assert(keyBytesASCII.Length == keyStr.Length);

将来您可以使用调试器查看重要值来调试此类问题。我认为你发现你设置的密钥不是预期的长度。