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

Rol*_*nez 2 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);
    }
Run Code Online (Sandbox Code Playgroud)

}

在此输入图像描述

Iri*_*ium 5

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

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