DES类
#region DES文件
public static void LogsAdd(string str)
{
}
/// <summary>
/// 判断是否十进制格式字符串
/// </summary>
/// <param name="str">字符串</param>
/// <returns>true 是 false 不是</returns>
public static bool IsDecimal(string str)
{
if (string.IsNullOrEmpty(str))
return false;
const string PATTERN = @"([^0-9]|\s+?)+";
if (System.Text.RegularExpressions.Regex.IsMatch(str, PATTERN))
{
LogsAdd("输入错误:有非法字符串!");
return false;
}
return true;
}
/// <summary>
/// 十进制字符串转字节数组
/// </summary>
/// <param name="str">字符串</param>
/// <returns></returns>
public static byte[] DecimalStringToByte(string str)
{
if (string.IsNullOrEmpty(str))
{
LogsAdd("输入错误:输入字符串为空!");
return null;
}
if (IsDecimal(str))
{
int splitBase = 3;
if (str.Length % splitBase == 0)
{
int len = str.Length / splitBase;
byte[] arr_des = new byte[len];
for (int i = 0; i < len; i++)
{
int a = Convert.ToInt32(str.Substring(i * splitBase, splitBase));
if (a > 255)
{
LogsAdd("输入错误:输入值大于255!");
return null;
}
arr_des[i] = Convert.ToByte(a);
}
LogsAdd("十进制字符串转字节数组转换成功。");
return arr_des;
}
else
LogsAdd("输入错误:长度不对!");
}
return null;
}
/// <summary>
/// 字节数组转十进制字符串
/// </summary>
/// <param name="Byte"></param>
/// <param name="interval"></param>
/// <returns></returns>
public static string ByteToDecimalString(byte[] Byte, string interval = "")
{
StringBuilder result = new StringBuilder();
if (Byte != null)
{
foreach (byte b in Byte)
{
result.Append(b.ToString("D3") + interval);
}
LogsAdd("字节转十进制字符串转换成功。");
return result.ToString();
}
LogsAdd("字节为空!");
return null;
}
/// <summary>
/// DES字符串加密。CBC模式
/// </summary>
/// <param name="targetValue">加密字符串</param>
/// <param name="key">秘钥只能是8位(不支持中文)</param>
/// <param name="iv">向量要大于或等于8位</param>
/// <param name="encoding">加密字符串编码</param>
/// <returns>输出加密字符,字符串类型(十进制值输出)</returns>
public static string DesCBCEncrypt(string targetValue, string key, string iv, string encoding = "UTF-8")
{
string str_des = null;
if (key.Length != 8 | iv.Length < 8)
{
LogsAdd("DES失败:密码长度不是8位或向量小于8位!");
return str_des;
}
if (string.IsNullOrEmpty(targetValue))
{
LogsAdd("DES失败:加密字符串为空!");
return str_des;
}
try
{
byte[] arr_key = Encoding.UTF8.GetBytes(key.Substring(0, 8));
byte[] arr_iv = Encoding.UTF8.GetBytes(iv);//.Substring(0, 4)
byte[] arr_str = Encoding.GetEncoding(encoding).GetBytes(targetValue);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();//实例化内存流对象
des.Mode = CipherMode.CBC;//指定要用于加密的块密码模式。
using (CryptoStream cs = new CryptoStream(mStream, des.CreateEncryptor(arr_key, arr_iv), CryptoStreamMode.Write))//将数据流链接到加密转换的流。
{
cs.Write(arr_str, 0, arr_str.Length);
}
str_des = ByteToDecimalString(mStream.ToArray());
LogsAdd("DES成功!");
return str_des;
}
catch (Exception ex)
{
LogsAdd("DES失败:" + ex.Message);
return str_des;
}
}
/// <summary>
/// DES字符串解密。CBC模式
/// </summary>
/// <param name="targetValue">加密字符串</param>
/// <param name="key">秘钥只能是8位(不支持中文)</param>
/// <param name="iv">向量要大于或等于8位</param>
/// <param name="encoding">加密字符串编码</param>
/// <returns>输出加密字符,字符串类型(十进制值输出)</returns>
public static string DesCBCDecrypt(string targetValue, string key, string iv, string encoding = "UTF-8")
{
string str_des = null;
if (key.Length != 8 | iv.Length < 8)
{
LogsAdd("DES失败:密码长度不是8位或向量小于8位!");
return str_des;
}
if (string.IsNullOrEmpty(targetValue))
{
LogsAdd("DES失败:加密字符串为空!");
return str_des;
}
try
{
//定义字节数组用来存放密钥 GetBytes方法用于将字符串中所有字节编码为一个字节序列
byte[] arr_key = Encoding.UTF8.GetBytes(key.Substring(0, 8));
byte[] arr_iv = Encoding.UTF8.GetBytes(iv);//.Substring(0, 4)
byte[] arr_des = DecimalStringToByte(targetValue);
MemoryStream ms = new MemoryStream();
//方法定义加密对象
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Mode = CipherMode.CBC;
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(arr_key, arr_iv), CryptoStreamMode.Write))
{
cs.Write(arr_des, 0, arr_des.Length);
}
str_des = Encoding.GetEncoding(encoding).GetString(ms.ToArray());
LogsAdd("DES成功!");
return str_des;
}
catch (Exception ex)
{
LogsAdd("DES失败:" + ex.Message);
return str_des;
}
}
/// <summary>
/// DES字符串加密。ECB模式
/// </summary>
/// <param name="targetValue">加密字符串</param>
/// <param name="key">秘钥只能是8位(不支持中文)</param>
/// <param name="iv">没有用</param>
/// <param name="encoding">加密字符串编码</param>
/// <returns>输出加密字符,字符串类型(Base64)</returns>
public static string DesEBCEncrypt(string targetValue, string key, string iv, string encoding = "UTF-8")
{
string str_des = null;
if (key.Length != 8)
{
LogsAdd("DES失败:密码长度不是8位!");
return str_des;
}
if (string.IsNullOrEmpty(targetValue))
{
LogsAdd("DES失败:加密字符串为空!");
return str_des;
}
try
{
byte[] arr_key = Encoding.UTF8.GetBytes(key);
byte[] arr_iv = Encoding.UTF8.GetBytes(iv.Substring(0, 8));//如果字符串长度大于8个,截取前面8个字符串
byte[] arr_str = Encoding.GetEncoding(encoding).GetBytes(targetValue);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();//实例化内存流对象
des.Mode = CipherMode.ECB;//指定要用于加密的块密码模式。
using (CryptoStream cs = new CryptoStream(mStream, des.CreateEncryptor(arr_key, arr_iv), CryptoStreamMode.Write))//将数据流链接到加密转换的流。
{
cs.Write(arr_str, 0, arr_str.Length);
}
str_des = Convert.ToBase64String(mStream.ToArray());
LogsAdd("DES成功!");
return str_des;
}
catch (Exception ex)
{
LogsAdd("DES失败:" + ex.Message);
return str_des;
}
}
/// <summary>
/// DES字符串解密。ECB模式
/// </summary>
/// <param name="targetValue">加密字符串</param>
/// <param name="key">秘钥只能是8位(不支持中文)</param>
/// <param name="iv">没有用</param>
/// <param name="encoding">加密字符串编码</param>
/// <returns>输出加密字符,字符串类型(Base64)</returns>
public static string DesEBCDecrypt(string targetValue, string key, string iv, string encoding = "UTF-8")
{
string str_des = null;
if (key.Length != 8)
{
LogsAdd("DES失败:密码长度不是8位!");
return str_des;
}
if (string.IsNullOrEmpty(targetValue))
{
LogsAdd("DES失败:加密字符串为空!");
return str_des;
}
try
{
//定义字节数组用来存放密钥 GetBytes方法用于将字符串中所有字节编码为一个字节序列
byte[] arr_key = Encoding.UTF8.GetBytes(key);//.Substring(0, 8)
byte[] arr_iv = Encoding.UTF8.GetBytes(iv);//.Substring(0, 8)
byte[] arr_des = Convert.FromBase64String(targetValue);
MemoryStream mStream = new MemoryStream();
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Mode = CipherMode.ECB;
using (CryptoStream cs = new CryptoStream(mStream, des.CreateDecryptor(arr_key, arr_iv), CryptoStreamMode.Write))
{
cs.Write(arr_des, 0, arr_des.Length);
//cs.FlushFinalBlock();
//cs.Close();
}
str_des = Encoding.GetEncoding(encoding).GetString(mStream.ToArray());
LogsAdd("DES成功!");
return str_des;
}
catch (Exception ex)
{
LogsAdd("DES失败:" + ex.Message);
return str_des;
}
}
/// <summary>
/// DES文件加密。CBC模式
/// </summary>
/// <param name="filePath">源文件</param>
/// <param name="savePath">保存文件</param>
/// <param name="keyString">秘钥只能是8位(不支持中文)</param>
/// <param name="ivString">向量要大于或等于8位</param>
/// <returns>成功返回1,失败返回-1</returns>
public static int DesCBCEncryptFile(string filePath, string savePath, string keyString, string ivString)
{
int i = -1;
var des = GetDesCryptoServiceProvider(keyString, ivString);
if (des == null)
return i;
ICryptoTransform cryptoTransform = des.CreateEncryptor();
if (CryptoFileContent(filePath, savePath, cryptoTransform) == 1)
return 1;
return i;
}
/// <summary>
/// DES文件解密。CBC模式
/// </summary>
/// <param name="filePath">源文件</param>
/// <param name="savePath">保存文件</param>
/// <param name="keyString">秘钥只能是8位(不支持中文)</param>
/// <param name="ivString">向量要大于或等于8位</param>
/// <returns>成功返回1,失败返回-1</returns>
public static int DesCBCDecryptFile(string filePath, string savePath, string keyString, string ivString)
{
int i = -1;
var des = GetDesCryptoServiceProvider(keyString, ivString);
if (des == null)
return i;
ICryptoTransform cryptoTransform = des.CreateDecryptor();
if (CryptoFileContent(filePath, savePath, cryptoTransform) == 1)
return 1;
return i;
}
/// <summary>
/// DES获取加密服务提供者,SHA一次在截取8位。
/// </summary>
/// <param name="keyString">秘钥只能是8位(不支持中文)</param>
/// <param name="ivString">向量要大于或等于8位</param>
/// <returns>成功返回DESCryptoServiceProvider类型,失败返回null</returns>
private static DESCryptoServiceProvider GetDesCryptoServiceProvider(string keyStr, string ivStr)
{
if (keyStr.Length != 8 | ivStr.Length != 8)
{
LogsAdd("DES失败:密码长度不是8位或向量长度不是8位!");
return null;
}
byte[] keyBytes = Encoding.UTF8.GetBytes(keyStr);
SHA1 keysha = new SHA1Managed();//计算指定字节组指定区域哈希值
byte[] keyhash = keysha.ComputeHash(keyBytes);
//加密密钥数组
byte[] key = new byte[8];
for (int i = 0; i < 8; i++)
{
key[i] = keyhash[i];
}
byte[] ivBytes = Encoding.UTF8.GetBytes(ivStr);
SHA1 ivsha = new SHA1Managed();//计算指定字节组指定区域哈希值
byte[] ivhash = ivsha.ComputeHash(keyBytes);
//加密密钥数组
byte[] iv = new byte[8];
for (int i = 0; i < 8; i++)
{
iv[i] = ivhash[i];
}
DESCryptoServiceProvider des = new DESCryptoServiceProvider { Key = key, IV = iv };
return des;
}
/// <summary>
/// DES或文件内容
/// </summary>
/// <param name="filePath"></param>
/// <param name="savePath"></param>
/// <param name="cryptoTransform"></param>
/// <returns>成功返回1,失败返回-1</returns>
private static int CryptoFileContent(string filePath, string savePath, ICryptoTransform cryptoTransform)
{
int i = -1;
if (!File.Exists(filePath))
{
LogsAdd("DES失败:指定文件 " + filePath + " 找不到.");
return i;
}
byte[] inputByteArray = null;
FileStream fileStream;
try
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write))
{
fileStream = File.OpenRead(filePath);
using (BinaryReader binaryReader = new BinaryReader(fileStream))
{
inputByteArray = new byte[fileStream.Length];
binaryReader.Read(inputByteArray, 0, inputByteArray.Length);
}
cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);
cryptoStream.FlushFinalBlock();
using (fileStream = File.OpenWrite(savePath))
{
memoryStream.WriteTo(fileStream);
}
}
}
LogsAdd("DES成功!");
return 1;
}
catch (Exception ex)
{
LogsAdd("DES失败:" + ex.Message);
return i;
}
}
///// <summary>
///// DES保存文件
///// </summary>
///// <param name="savePath"></param>
///// <param name="memoryStream"></param>
//private static void SaveFile(string savePath, MemoryStream memoryStream)
//{
// using (FileStream fileStream = File.OpenWrite(savePath))
// {
// memoryStream.WriteTo(fileStream);
// }
//}
///// <summary>
///// DES读取文件内容为字节
///// </summary>
///// <param name="filePath"></param>
///// <returns></returns>
//private static byte[] ReadFileAsBytes(string filePath)
//{
// FileStream fileStream = File.OpenRead(filePath);
// using (BinaryReader binaryReader = new BinaryReader(fileStream))
// {
// byte[] inputByteArray = new byte[fileStream.Length];
// binaryReader.Read(inputByteArray, 0, inputByteArray.Length);
// return inputByteArray;
// }
//}
#endregion