Расшифровка Rijndael в 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;

    }

person Assaf    schedule 22.07.2010    source источник
comment
Что говорит трассировка стека? Какая строка кода здесь виновата?   -  person John Leidegren    schedule 22.07.2010
comment
Не могли бы вы предоставить нереальный, но должен работать образец для параметра-значения, чтобы его можно было протестировать?   -  person Tuomas Hietanen    schedule 22.07.2010


Ответы (3)


Одна (большая) проблема заключается в использовании UTF8.GetBytes() для получения byte[] из строки. Трудно контролировать количество байтов, и это не очень безопасно.

Вместо этого используйте Rfc2898DeriveBytes.GetBytes(). И тогда вы можете указать желаемую длину.

Но, конечно, вы должны делать это и при шифровании.
И я согласен с замечаниями Люка о IV

person Henk Holterman    schedule 22.07.2010

Вы видите комментарий в своем коде, в котором говорится, что ключ "должен быть 16 символов"? Ваш ключ больше похож на 24 символа для меня!

В этом случае вы повторно используете ключ в качестве IV - в любом случае это не рекомендуется, - но размер IV должен соответствовать размеру блока, который установлен на 128 бит/16 байт.

Сказав это, проблема, которую я только что описал, должна привести к ошибке "Указанный вектор инициализации (IV) не соответствует размеру блока для этого алгоритма", а не "string size illigle", так что это может быть отвлекающим маневром.

person LukeH    schedule 22.07.2010

Ошибка возникает из-за того, что ввод закодирован в 64-битном коде.

IV и ключ не то же самое. IV для засолки. В любом случае ошибка, которую вы получаете, связана с тем, что ввод закодирован в 64-битной кодировке. так сделайте это и ошибка уйдет.

var decodedEncryptionKey= Base64Decode(encryptionKey);

ключ var = 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);
    }
person Blue Clouds    schedule 30.07.2015