using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Utils
{
public partial class StringHelper
{
///
/// 中英文加密
///
/// 要加密的字体串
///
public static string EncryptMD5(string instr)
{
string result;
try
{
byte[] toByte = Encoding.Default.GetBytes(instr);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
toByte = md5.ComputeHash(toByte);
result = BitConverter.ToString(toByte).Replace("-", "");
}
catch
{
result = string.Empty;
}
return result;
}
///
/// 指定字节流编码计算MD5哈希值,可解决不同系统中文编码差异的问题。
///
/// 要进行哈希的字符串
/// 获取字符串字节流的编码,如果是中文,不同系统之间务必请使用相同编码
/// 32位大写MD5哈希值
public static string ComputeMD5(string source, Encoding bytesEncoding)
{
byte[] sourceBytes = bytesEncoding.GetBytes(source);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] hashedBytes = md5.ComputeHash(sourceBytes);
StringBuilder buffer = new StringBuilder(hashedBytes.Length);
foreach (byte item in hashedBytes)
{
buffer.AppendFormat("{0:X2}", item);
}
return buffer.ToString();
}
#region 加密解密,可以设置密钥
///
/// 可以设置密钥的加密方式
///
/// 原文
/// 密钥,8位数字,字符串方式
///
public static string Encrypt(string sourceData, string key)
{
#region 检查密钥是否符合规定
if (key.Length > 8)
{
key = key.Substring(0, 8);
}
#endregion
Byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
Byte[] keys = System.Text.Encoding.UTF8.GetBytes(key.Substring(0, key.Length));
try
{
//convert data to byte array
Byte[] sourceDataBytes = System.Text.ASCIIEncoding.UTF8.GetBytes(sourceData);
//get target memory stream
MemoryStream tempStream = new MemoryStream();
//get encryptor and encryption stream
DESCryptoServiceProvider encryptor = new DESCryptoServiceProvider();
CryptoStream encryptionStream = new CryptoStream(tempStream, encryptor.CreateEncryptor(keys, iv), CryptoStreamMode.Write);
//encrypt data
encryptionStream.Write(sourceDataBytes, 0, sourceDataBytes.Length);
encryptionStream.FlushFinalBlock();
//put data into byte array
Byte[] encryptedDataBytes = tempStream.GetBuffer();
//convert encrypted data into string
return System.Convert.ToBase64String(encryptedDataBytes, 0, (int)tempStream.Length);
}
catch (Exception ex)
{
throw (ex);
}
}
///
/// 根据知道的密钥解密
///
/// 密文
/// 密钥,8位数字,字符串方式
///
public static string Decrypt(string sourceData, string key)
{
#region 检查密钥是否符合规定
if (key.Length > 8)
{
key = key.Substring(0, 8);
}
#endregion
Byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
Byte[] keys = System.Text.Encoding.UTF8.GetBytes(key.Substring(0, key.Length));
try
{
Byte[] encryptedDataBytes = System.Convert.FromBase64String(sourceData);
using (MemoryStream tempStream = new MemoryStream(encryptedDataBytes, 0, encryptedDataBytes.Length))
{
using (DESCryptoServiceProvider decryptor = new DESCryptoServiceProvider())
{
using (
CryptoStream decryptionStream = new CryptoStream(tempStream,
decryptor.CreateDecryptor(keys, iv), CryptoStreamMode.Read))
{
using (StreamReader allDataReader = new StreamReader(decryptionStream))
{
return allDataReader.ReadToEnd();
}
}
}
}
}
catch (Exception ex)
{
throw;
}
}
#endregion
[Obsolete("方法名写错了,请用ASP16MD5", false)]
public static string ASP18MD5(string instr)
{
return EncryptMD5(instr).Substring(8, 16).ToLower();
}
///
/// 16位md5加密,返回小写
///
/// 要加密的字体串
///
public static string ASP16MD5(string instr)
{
return EncryptMD5(instr).Substring(8, 16).ToLower();
}
}
}