现在我知道这个问题之前已被问过,我已尝试在我的代码中实现这些解决方案,但它们似乎不起作用,因为它仍然返回空值或者它给了我各种错误。
解密方法
public string DecryptString (string encryptText)
{
byte[] key {};
byte[] IV = { 12, 21, 43, 17, 57, 35, 67, 27};
string encryptKey = "aX#%710p";
key = Encoding.UTF8.GetBytes(encryptKey);
byte[] byteInput = new byte[encryptText.Length];
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream();
ICryptoTransform transform = provider.CreateDecryptor( key, IV);
CryptoStream cs = new CryptoStream(ms, transform, CryptoStreamMode.Write);
cs.Write( byteInput, 0, byteInput.Length);
return Encoding.UTF8.GetString(ms.ToArray());
}
这是加密方法,但它工作正常
public string EnryptString (string encryptText)
{
byte[] key {};
byte[] IV = { 12, 21, 43, 17, 57, 35, 67, 27};
string encryptKey = "aX#%710p";
key = Encoding.UTF8.GetBytes(encryptKey);
byte[] byteInput = Encoding.UTF8.GetBytes(encryptText);
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream();
ICryptoTransform transform = provider.CreateEncryptor( key, IV);
CryptoStream cs = new CryptoStream(ms, transform, CryptoStreamMode.Write);
cs.Write(byteInput, 0, byteInput.Length);
return Encoding.UTF8.GetString(ms.ToArray());
}
提前谢谢
答案 0 :(得分:1)
试试这个
加密
public static string Encrypt(string clearText)
{
string EncryptionKey = "aX#%710p";
byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
}
clearText = Convert.ToBase64String(ms.ToArray());
}
}
return clearText;
}
解密
public static string Decrypt(string cipherText)
{
string EncryptionKey = "aX#%710p";
byte[] cipherBytes = Convert.FromBase64String(cipherText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
}
cipherText = Encoding.Unicode.GetString(ms.ToArray());
}
}
return cipherText;
}
答案 1 :(得分:0)
加密方法至少存在两个问题:
默认mode of operation是CBC模式,需要填充才能工作。读取完整的纯文本后应用填充(或根据您的查看方式编写)。您需要在致电ms.ToArray()
之前致电CryptoStream#FlushFinalBlock
或使用using
语句让语言本身处理正确的关闭流,因为shown是由siby sunny。
绝不将二进制数据存储在字符串中。某些任意字节通常不会产生像UTF-8这样的有效字符编码。您需要使用不同类别的编码,例如Hex或Base64(再次由siby sunny显示)。
解密具有相同的问题,但形式略有不同。
现在不要使用DES。它只提供56位安全性。 AES会更好,因为它的最低密钥大小为128位更安全。使用DES的最大密文大小也存在实际限制。请参阅Security comparison of 3DES and AES。
对于CBC模式,IV必须是不可预测的(读取:随机)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定何时发送相同的消息前缀。 IV不是秘密,因此您可以将其与密文一起发送。通常,它只是在密文之前预先填写并在解密之前切掉。
最好对您的密文进行身份验证,以便像padding oracle attack这样的攻击是不可能的。这可以通过GCM或EAX等经过身份验证的模式完成,也可以使用像HMAC-SHA256这样具有强MAC的encrypt-then-MAC方案来完成。