DES-ECB encryption and decryption
本文关键字:decryption and encryption DES-ECB | 更新日期: 2023-09-27 18:03:12
我在应用程序中使用DES-ECB + base64加密。这是我命名为Crypto的类的代码
public class Crypto
{
public static string Decrypt(string encryptedString)
{
DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider();
desProvider.Mode = CipherMode.ECB;
desProvider.Padding = PaddingMode.PKCS7;
desProvider.Key = Encoding.ASCII.GetBytes("e5d66cf8");
using (MemoryStream stream = new MemoryStream(Convert.FromBase64String(encryptedString)))
{
using (CryptoStream cs = new CryptoStream(stream, desProvider.CreateDecryptor(), CryptoStreamMode.Read))
{
using (StreamReader sr = new StreamReader(cs, Encoding.ASCII))
{
return sr.ReadToEnd();
}
}
}
}
public static string Encrypt(string decryptedString)
{
DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider();
desProvider.Mode = CipherMode.ECB;
desProvider.Padding = PaddingMode.PKCS7;
desProvider.Key = Encoding.ASCII.GetBytes("e5d66cf8");
using (MemoryStream stream = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(stream, desProvider.CreateEncryptor(), CryptoStreamMode.Write))
{
byte[] data = Encoding.Default.GetBytes(decryptedString);
cs.Write(data, 0, data.Length);
return Convert.ToBase64String(stream.ToArray());
}
}
}
}
但是当我加密一个字符串,然后再次解密并再加密一次时,加密的字符串与之前加密的字符串不一样。这是第一个加密字符串
kEN0HUp dqz8kXA7nYivJG6Jl3haLJjhBq1UfEtQTwaPwizW//03 m0uxf8dbuyzo2boz5vsvcxrjf1lpfzlwxdsdekac43l2k2ooyrxtn dA6KmM13YS9xOezGiROQfVj5qrkdokJRCvj0gYfFoH2oeDGyN + EAw5Dgzsp697kj4 =
然后是第二个加密字符串:
kEN0HUp/dqz8kXA7nYivJG6Jl3haLJjhBq1UfEtQTwaPwizW//03 m0uxf8dbuyzo2boz5vsvcxrjf1lpfzlwxdsdekac43l2k2ooyrxtn/dA6KmM13YS9xOezGiROQfVj5qrkdokJRCvj0gYfFoH2oeDGyN + EAw5
它们几乎相同,除了第一个字符串中的"Dgzsp697kj4="。
怎么了?
您正在丢失数据。在Encrypt()方法中,您需要调用EncryptFinalBlock()来让填充算法知道您已经完成,以便它可以添加填充:
using (CryptoStream cs = new CryptoStream(stream, desProvider.CreateEncryptor(), CryptoStreamMode.Write))
{
byte[] data = Encoding.Default.GetBytes(decryptedString);
cs.Write(data, 0, data.Length);
cs.FlushFinalBlock(); // <-- Add this
return Convert.ToBase64String(stream.ToArray());
}
我也遇到过类似的问题。您应该检查没有将空格附加到解密字符串的末尾。你可能需要把空白部分剪掉