我写了一个简单的加密/解密程序,当我解密加密文本时,它显示解密文本的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);
}
}
答案 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方法。
另外,我个人认为拥有只有静态方法的非静态类并不是一个好主意。要么使静态类或至少某些方法是非静态的,以较合适的为准。