我正在使用aes来加密/解密文本,但有时它会在解密后给我一些确切的值,而有些时候我会收到错误。我提到了不同的答案,但没有找到问题的根本原因。
private static string DecryptStringFromBytes(byte[] cipherText, byte[] key, byte[] iv)
{
// Declare the string used to hold the decrypted text.
string plaintext = null;
// Create an RijndaelManaged object
// with the specified key and IV.
using (var rijAlg = new System.Security.Cryptography.RijndaelManaged())
{
//Settings
rijAlg.Mode = System.Security.Cryptography.CipherMode.CBC;
rijAlg.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
rijAlg.FeedbackSize = 128;
rijAlg.Key = key;
rijAlg.IV = iv;
// Create a decrytor to perform the stream transform.
var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
try
{
// Create the streams used for decryption.
using (var msDecrypt = new System.IO.MemoryStream(cipherText))
{
using (var csDecrypt = new System.Security.Cryptography.CryptoStream(msDecrypt, decryptor, System.Security.Cryptography.CryptoStreamMode.Read))
{
using (var srDecrypt = new System.IO.StreamReader(csDecrypt))
{
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
plaintext = srDecrypt.ReadToEnd();
}
}
}
}
catch
{
plaintext = "keyError";
}
}
return plaintext;
}
它会抛出错误" 填充无效且无法删除" 我看到一些建议,如删除填充,但它似乎没有适当的解决方案。 我无法找到这背后的原因,因为有时它运行完美而不会抛出错误。
非常感谢任何帮助或建议。
For Encryption - 正在js中对客户端进行加密,并将加密文本传递给服务器。
var key = CryptoJS.enc.Utf8.parse("16 digit number here");
var iv = CryptoJS.enc.Utf8.parse("16 digit number here");
var EncryptedString = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse("entered string to encrypt"), key,
{ keySize: 128 / 8, iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
答案 0 :(得分:1)
通过在.NET中使用类似的加密例程来解密函数,我能够成功地将明文转换为密文并返回明文,因此解密函数本身似乎没问题。因此,您用于加密的密钥和/或IV似乎很可能与您在解密时使用的值无法逐字节匹配。
鉴于您的加密代码使用UTF-8编码版本的字符串值来形成密钥和IV,因此在您的解密代码中使用Encoding.UTF8.GetBytes()
)也值得这样做。
然而,值得注意的是,虽然这可能解决了眼前的问题,但如果没有某种形式的密钥派生过程(例如Rfc2898DeriveBytes
),将字符串值直接用于密钥本身就是一种不好的做法,应该为加密函数的每个应用程序随机生成和IV。这些只是您使用加密技术的一些问题(并且与代码是否有效无关)。