如何在c#中解密填充中的填充

时间:2014-07-29 10:41:23

标签: c# encryption

我写了一个简单的加密/解密程序,当我解密加密文本时,它显示解密文本的grabridge值结束。我的c#代码和代码输出如下。请帮助我在无垃圾解密后获取原始文本

 public class CrypterText
{
    static byte[] chiperbytes;
    static byte[] plainbytes;
    static byte[] plainKey;
    static SymmetricAlgorithm desObj;
    public static string encryptData(string ciperData)
    {

        desObj = Rijndael.Create();

        plainbytes = Encoding.ASCII.GetBytes(ciperData);
        plainKey = Encoding.ASCII.GetBytes("0123456789abcdef");
        desObj.Key = plainKey;
        desObj.Mode = CipherMode.CBC;
        desObj.Padding = PaddingMode.ISO10126;
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        CryptoStream cs = new CryptoStream(ms, desObj.CreateEncryptor(), CryptoStreamMode.Write);
        cs.Write(plainbytes, 0, plainbytes.Length);
        cs.Close();
        chiperbytes = ms.ToArray();
        ms.Close();
        return Encoding.ASCII.GetString(chiperbytes);

    }

    public static string decrypt() {
        MemoryStream ms = new MemoryStream(chiperbytes);
        CryptoStream cs = new CryptoStream(ms, desObj.CreateDecryptor(), CryptoStreamMode.Read);
        cs.Read(chiperbytes, 0, chiperbytes.Length);
        plainbytes = ms.ToArray();
        cs.Close();
        ms.Close();
        return Encoding.ASCII.GetString(plainbytes);
    }

}

enter image description here

3 个答案:

答案 0 :(得分:5)

很可能,padding已被删除,但是因为您正在写入包含加密数据的相同字节数组,所以明文后的密文字节包含在字符串中。您应该解密为单独的字节数组,然后使用该字节数组来构造明文字符串。在解密期间使用Read()的返回值也很重要,这将指示实际解密的字节数。

此处的代码存在许多其他重要问题,例如您的SymmetricAlgorithm仅在加密过程中初始化,这使得目前无法在未加密的情况下解密。您也不应尝试通过任何Encoding.GetString()方法将密文转换为字符串 - 任意字节数组通常不是有效的编码字符串,并且无法按顺序从字符串重建原始字节数组解密。而是使用Convert.ToBase64String()Convert.FromBase64String()来确保从密文字节数组到字符串再返回一致的往返。

答案 1 :(得分:2)

试试这个

public static string decrypt()
{
    byte[] plainbytes = new byte[chiperbytes.Length];
    MemoryStream ms = new MemoryStream(chiperbytes);
    CryptoStream cs = new CryptoStream(ms, desObj.CreateDecryptor(), CryptoStreamMode.Read);
    cs.Read(plainbytes, 0, plainbytes.Length);
    cs.Close();
    ms.Close();
    return Encoding.ASCII.GetString(plainbytes).TrimEnd('\0');
}

答案 2 :(得分:1)

加密过程中剩余的额外字符。将字节数组从类变量移动到局部变量。之后将加密的字符串作为参数提交给decrypt方法。

另外,我个人认为拥有只有静态方法的非静态类并不是一个好主意。要么使静态类或至少某些方法是非静态的,以较合适的为准。