繁体   English   中英

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

[英]how to remove padding in decryption in c#

我写了一个简单的加密/解密程序,当我解密加密文本时,它显示解密文本的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);
    }

}

在此输入图像描述

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

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

尝试这个

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');
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM