ali_heidari_ Ответов: 2

расшифровка с помощью алгоритма rijndeal дает ошибку заполнения


привет...
я использую rijndeal для шифрования и дешифрования некоторых данных! но это дает мне эту ошибку :
Padding is invalid and cannot be removed.

я много искал, но ничего не помогло мне решить эту ошибку! это мои шифровальные/дешифровальные коды:

public string Encrypt(string text)
    {

        mainRM = new System.Security.Cryptography.RijndaelManaged();
        mainRM.BlockSize = 256;
        mainRM.KeySize = 256;
        memorystream = new System.IO.MemoryStream();
        ICryptoTransform icrypt = mainRM.CreateEncryptor(key, iv);
        CryptoStream cryptstream = new CryptoStream(memorystream, icrypt, CryptoStreamMode.Write);
        cryptstream.FlushFinalBlock();
        System.IO.StreamWriter sw = new System.IO.StreamWriter(cryptstream);
        sw.Write(text);
        return Convert.ToBase64String(memorystream.ToArray());
    }

    public string Decrypt(string CryptedText)
    {
        string custinfo;
        System.IO.StreamReader streamreader;
        mainRM = new RijndaelManaged();
        mainRM.BlockSize = 256;
        mainRM.KeySize = 256;
        memorystream = new System.IO.MemoryStream(Convert.FromBase64String(CryptedText));
        ICryptoTransform icrypt = mainRM.CreateDecryptor(key, iv);
        memorystream.Position = 0;
        CryptoStream cryptstream = new CryptoStream(memorystream, icrypt, CryptoStreamMode.Read);
        cryptstream.FlushFinalBlock();
        streamreader = new System.IO.StreamReader(cryptstream);
        custinfo = streamreader.ReadToEnd();
        return custinfo;
    }


кто-нибудь может мне помочь?

StianSandberg

Почему вы изменяете размер блока и размер ключа?

ali_heidari_

вы имеете в виду, что я оставляю Blocksize и Keysize в значении по умолчанию?

StianSandberg

да. Знаете ли вы, почему вы изменяете эти значения?

ali_heidari_

этот алгоритм сделает данные в несколько меньших блоков! размер блока устанавливается продолжительностью небольших блоков. Keysize устанавливает размер значения ключа зашифрованных данных! так ведь?

StianSandberg

да, но зачем вам менять эти ценности?

ali_heidari_

может быть, я и не должен этого делать, но когда я пытаюсь оставить их по умолчанию, мои зашифрованные данные-это какие-то свободные пространства, пустые! когда я расшифровываю resault-это пустая строка! ну и каково же ваше решение?

charles henington

iv rijndael должен быть установлен на 16, где ключ может быть установлен на 16 или 32, никогда не было причин менять размер блока, я предоставлю несколько методов шифрования и дешифрования, которые будут принимать пароль для защиты данных

ali_heidari_

когда я устанавливаю их dnt, я получаю эту ошибку : указанный вектор инициализации (IV) не соответствует размеру блока для этого алгоритма.

charles henington

вы должны установить в ИЖ К 16 и ключ на 16 либо 32 0г

public string Encrypt128(строковые данные, строковый пароль)
{
byte[] clearBytes = System.Text.Encoding.Юникод.GetBytes(Данные);


PasswordDeriveBytes pdb = новый PasswordDeriveBytes(пароль,


новый байт[] { 0x00, 0x01, 0x02, 0x1C, 0x1D, 0x1E, 0x03, 0x04, 0x05, 0x0F, 0x20, 0x21, 0xAD, 0xAF, 0xA4 });
MemoryStream ms = Новый Поток памяти();

Rijndael АЛГ = Rijndael.Создавать();
АЛГ.Ключ = pdb.GetBytes(16);

АЛГ.IV = pdb.GetBytes(16);
CryptoStream cs = новый CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Писать);

cs.Write(clearBytes, 0, clearBytes.Длина);
КС.Рядом();
byte[] encryptedData = ms.Метод toArray();
вернуть обменять.ToBase64String(encryptedData);


}
или вы также можете использовать

public string Encrypt256(строковые данные, строковый пароль)
{
byte[] clearBytes = System.Text.Encoding.Юникод.GetBytes(Данные);


PasswordDeriveBytes pdb = новый PasswordDeriveBytes(пароль,


новый байт[] { 0x00, 0x01, 0x02, 0x1C, 0x1D, 0x1E, 0x03, 0x04, 0x05, 0x0F, 0x20, 0x21, 0xAD, 0xAF, 0xA4 });
MemoryStream ms = Новый Поток памяти();

Rijndael АЛГ = Rijndael.Создавать();
АЛГ.Ключ = pdb.GetBytes(32);

АЛГ.IV = pdb.GetBytes(16);
CryptoStream cs = новый CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Писать);

cs.Write(clearBytes, 0, clearBytes.Длина);
КС.Рядом();
byte[] encryptedData = ms.Метод toArray();
вернуть обменять.ToBase64String(encryptedData);


}

2 Ответов

Рейтинг:
16

StianSandberg

Rijndael/AES-это блочный шифр. Он шифрует данные в 128-битных (16 символов) блоках. Криптографическое заполнение используется для того, чтобы убедиться, что последний блок сообщения всегда имеет правильный размер.
Вам нужно явно установить заполнение как для шифрования, так и для дешифрования.
Например:

mainRM.Padding = PaddingMode.None;


Вот код, который я использовал в проекте несколько месяцев назад. Это сделает свою работу:

public static string Encrypt(string toEncrypt, string securityKey)
{
    var key = securityKey;
    var keyArray = Encoding.UTF8.GetBytes(key);

    var tdes = new TripleDESCryptoServiceProvider
    {
        Key = keyArray,
        Mode = CipherMode.ECB,
        Padding = PaddingMode.PKCS7
    };

    var cTransform = tdes.CreateEncryptor();
    var toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);
    var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    tdes.Clear();
    return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}

public static string Decrypt(string cipherString, string securityKey)
{
    var key = securityKey;
    var keyArray = Encoding.UTF8.GetBytes(key);

    var tdes = new TripleDESCryptoServiceProvider
    {
        Key = keyArray,
        Mode = CipherMode.ECB,
        Padding = PaddingMode.PKCS7
    };

    var cTransform = tdes.CreateDecryptor();
    var toEncryptArray = Convert.FromBase64String(cipherString);
    var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    tdes.Clear();
    return Encoding.UTF8.GetString(resultArray);
}


ali_heidari_

я сделал... но это дает мне зашифрованные данные null, freespaces! зашифрованный текст не имеет никакого хариктера! и когда я расшифровываю ,resault-это пустая строка!

ali_heidari_

Большое спасибо! это работает ! но было бы гораздо лучше, если бы вы сохранили некоторые комментарии к своим кодам! и еще одно важное замечание о вашем коде: ключ должен быть 16 charecter!

Рейтинг:
1

Member 14703898

Строка 52: byte[] plainText = rijndaelCipher.CreateDecryptor().TransformFinalBlock(encryptedData, 0, encryptedData.Длина);