расшифровка с помощью алгоритма 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);
}