ОБНОВЛЕНИЕ 1:
Пожалуйста, настройте IV самостоятельно, чтобы успешно расшифровать, как указывал @ maarten-bodewes. Я пропустил эту часть, и расшифровка как-то сработала (?) С вашим существующим кодом, но вы всегда должны предоставлять один и тот же ключ и IV для алгоритма шифрования симметрии c, чтобы он работал в обоих направлениях.
ОРИГИНАЛЬНЫЙ ОТВЕТ :
Ваша расшифровка завершается неудачно (выдает неверные результаты), потому что вы неправильно внедрили часть дешифрования (используя CryptoStreamMode.Write
вместо CryptoStreamMode.Read
) и помимо подачи в поток дешифрования всех нулевых байтов
At точка выполнения
cs.Write(cipherBytes, 0, cipherBytes.Length);
, переменная cipherBytes
равна нулю. Настоящий зашифрованный буфер находится в переменной data
, которую вы используете только для установки длины cipherBytes
Так что измените свой метод дешифрования на этот.
БОНУС : После исправления части дешифрования вы можете указать заполнение при sh! Я проверил с PKCS7, и это нормально.
public static string DecryptParams(string resVal)
{
var cipherBytes = Convert.FromBase64String(resVal);
string plainText = "";
using (var crypto = CreateCryptor())
{
ICryptoTransform Dec = crypto.CreateDecryptor();
using (MemoryStream ms = new MemoryStream(cipherBytes))
{
using (var cs = new CryptoStream(ms, Dec, CryptoStreamMode.Read))
{
byte[] decryptBlock = new byte[4096];
MemoryStream decryptStream = new MemoryStream();
int readBytes;
while ((readBytes = cs.Read(decryptBlock, 0, 4096)) > 0)
{
decryptStream.Write(decryptBlock, 0, readBytes);
}
plainText = Encoding.Unicode.GetString(decryptStream.ToArray());
}
}
crypto.Clear();
}
return plainText;
}
Надеюсь, это поможет.