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**)

我做错了什么?

ASP.. NET解密后的字符串长度错误

您使用零填充。这将用零字节填充消息,直到它达到块大小(在您的示例中为32字节)。因为零填充是不明确的(不能区分以零字节结尾的输入和填充),所以。net不会自动删除它。

所以你有两个选择:

  • 使用PKCS7填充加密和解密(这是我的建议)
  • 手动从解密的明文中剥离所有终端零字节。

你的密码也不好:

  1. key和IVs应该是二进制,而不是ASCII(这里使用base64编码)
  2. 在明文上使用ASCII会默默地破坏unicode字符-使用utf-8代替
  3. 您需要为每个加密调用一个新的随机IV,并且需要在解密期间读取它
  4. 你应该添加一个MAC,否则主动攻击(如填充oracle)经常会破坏它。
  5. 使用TransformFinalBlock代替那些内存流。
  6. 为什么使用Rijndael256而不是AES?

当我用当前密钥(即没有密钥和IV)编译此对称解密对象时,我将其作为finalID。

???hV?9-2O?o?????}yl?????N?W

正好32个字符。改进钥匙和IV会有所帮助。我不确定,但希望这可能会有所帮助。