ASP.. NET解密后的字符串长度错误
本文关键字:错误 字符串 NET 解密 ASP | 更新日期: 2023-09-27 17:51:07
使用以下解密方法后,我得到字符串的长度错误。
public static string DecryptRJ256(string prm_key, string prm_iv, string prm_text_to_decrypt) {
string sEncryptedString = prm_text_to_decrypt;
RijndaelManaged myRijndael = new RijndaelManaged();
myRijndael.Padding = PaddingMode.Zeros;
myRijndael.Mode = CipherMode.CBC;
myRijndael.KeySize = 256;
myRijndael.BlockSize = 256;
byte[] key = Encoding.ASCII.GetBytes(prm_key);
byte[] IV = Encoding.ASCII.GetBytes(prm_iv);
ICryptoTransform decryptor = myRijndael.CreateDecryptor(key, IV);
byte[] sEncrypted = Convert.FromBase64String(sEncryptedString);
byte[] fromEncrypt = new byte[sEncrypted.Length];
MemoryStream msDecrypt = new MemoryStream(sEncrypted);
CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
return (Encoding.ASCII.GetString(fromEncrypt));
}
例如:string ID = "yUFYhclPyPubnhMZ+SHJb1wrt44pao3B82jdbL1ierM=";
string finalID = DecryptRJ256(sKy, sIV, ID);
Response.Write(finalID); ''200905410 (**this is correct**)
Response.Write(finalID.Length); ''32 (**this should be 9**)
我做错了什么?
您使用零填充。这将用零字节填充消息,直到它达到块大小(在您的示例中为32字节)。因为零填充是不明确的(不能区分以零字节结尾的输入和填充),所以。net不会自动删除它。
所以你有两个选择:
- 使用PKCS7填充加密和解密(这是我的建议)
- 手动从解密的明文中剥离所有终端零字节。
你的密码也不好:
- key和IVs应该是二进制,而不是ASCII(这里使用base64编码)
- 在明文上使用ASCII会默默地破坏unicode字符-使用utf-8代替
- 您需要为每个加密调用一个新的随机IV,并且需要在解密期间读取它
- 你应该添加一个MAC,否则主动攻击(如填充oracle)经常会破坏它。
- 使用
TransformFinalBlock
代替那些内存流。 为什么使用Rijndael256而不是AES?
当我用当前密钥(即没有密钥和IV)编译此对称解密对象时,我将其作为finalID。
???hV?9-2O?o?????}yl?????N?W
正好32个字符。改进钥匙和IV会有所帮助。我不确定,但希望这可能会有所帮助。