/*
|
* DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。
|
* 这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。
|
* 使用子密钥对其中一半应用循环功能,然后将输出与另一半进行"异或"运算;
|
* 接着交换这两半,这一过程会继续下去,但最后一个循环不交换。
|
* DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。
|
*/
|
|
using System;
|
using System.Text;
|
using System.Security.Cryptography;//这个是处理文字编码的前提
|
using System.IO;
|
|
namespace GTech.Solution.Api.Common
|
{
|
public static class DESEncrytion
|
{
|
#region 1、加密向量自定义
|
/// <summary>
|
/// DES加密方法
|
/// </summary>
|
/// <param name="strPlain">明文</param>
|
/// <param name="strDESKey">密钥</param>
|
/// <param name="strDESIV">向量</param>
|
/// <returns>密文</returns>
|
public static string DESEncrypt(string strPlain, string strDESKey, string strDESIV)
|
{
|
//把密钥转换成字节数组
|
byte[] bytesDESKey = ASCIIEncoding.ASCII.GetBytes(strDESKey);
|
//把向量转换成字节数组
|
byte[] bytesDESIV = ASCIIEncoding.ASCII.GetBytes(strDESIV);
|
//声明1个新的DES对象
|
DESCryptoServiceProvider desEncrypt = new DESCryptoServiceProvider();
|
//开辟一块内存流
|
MemoryStream msEncrypt = new MemoryStream();
|
//把内存流对象包装成加密流对象
|
CryptoStream csEncrypt = new CryptoStream(msEncrypt, desEncrypt.CreateEncryptor(bytesDESKey, bytesDESIV), CryptoStreamMode.Write);
|
//把加密流对象包装成写入流对象
|
StreamWriter swEncrypt = new StreamWriter(csEncrypt);
|
//写入流对象写入明文
|
swEncrypt.WriteLine(strPlain);
|
//写入流关闭
|
swEncrypt.Close();
|
//加密流关闭
|
csEncrypt.Close();
|
//把内存流转换成字节数组,内存流现在已经是密文了
|
byte[] bytesCipher = msEncrypt.ToArray();
|
//内存流关闭
|
msEncrypt.Close();
|
//把密文字节数组转换为字符串,并返回
|
return UnicodeEncoding.Unicode.GetString(bytesCipher);
|
}
|
/// <summary>
|
/// DES解密方法
|
/// </summary>
|
/// <param name="strCipher">密文</param>
|
/// <param name="strDESKey">密钥</param>
|
/// <param name="strDESIV">向量</param>
|
/// <returns>明文</returns>
|
public static string DESDecrypt(string strCipher, string strDESKey, string strDESIV)
|
{
|
//把密钥转换成字节数组
|
byte[] bytesDESKey = ASCIIEncoding.ASCII.GetBytes(strDESKey);
|
//把向量转换成字节数组
|
byte[] bytesDESIV = ASCIIEncoding.ASCII.GetBytes(strDESIV);
|
//把密文转换成字节数组
|
byte[] bytesCipher = UnicodeEncoding.Unicode.GetBytes(strCipher);
|
//声明1个新的DES对象
|
DESCryptoServiceProvider desDecrypt = new DESCryptoServiceProvider();
|
//开辟一块内存流,并存放密文字节数组
|
MemoryStream msDecrypt = new MemoryStream(bytesCipher);
|
//把内存流对象包装成解密流对象
|
CryptoStream csDecrypt = new CryptoStream(msDecrypt, desDecrypt.CreateDecryptor(bytesDESKey, bytesDESIV), CryptoStreamMode.Read);
|
//把解密流对象包装成读出流对象
|
StreamReader srDecrypt = new StreamReader(csDecrypt);
|
//明文=读出流的读出内容
|
string strPlainText = srDecrypt.ReadLine();
|
//读出流关闭
|
srDecrypt.Close();
|
//解密流关闭
|
csDecrypt.Close();
|
//内存流关闭
|
msDecrypt.Close();
|
//返回明文
|
return strPlainText;
|
}
|
|
#endregion
|
|
#region 2、加密向量默认值
|
|
//默认密钥向量
|
private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
|
/// <summary>
|
/// DES加密字符串
|
/// </summary>
|
/// <param name="encryptString">待加密的字符串</param>
|
/// <param name="encryptKey">加密密钥,要求为8位</param>
|
/// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
|
public static string EncryptDES(string encryptString, string encryptKey)
|
{
|
try
|
{
|
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
|
byte[] rgbIV = Keys;
|
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
|
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
|
MemoryStream mStream = new MemoryStream();
|
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
|
cStream.Write(inputByteArray, 0, inputByteArray.Length);
|
cStream.FlushFinalBlock();
|
return Convert.ToBase64String(mStream.ToArray());
|
}
|
catch
|
{
|
return encryptString;
|
}
|
}
|
|
/// <summary>
|
/// DES解密字符串
|
/// </summary>
|
/// <param name="decryptString">待解密的字符串</param>
|
/// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
|
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
|
public static string DecryptDES(string decryptString, string decryptKey)
|
{
|
try
|
{
|
byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
|
byte[] rgbIV = Keys;
|
byte[] inputByteArray = Convert.FromBase64String(decryptString);
|
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
|
MemoryStream mStream = new MemoryStream();
|
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
|
cStream.Write(inputByteArray, 0, inputByteArray.Length);
|
cStream.FlushFinalBlock();
|
return Encoding.UTF8.GetString(mStream.ToArray());
|
}
|
catch
|
{
|
return decryptString;
|
}
|
}
|
#endregion
|
}
|
}
|