[C#] 纯文本查看 复制代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace Common
{
/// <summary>
/// 加密
/// </summary>
public class EncryptHelper
{
#region MD5加密
/// <summary>
/// GetMD5
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string EncryptMD5(string source)
{
byte[] b = System.Text.Encoding.Default.GetBytes(source);
b = new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(b);
string ret = "";
for (int i = 0; i < b.Length; i++)
{
ret += b[i].ToString("x").PadLeft(2, '0');
}
return ret;
}
/// <summary>
/// 用MD5加密,全大写
/// </summary>
/// <param name="source">待加密字符串</param>
/// <returns>加密后字符串</returns>
public static string EncryptMD5ToUpper(string source)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(source, "md5").ToUpper();
}
#endregion
#region DES加密
//默认密钥向量
private static byte[] Keys = { 0xEF, 0xAB, 0x56, 0x78, 0x90, 0x34, 0xCD, 0x12 };
/// <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.Substring(0, 8));
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
#region SHA1加密
/// <summary>
/// use sha1 to encrypt string
/// </summary>
public static string EncryptSHA1(string source)
{
byte[] StrRes = Encoding.Default.GetBytes(source);
HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
StrRes = iSHA.ComputeHash(StrRes);
StringBuilder EnText = new StringBuilder();
foreach (byte iByte in StrRes)
{
EnText.AppendFormat("{0:x2}", iByte);
}
return EnText.ToString();
}
#endregion
#region RSA加密
/// <summary>
/// RSA加密
/// </summary>
/// <param name="publickey"></param>
/// <param name="content"></param>
/// <returns></returns>
public static string EncryptRSA(string publickey, string content)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(publickey);
cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
return Convert.ToBase64String(cipherbytes);
}
/// <summary>
/// RSA解密
/// </summary>
/// <param name="privatekey"></param>
/// <param name="content"></param>
/// <returns></returns>
public static string DecryptRSA(string privatekey, string content)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(privatekey);
cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
return Encoding.UTF8.GetString(cipherbytes);
}
#endregion
#region AES加密
/*
* 跨程序使用AES加密,需要注意运算模式和填充模式;
* 比如java
* 需要设置
* Mode = CipherMode.ECB; //C#默认运算模式为CBC,java默认为ECB,因此要将C#的加密方式改为ECB
* Padding = PaddingMode.PKCS7; //设置为PKCS7,否则解密后字符串结尾会出现多余字符
* 测试地址:http://www.seacha.com/tools/aes.html
*/
//默认密钥向量
private static byte[] _Aeskey = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
/// <summary>
/// AES加密,返回Base64编码后的字符
/// </summary>
/// <param name="plainText">明文字符串</param>
/// <param name="strKey">密钥</param>
/// <returns>返回加密后的Base64编码字符串</returns>
public static string EncryptAES(string plainText, string strKey)
{
byte[] byteArray = Encoding.UTF8.GetBytes(plainText);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = Encoding.UTF8.GetBytes(strKey);
rDel.IV = _Aeskey;
rDel.BlockSize = 128;
rDel.Mode = CipherMode.ECB;//设置为ECB
rDel.Padding = PaddingMode.PKCS7;//设置为PKCS7,否则解密后字符串结尾会出现多余字符
ICryptoTransform cTransform = rDel.CreateEncryptor();
var s = cTransform.TransformFinalBlock(byteArray, 0, byteArray.Length);
var encrypt = Convert.ToBase64String(s);
rDel.Clear();
return encrypt;
}
/// <summary>
/// AES解密,返回解密后的字符串
/// </summary>
/// <param name="cipherText">Base64编码的密文</param>
/// <param name="strKey">密钥</param>
/// <returns>返回解密后的字符串</returns>
public static string DecryptAES(string cipherText, string strKey)
{
byte[] byteArray = Convert.FromBase64String(cipherText);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = Encoding.UTF8.GetBytes(strKey);
rDel.IV = _Aeskey;
rDel.BlockSize = 128;
rDel.Mode = CipherMode.ECB;//必须设置为ECB
rDel.Padding = PaddingMode.PKCS7;//必须设置为PKCS7
ICryptoTransform cTransform = rDel.CreateDecryptor();
var s = cTransform.TransformFinalBlock(byteArray, 0, byteArray.Length);
var decrypt = Encoding.UTF8.GetString(s);
rDel.Clear();
return decrypt;
}
#endregion
#region Base64编码
public static string EncryptBase64(string source)
{
byte[] bytes = Encoding.Default.GetBytes(source);
return Convert.ToBase64String(bytes);
}
public static string EncryptBase64(byte[] bytes)
{
return Convert.ToBase64String(bytes);
}
public static string DecryptBase64(string source)
{
byte[] outputb = Convert.FromBase64String(source);
return Encoding.Default.GetString(outputb);
}
#endregion
#region RSA-SHA1 数字签名
/// <summary>
/// 数字签名
/// </summary>
/// <param name="plaintext">原文</param>
/// <param name="privateKey">私钥</param>
/// <returns>Base64 签名</returns>
public static string HashAndSignString(string plaintext, string privateKey)
{
UTF8Encoding ByteConverter = new UTF8Encoding();
byte[] dataToEncrypt = ByteConverter.GetBytes(plaintext);
using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider())
{
RSAalg.FromXmlString(privateKey);
//使用SHA1进行摘要算法,生成签名
byte[] encryptedData = RSAalg.SignData(dataToEncrypt, new SHA1CryptoServiceProvider());
return Convert.ToBase64String(encryptedData);
}
}
/// <summary>
/// 验证签名
/// </summary>
/// <param name="plaintext">原文</param>
/// <param name="SignedData">Base64 签名</param>
/// <param name="publicKey">公钥</param>
/// <returns></returns>
public static bool VerifySigned(string plaintext, string SignedData, string publicKey)
{
try
{
using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider())
{
RSAalg.FromXmlString(publicKey);
UTF8Encoding ByteConverter = new UTF8Encoding();
byte[] dataToVerifyBytes = ByteConverter.GetBytes(plaintext);
byte[] signedDataBytes = Convert.FromBase64String(SignedData);
return RSAalg.VerifyData(dataToVerifyBytes, new SHA1CryptoServiceProvider(), signedDataBytes);
}
}
catch (Exception)
{
return false;
}
}
#endregion
}
}