使用以下解密方法后,我得到字符串的长度错误。
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**)
我做错了什么?
答案 0 :(得分:2)
您正在使用零填充。这会将消息填充为零字节,直到达到块大小(在您的情况下为32字节)。由于零填充是不明确的(不能区分以零字节结束的输入和填充),。net不会自动删除它。
所以你有两个选择:
你的加密也不好:
TransformFinalBlock
代替那些内存流。答案 1 :(得分:0)
当我用对称解密器对象和当前密钥编译它时,没有密钥和IV,我将其作为finalID。
???hV?9-2O?o?????}yl?????N?W
正好是32个字符。 精炼钥匙和IV会有所帮助。我不确定,但希望这可能会有所帮助。