【发布时间】:2021-03-04 19:52:51
【问题描述】:
我在我的项目中使用 AES 密码算法来加密和解密我的值。我的代码几乎每次都能正常工作,但有时我会收到 Padding is invalid and cannot be removed 错误。我的项目是 ASP .NET Core 3.1 项目,它发布在 IIS Server 8.5 上。
正如Padding is invalid and cannot be removed? 9 年前提出的问题所说,我的密钥和盐总是设置为 128 位,填充模式总是设置为 PKCS#7,如下代码:aes.Padding = PaddingMode.PKCS7;。
但有时,我会收到此错误。在使用 same 密钥、加盐和解密值调试我的代码后,我没有收到任何错误,而且我的代码还能正常工作 10 个小时左右。我不知道为什么我的代码会这样,但我找不到任何解决方案。
我的构造函数:
public void KriptoAlgoritmasiniAyarla(string password, string salt, SymmetricAlgorithm algorithm)
{
if (password == null) throw new ArgumentNullException(nameof(password));
if (salt == null) throw new ArgumentNullException(nameof(salt));
DeriveBytes rgb = new Rfc2898DeriveBytes(password, Encoding.Unicode.GetBytes(salt));
var rgbKey = rgb.GetBytes(algorithm.KeySize >> 3);
var rgbIv = rgb.GetBytes(algorithm.BlockSize >> 3);
_sifreleyici = algorithm.CreateEncryptor(rgbKey, rgbIv);
_desifreleyici = algorithm.CreateDecryptor(rgbKey, rgbIv);
}
我的密码:
public byte[] ByteDizisineSifrele(string plainText)
{
try
{
byte[] encrypted;
// Create a new AesManaged.
using (AesManaged aes = new AesManaged())
{
aes.Padding = PaddingMode.PKCS7;
// Create MemoryStream
using (MemoryStream ms = new MemoryStream())
{
// Create crypto stream using the CryptoStream class. This class is the key to encryption
// and encrypts and decrypts data from any given stream. In this case, we will pass a memory stream
// to encrypt
using (CryptoStream cs = new CryptoStream(ms, _sifreleyici, CryptoStreamMode.Write))
{
// Create StreamWriter and write data to a stream
using (StreamWriter sw = new StreamWriter(cs))
sw.Write(plainText);
encrypted = ms.ToArray();
}
}
}
// Return encrypted data
return encrypted;
}
catch (Exception exp)
{
throw exp;
}
}
我的解密代码:
public string ByteDizisiDesifreEt(byte[] cipherText)
{
try
{
string plaintext = null;
// Create AesManaged
using (AesManaged aes = new AesManaged())
{
aes.Padding = PaddingMode.PKCS7;
// Create the streams used for decryption.
using (MemoryStream ms = new MemoryStream(cipherText))
{
// Create crypto stream
using (CryptoStream cs = new CryptoStream(ms, _desifreleyici, CryptoStreamMode.Read))
{
// Read crypto stream
using (StreamReader reader = new StreamReader(cs))
plaintext = reader.ReadToEnd();
}
}
}
return plaintext;
}
catch (Exception exp)
{
throw exp;
}
}
【问题讨论】:
-
通过网络发送数据时使用 base64 或类似编码。二进制数据会产生问题。
-
在关闭
CryptoStream之前,您正在阅读MemoryStream;最后一个块可能没有被刷新。将您的encrypted = ms.ToArray();移出使用。
标签: c# cryptography aes