public class DESCrypto
{
/// <summary>
/// 初始化des实例秘钥及向量
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
private static DESCryptoServiceProvider InitDESInstance(
string key)
{
DESCryptoServiceProvider des =
new DESCryptoServiceProvider();
byte[] salt =
new byte[] {
0x0A,
0x01,
0x02,
0x03,
0x04,
0x05,
0x06,
0xF1 };
byte[] keyByte =
Encoding.UTF8.GetBytes(key);
Rfc2898DeriveBytes rfcKey =
new Rfc2898DeriveBytes(keyByte, salt,
8);
Rfc2898DeriveBytes rfcIv =
new Rfc2898DeriveBytes(
"0987654321", salt,
8);
des.Key = rfcKey.GetBytes(
8);
des.IV = rfcIv.GetBytes(
8);
return des;
}
#region 基于Base64的加密解密(不其他格式的加解密方法配合使用)
/// <summary>
/// 基于Base64
/// </summary>
/// <param name="plaintext"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string DESEncryptBase64(
string plaintext,
string key)
{
DESCryptoServiceProvider des =
InitDESInstance(key);
byte[] dataByteArray =
Encoding.UTF8.GetBytes(plaintext);
string ciphertext =
"";
using (MemoryStream ms =
new MemoryStream())
using (CryptoStream cs =
new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(dataByteArray, 0, dataByteArray.Length);
cs.FlushFinalBlock();
ciphertext =
Convert.ToBase64String(ms.ToArray());
}
return ciphertext;
}
/// <summary>
/// 基于Base64
/// </summary>
/// <param name="encrypt"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string DESDecryptBase64(
string encrypt,
string key)
{
DESCryptoServiceProvider des =
InitDESInstance(key);
byte[] dataByteArray =
Convert.FromBase64String(encrypt);
using (MemoryStream ms =
new MemoryStream())
using (CryptoStream cs =
new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(dataByteArray, 0, dataByteArray.Length);
cs.FlushFinalBlock();
return Encoding.UTF8.GetString(ms.ToArray());
}
}
#endregion
#region 基于2位十六进制格式的加密解密(不其他格式的加解密方法配合使用)
/// <summary>
/// 加密
/// </summary>
/// <param name="plaintext">明文</param>
/// <param name="key"></param>
/// <returns></returns>
public static string DESEncrypt(
string plaintext,
string key)
{
DESCryptoServiceProvider des =
InitDESInstance(key);
StringBuilder sb =
new StringBuilder();
byte[] dataByteArray =
Encoding.UTF8.GetBytes(plaintext);
string ciphertext =
"";
using (MemoryStream ms =
new MemoryStream())
using (CryptoStream cs =
new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(dataByteArray, 0, dataByteArray.Length);
cs.FlushFinalBlock();
//输出加密文本
foreach (
byte b
in ms.ToArray())
{
sb.AppendFormat("{0:X2}", b);
}
ciphertext =
sb.ToString();
}
return ciphertext;
}
/// <summary>
/// 解密
/// </summary>
/// <param name="ciphertext">密文</param>
/// <param name="key"></param>
/// <returns></returns>
public static string DESDecrypt(
string ciphertext,
string key)
{
DESCryptoServiceProvider des =
InitDESInstance(key);
byte[] dataByteArray =
new byte[ciphertext.Length /
2];
for (
int x =
0; x < ciphertext.Length /
2; x++
)
{
int i = (Convert.ToInt32(ciphertext.Substring(x *
2,
2),
16));
dataByteArray[x] = (
byte)i;
}
using (MemoryStream ms =
new MemoryStream())
using (CryptoStream cs =
new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(dataByteArray, 0, dataByteArray.Length);
cs.FlushFinalBlock();
return Encoding.UTF8.GetString(ms.ToArray());
}
}
#endregion
#region 文件加密解密(不其他格式的加解密方法配合使用)
/// <summary>
/// 加密文件
/// </summary>
/// <param name="sourceFile">文件的物理路径</param>
/// <param name="encryptFile">文件的物理路径</param>
/// <param name="key"></param>
public static void DESEncryptFile(
string sourceFile,
string encryptFile,
string key)
{
if (
string.IsNullOrEmpty(sourceFile) ||
string.IsNullOrEmpty(encryptFile)||!File.Exists(sourceFile))
return;
DESCryptoServiceProvider des =
InitDESInstance(key);
using (FileStream sourceStream =
new FileStream(sourceFile, FileMode.Open, FileAccess.Read))
using (FileStream encryptStream =
new FileStream(encryptFile, FileMode.Create, FileAccess.Write))
{
byte[] dataByteArray =
new byte[sourceStream.Length];
sourceStream.Read(dataByteArray, 0, dataByteArray.Length);
using (CryptoStream cs =
new CryptoStream(encryptStream, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(dataByteArray, 0, dataByteArray.Length);
cs.FlushFinalBlock();
}
}
}
/// <summary>
/// 解密文件
/// </summary>
/// <param name="encryptFile">文件的物理路径</param>
/// <param name="decryptFile">文件的物理路径</param>
/// <param name="key"></param>
public static void DESDecryptFile(
string encryptFile,
string decryptFile,
string key)
{
if (
string.IsNullOrEmpty(encryptFile) ||
string.IsNullOrEmpty(decryptFile) || !File.Exists(encryptFile))
return;
DESCryptoServiceProvider des =
InitDESInstance(key);
using (FileStream encryptStream =
new FileStream(encryptFile, FileMode.Open, FileAccess.Read))
using (FileStream decryptStream =
new FileStream(decryptFile, FileMode.Create, FileAccess.Write))
{
byte[] dataByteArray =
new byte[encryptStream.Length];
encryptStream.Read(dataByteArray, 0, dataByteArray.Length);
using (CryptoStream cs =
new CryptoStream(decryptStream, des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(dataByteArray, 0, dataByteArray.Length);
cs.FlushFinalBlock();
}
}
}
/// <summary>
/// 加密文本并输出到文件
/// </summary>
/// <param name="plaintext"></param>
/// <param name="FileName">文件的物理路径</param>
/// <param name="Key"></param>
public static void DESEncryptTextToFile(
string plaintext,
string FileName,
string key)
{
if (
string.IsNullOrEmpty(FileName))
return;
DESCryptoServiceProvider des =
InitDESInstance(key);
byte[] dataByteArray =
Encoding.UTF8.GetBytes(plaintext);
using (FileStream fStream =
File.Open(FileName, FileMode.Create))
using (CryptoStream cStream =
new CryptoStream(fStream, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cStream.Write(dataByteArray, 0, dataByteArray.Length);
cStream.FlushFinalBlock();
}
}
/// <summary>
/// 解密文件中的密文并返回
/// </summary>
/// <param name="FileName"></param>
/// <param name="Key"></param>
/// <returns></returns>
public static string DESDecryptTextFromFile(
string FileName,
string key)
{
if (
string.IsNullOrEmpty(FileName)||!File.Exists(FileName))
return "";
DESCryptoServiceProvider des =
InitDESInstance(key);
using (FileStream fStream =
File.Open(FileName, FileMode.OpenOrCreate))
using (CryptoStream cStream =
new CryptoStream(fStream, des.CreateDecryptor(), CryptoStreamMode.Read))
using (StreamReader sReader =
new StreamReader(cStream))
{
string val =
sReader.ReadToEnd();
return val;
}
}
#endregion
}
View Code
Tips:参考MSDN整理编写,比较全面。
转载于:https://www.cnblogs.com/njl041x/p/3873174.html