4.1 原理介绍
DES(数据加密标准,Data Encryption Standard),出自IBM的研究,后被美国政府正式采用,密钥长度56位,以现代的计算能力可在24h以内被暴力破解。算法设计原理参考这篇博客。
顺便说一下3DES(Triple DES),它是DES向AES过渡的加密算法,使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。 .
4.2 C#代码
C#中提供封装好的DES加解密方法,直接调用即可。
// DES(数据加密标准,Data Encryption Standard)
public sealed class DES
{
/* DES相关
ecb、ctr模式不需要初始化向量
cbc、ofc、cfb需要初始化向量
初始化向量的长度:DES/3DES为8byte;AES为16byte。加解密使用的IV相同。
*/
/// <summary>
/// DES加密
/// </summary>
/// <param name="plaintext">明文</param>
/// <param name="key">密钥,长度8byte</param>
/// <param name="iv">初始化向量,长度8byte</param>
/// <returns>返回密文</returns>
public static string DESEncrypt(string plaintext, string key, string iv)
{
try
{
byte[] btKey = Encoding.UTF8.GetBytes(key);
byte[] btIV = Encoding.UTF8.GetBytes(iv);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
using (MemoryStream ms = new MemoryStream())
{
byte[] inData = Encoding.UTF8.GetBytes(plaintext);
try
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(inData, 0, inData.Length);
cs.FlushFinalBlock();
}
return Convert.ToBase64String(ms.ToArray());
}
catch
{
return plaintext;
}
}
}
catch { }
return "DES加密出错";
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="ciphertext">密文</param>
/// <param name="key">密钥,长度8byte</param>
/// <param name="iv">初始化向量,长度8byte</param>
/// <returns>返回明文</returns>
public static string DESDecrypt(string ciphertext, string key, string iv)
{
if (ciphertext == "") return "";
try
{
byte[] btKey = Encoding.UTF8.GetBytes(key);
byte[] btIV = Encoding.UTF8.GetBytes(iv);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
using (MemoryStream ms = new MemoryStream())
{
byte[] inData = Convert.FromBase64String(ciphertext);
try
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(inData, 0, inData.Length);
cs.FlushFinalBlock();
}
return Encoding.UTF8.GetString(ms.ToArray());
}
catch
{
return ciphertext;
}
}
}
catch { }
return "DES解密出错";
}
}