2

我需要使用 Rijndael 和这些值解密字符串:

密钥大小 - 192

块大小 - 128

键 - cmdAj45F37I5ud2134FDg2fF

当我使用下面的代码时,我收到一个错误:string size illigle,谁能帮助我?

public static string DecryptRijndael(string value, string encryptionKey)
    {

            var key = Encoding.UTF8.GetBytes(encryptionKey); //must be 16 chars 
            var rijndael = new RijndaelManaged
            {
                BlockSize = 128,
                IV = key,
                KeySize = 192,
                Key = key
            };

            var buffer = Convert.FromBase64String(value);
            var transform = rijndael.CreateDecryptor();
            string decrypted;
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write))
                {
                    cs.Write(buffer, 0, buffer.Length);
                    cs.FlushFinalBlock();
                    decrypted = Encoding.UTF8.GetString(ms.ToArray());
                    cs.Close();
                }
                ms.Close();
            }

            return decrypted;

    }
4

3 回答 3

3

一个(大)问题是使用 UTF8.GetBytes()从字符串中获取字节[]。字节数很难控制,也不是很安全。

改为使用Rfc2898DeriveBytes.GetBytes()。然后您可以指定所需的长度。

但当然,您在加密时也必须这样做。
我同意卢克关于 IV 的评论

于 2010-07-22T07:43:16.227 回答
2

您能在代码中看到“必须为 16 个字符”的注释吗?你的钥匙在我看来更像是 24 个字符!

在这种情况下,您将重新使用密钥作为 IV——无论如何都不推荐最佳实践——但 IV 的大小必须与设置为 128 位/16 字节的块大小匹配。

话虽如此,我刚刚描述的问题应该给你错误“指定的初始化向量(IV)与此算法的块大小不匹配”,而不是“字符串大小illigle”,所以这可能是一个红鲱鱼。

于 2010-07-22T06:00:25.847 回答
1

错误是因为输入是 64 位编码的。

IV和key不一样。IV用于盐腌。无论如何,您得到的错误是因为输入是 64 位编码的。这样做,错误就会消失。

var decodedEncryptionKey= Base64Decode(encryptionKey);

var key = Encoding.UTF8.GetBytes(decodedEncryptionKey);

这是完整的代码:

 private string decyptInit(string toBeDecrypted, string key, string initVector)
    {
        var keyByte = Encoding.Default.GetBytes(key);
        var decodedIV = Base64Decode(initVector);
        var iv = Encoding.Default.GetBytes(decodedIV);

        var rijndael = new RijndaelManaged
        {
            BlockSize = 128,
            IV = iv,
            KeySize = 192,
            Key = keyByte
        };

        var buffer = Convert.FromBase64String(toBeDecrypted);
        var transform = rijndael.CreateDecryptor();
        string decrypted;
        using (var ms = new MemoryStream())
        {
            using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write))
            {
                cs.Write(buffer, 0, buffer.Length);
                cs.FlushFinalBlock();
                decrypted = Encoding.UTF8.GetString(ms.ToArray());
                cs.Close();
            }
            ms.Close();
        }

        return decrypted;
    } public static string Base64Decode(string base64EncodedData)
    {
        var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
        return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
    }
于 2015-07-30T11:38:18.003 回答