【问题标题】:ASP.NET wrong string length after Decryption解密后 ASP.NET 错误的字符串长度
【发布时间】:2014-03-20 08:45:35
【问题描述】:

使用以下解密方法后,我得到的字符串长度错误。

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

我做错了什么?

【问题讨论】:

  • 不确定,但对我来说,这听起来像是添加填充字符来完成块大小。你能检查一下你是否将 finalID 转换为 Char 数组,最终位置的值是什么?
  • 我已经试过了,前9个字符是ID,但剩下的数组字符是空的。
  • 为空还是 Ascii 值为 0?尝试将这些字符之一转换为 int。
  • 当我通过 Convert.ToInt32 传递字符(EMPTY)时,我得到 0。
  • 使用像 PKCS7 这样的适当填充模式怎么样?如果输入可以包含零字节,则无法可靠地删除零填充,因此 .net 不会自动删除它。

标签: c# asp.net encryption string-length


【解决方案1】:

您正在使用零填充。这会用零字节填充消息,直到它达到块大小(在您的情况下为 32 个字节)。由于零填充不明确(无法区分以零字节结尾的输入和填充),.net 不会自动删除它。

所以你有两个选择:

  • 对加密和解密都使用 PKCS7 填充(我建议这样做)
  • 从解密的明文中手动去除所有终端零字节。

你的加密也不好:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      相关资源
      最近更新 更多