usingOrg.BouncyCastle.Asn1.Pkcs;usingOrg.BouncyCastle.Asn1.X509;usingOrg.BouncyCastle.Crypto.Parameters;usingOrg.BouncyCastle.Math;usingOrg.BouncyCastle.Pkcs;usingOrg.BouncyCastle.Security;usingOrg.BouncyCastle.X509;usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Security.Cryptography;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Xml;namespaceHema.Framework.Core
{public classEncryptUtility
{#region AES
///
///AES加密///
/// 要加密的字符
/// 对应的密钥(不可为中文,不能超过32个字符,超过32个字符的截取前32个字符)
/// 返回Base64格式的字符串
public static string AESEncrypt(string encryptString, string encryptKey, string vector = null)
{if (string.IsNullOrEmpty(encryptString))
{throw new ArgumentNullException("参数encryptString为空!");
}if (string.IsNullOrEmpty(encryptKey))
{throw new ArgumentNullException("参数encryptKey为空!");
}if (encryptKey.Length > 32)
encryptKey= encryptKey.Substring(0, 32);if (encryptKey.Length < 32)
encryptKey= encryptKey.PadRight(32, '0');
RijndaelManaged rijndaelProvider= newRijndaelManaged();
rijndaelProvider.Key=Encoding.UTF8.GetBytes(encryptKey);if (string.IsNullOrEmpty(vector))
{
rijndaelProvider.Mode=CipherMode.ECB;
}else{
rijndaelProvider.IV=Encoding.UTF8.GetBytes(vector);
}
rijndaelProvider.Padding= PaddingMode.PKCS7; //填充模式
ICryptoTransform rijndaelEncrypt =rijndaelProvider.CreateEncryptor();byte[] inputData =Encoding.UTF8.GetBytes(encryptString);byte[] encryptedData = rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length);returnConvert.ToBase64String(encryptedData);
}///
///AES解密///
/// 要解密的字符(该字符必须是已经加密过的Base64格式的字符串)
/// 解密的密钥,该密钥要和加密的密钥一致(不可为中文,不能超过32个字符,超过32个字符的截取前32个字符)
/// 解密后的字符串
public static string AESDecrypt(string decryptString, string decryptKey, string vector = null)
{if (string.IsNullOrEmpty(decryptString))
{throw new ArgumentNullException("参数encryptString为空!");
}if (string.IsNullOrEmpty(decryptKey))
{throw new ArgumentNullException("参数encryptKey为空!");
}if (decryptKey.Length > 32)
decryptKey= decryptKey.Substring(0, 32);if (decryptKey.Length < 32)
decryptKey= decryptKey.PadRight(32, '0');try{
RijndaelManaged rijndaelProvider= newRijndaelManaged();
rijndaelProvider.Key=Encoding.UTF8.GetBytes(decryptKey);if (string.IsNullOrEmpty(vector))
{
rijndaelProvider.Mode=CipherMode.ECB;
}else{
rijndaelProvider.IV=Encoding.UTF8.GetBytes(vector);
}
rijndaelProvider.Padding= PaddingMode.PKCS7; //填充模式
ICryptoTransform rijndaelDecrypt =rijndaelProvider.CreateDecryptor();byte[] inputData =Convert.FromBase64String(decryptString);byte[] decryptedData = rijndaelDecrypt.TransformFinalBlock(inputData, 0, inputData.Length);returnEncoding.UTF8.GetString(decryptedData);
}catch{return string.Empty;
}
}///
///加密文件流///
///
///
public static CryptoStream AES_EncryptStrream(FileStream fs, string decryptKey, stringvector)
{
decryptKey= GetSubString(decryptKey, 32, "");
decryptKey= decryptKey.PadRight(32, ' ');
RijndaelManaged rijndaelProvider= newRijndaelManaged();
rijndaelProvider.Key=Encoding.UTF8.GetBytes(decryptKey);
rijndaelProvider.IV=Encoding.UTF8.GetBytes(vector);
ICryptoTransform encrypto=rijndaelProvider.CreateEncryptor();
CryptoStream cytptostreamEncr= newCryptoStream(fs, encrypto, CryptoStreamMode.Write);returncytptostreamEncr;
}///
///解密文件流///
///
///
public static CryptoStream AES_DecryptStream(FileStream fs, string decryptKey, stringvector)
{
decryptKey= GetSubString(decryptKey, 32, "");
decryptKey= decryptKey.PadRight(32, ' ');
RijndaelManaged rijndaelProvider= newRijndaelManaged();
rijndaelProvider.Key=Encoding.UTF8.GetBytes(decryptKey);
rijndaelProvider.IV=Encoding.UTF8.GetBytes(vector);
ICryptoTransform Decrypto=rijndaelProvider.CreateDecryptor();
CryptoStream cytptostreamDecr= newCryptoStream(fs, Decrypto, CryptoStreamMode.Read);returncytptostreamDecr;
}///
///对指定文件加密///
///
///
///
public static bool AES_EncryptFile(string InputFile, string OutputFile, stringvector)
{try{string decryptKey = "www.iqidi.com";
FileStream fr= newFileStream(InputFile, FileMode.Open);
FileStream fren= newFileStream(OutputFile, FileMode.Create);
CryptoStream Enfr=AES_EncryptStrream(fren, decryptKey, vector);byte[] bytearrayinput = new byte[fr.Length];
fr.Read(bytearrayinput,0, bytearrayinput.Length);
Enfr.Write(bytearrayinput,0, bytearrayinput.Length);
Enfr.Close();
fr.Close();
fren.Close();
}catch{//文件异常
return false;
}return true;
}///
///对指定的文件解压缩///
///
///
///
public static bool AES_DecryptFile(string InputFile, string OutputFile, stringvector)
{try{string decryptKey = "www.iqidi.com";
FileStream fr= newFileStream(InputFile, FileMode.Open);
FileStream frde= newFileStream(OutputFile, FileMode.Create);
CryptoStream Defr=AES_DecryptStream(fr, decryptKey, vector);byte[] bytearrayoutput = new byte[1024];int m_count = 0;do{
m_count= Defr.Read(bytearrayoutput, 0, bytearrayoutput.Length);
frde.Write(bytearrayoutput,0, m_count);if (m_count
}while (true);
Defr.Close();
fr.Close();
frde.Close();
}catch{//文件异常
return false;
}return true;
}///
///按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分///
/// 源字符串
/// 所取字符串字节长度
/// 附加字符串(当字符串不够长时,尾部所添加的字符串,一般为"...")
/// 某字符串的一部分
private static string GetSubString(string sourceString, int length, stringtailString)
{return GetSubString(sourceString, 0, length, tailString);
}///
///按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分///
/// 源字符串
/// 索引位置,以0开始
/// 所取字符串字节长度
/// 附加字符串(当字符串不够长时,尾部所添加的字符串,一般为"...")
/// 某字符串的一部分
private static string GetSubString(string sourceString, int startIndex, int length, stringtailString)
{string myResult =sourceString;//当是日文或韩文时(注:中文的范围:\u4e00 - \u9fa5, 日文在\u0800 - \u4e00, 韩文为\xAC00-\xD7A3)
if (System.Text.RegularExpressions.Regex.IsMatch(sourceString, "[\u0800-\u4e00]+") ||System.Text.RegularExpressions.Regex.IsMatch(sourceString,"[\xAC00-\xD7A3]+"))
{//当截取的起始位置超出字段串长度时
if (startIndex >=sourceString.Length)
{return string.Empty;
}else{returnsourceString.Substring(startIndex,
((length+ startIndex) > sourceString.Length) ? (sourceString.Length -startIndex) : length);
}
}//中文字符,如"中国人民abcd123"
if (length <= 0)
{return string.Empty;
}byte[] bytesSource =Encoding.Default.GetBytes(sourceString);//当字符串长度大于起始位置
if (bytesSource.Length >startIndex)
{int endIndex =bytesSource.Length;//当要截取的长度在字符串的有效长度范围内
if (bytesSource.Length > (startIndex +length))
{
endIndex= length +startIndex;
}else{//当不在有效范围内时,只取到字符串的结尾
length = bytesSource.Length -startIndex;
tailString= "";
}int[] anResultFlag = new int[length];int nFlag = 0;//字节大于127为双字节字符
for (int i = startIndex; i < endIndex; i++)
{if (bytesSource[i] > 127)
{
nFlag++;if (nFlag == 3)
{
nFlag= 1;
}
}else{
nFlag= 0;
}
anResultFlag[i]=nFlag;
}//最后一个字节为双字节字符的一半
if ((bytesSource[endIndex - 1] > 127) && (anResultFlag[length - 1] == 1))
{
length= length + 1;
}byte[] bsResult = new byte[length];
Array.Copy(bytesSource, startIndex, bsResult,0, length);
myResult=Encoding.Default.GetString(bsResult);
myResult= myResult +tailString;returnmyResult;
}return string.Empty;
}#endregion}
}