[英]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.