簡體   English   中英

C#中的Rijndael解密

[英]Rijndael decryption in C#

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

密鑰大小-192

塊大小-128

鍵-cmdAj45F37I5ud2134FDg2fF

當我使用下面的代碼時,出現錯誤:字符串大小不規則,有人可以幫助我嗎?

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;

    }

一個(大)問題是使用UTF8.GetBytes()從字符串獲取byte []。 很難控制字節數,也不是很安全。

請改用Rfc2898DeriveBytes.GetBytes() 然后您可以指定所需的長度。

但是,當然,您也必須在加密時執行此操作。
我同意盧克關於四世的言論

您可以在代碼中看到注釋,指出“必須為16個字符”鍵嗎? 您的密鑰對我來說更像是24個字符!

在這種情況下,您將密鑰重新用作IV-仍然不建議采用最佳做法-但IV的大小必須與塊大小匹配,該塊大小設置為128位/ 16字節。

話雖如此,我剛剛描述的問題應該給您錯誤“指定的初始化向量(IV)與該算法的塊大小不匹配” ,而不是“字符串大小錯誤” ,因此這可能是一個紅色鯡魚。

錯誤是因為輸入是64位編碼的。

IV和鍵不一樣。 IV用於腌制。 無論如何,您得到的錯誤是因為輸入是64位編碼的。 這樣做,錯誤就會消失。

var encodedEncryptionKey = 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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM