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

时间:2014-03-20 08:45:36

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

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

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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

所以你有两个选择:

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

你的加密也不好:

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

答案 1 :(得分:0)

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

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

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