using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Ant.Service.Utility
{
public class EncodeHelper
{
#region 对称加密算法AES RijndaelManaged加密解密
private static readonly string Default_AES_Key = "@#kim123";
private static byte[] Keys = { 0x41, 0x72, 0x65, 0x79, 0x6F, 0x75, 0x6D, 0x79,
0x53,0x6E, 0x6F, 0x77, 0x6D, 0x61, 0x6E, 0x3F };
private static byte[] keyase = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
private static byte[] inputData = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f };
///
/// 对称加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是块式加密算法)
///
/// 待加密字符串
/// 加密结果字符串
public static string AES_Encrypt(string encryptString)
{
return null;
}
///
/// 对称加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是块式加密算法)
///
/// 待加密字符串
/// 加密密钥,须半角字符
/// 加密结果字符串
public static string AES_Encrypt()
{
RijndaelManaged rijndaelProvider = new RijndaelManaged();
rijndaelProvider.Key = keyase;
rijndaelProvider.IV = Keys;
ICryptoTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor();
byte[] inputData = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f };
byte[] encryptedData = rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length);
return Convert.ToBase64String(encryptedData);
}
///
/// AES加密(无向量)
///
/// 被加密的明文
/// 密钥
/// 密文
public static string AESEncrypttest()
{
MemoryStream mStream = new MemoryStream();
RijndaelManaged aes = new RijndaelManaged();
byte[] plainBytes = inputData;
//Byte[] bKey = new Byte[16];
//Array.Copy(keyase, bKey, bKey.Length);
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
aes.KeySize = 128;
//aes.Key = _key;
aes.Key = keyase;
//aes.IV = _iV;
CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateEncryptor(), CryptoStreamMode.Write);
try
{
cryptoStream.Write(plainBytes, 0, plainBytes.Length);
cryptoStream.FlushFinalBlock();
Byte[] str = new Byte[16];
str = mStream.ToArray();
return Convert.ToBase64String(str);
}
finally
{
cryptoStream.Close();
mStream.Close();
aes.Clear();
}
}
///
/// 对称加密算法AES RijndaelManaged解密字符串
///
/// 待解密的字符串
/// 解密成功返回解密后的字符串,失败返源串
public static string AES_Decrypt(string decryptString)
{
return AES_Decrypt(decryptString, Default_AES_Key);
}
///
/// 对称加密算法AES RijndaelManaged解密字符串
///
/// 待解密的字符串
/// 解密密钥,和加密密钥相同
/// 解密成功返回解密后的字符串,失败返回空
public static string AES_Decrypt(string decryptString, string decryptKey)
{
try
{
decryptKey = GetSubString(decryptKey, 32, "");
decryptKey = decryptKey.PadRight(32, ' ');
RijndaelManaged rijndaelProvider = new RijndaelManaged();
rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
rijndaelProvider.IV = Keys;
ICryptoTransform rijndaelDecrypt = rijndaelProvider.CreateDecryptor();
byte[] inputData = Convert.FromBase64String(decryptString);
byte[] decryptedData = rijndaelDecrypt.TransformFinalBlock(inputData, 0, inputData.Length);
return Encoding.UTF8.GetString(decryptedData);
}
catch
{
return string.Empty;
}
}
///
/// 按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分
///
/// 源字符串
/// 所取字符串字节长度
/// 附加字符串(当字符串不够长时,尾部所添加的字符串,一般为"...")
/// 某字符串的一部分
private static string GetSubString(string sourceString, int length, string tailString)
{
return GetSubString(sourceString, 0, length, tailString);
}
///
/// 按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分
///
/// 源字符串
/// 索引位置,以0开始
/// 所取字符串字节长度
/// 附加字符串(当字符串不够长时,尾部所添加的字符串,一般为"...")
/// 某字符串的一部分
private static string GetSubString(string sourceString, int startIndex, int length, string tailString)
{
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
{
return sourceString.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;
return myResult;
}
return string.Empty;
}
///
/// 加密文件流
///
///
///
public static CryptoStream AES_EncryptStrream(FileStream fs, string decryptKey)
{
decryptKey = GetSubString(decryptKey, 32, "");
decryptKey = decryptKey.PadRight(32, ' ');
RijndaelManaged rijndaelProvider = new RijndaelManaged();
rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
rijndaelProvider.IV = Keys;
ICryptoTransform encrypto = rijndaelProvider.CreateEncryptor();
CryptoStream cytptostreamEncr = new CryptoStream(fs, encrypto, CryptoStreamMode.Write);
return cytptostreamEncr;
}
///
/// 解密文件流
///
///
///
public static CryptoStream AES_DecryptStream(FileStream fs, string decryptKey)
{
decryptKey = GetSubString(decryptKey, 32, "");
decryptKey = decryptKey.PadRight(32, ' ');
RijndaelManaged rijndaelProvider = new RijndaelManaged();
rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
rijndaelProvider.IV = Keys;
ICryptoTransform Decrypto = rijndaelProvider.CreateDecryptor();
CryptoStream cytptostreamDecr = new CryptoStream(fs, Decrypto, CryptoStreamMode.Read);
return cytptostreamDecr;
}
///
/// 对指定文件加密
///
///
///
///
public static bool AES_EncryptFile(string InputFile, string OutputFile)
{
try
{
string decryptKey = "www.iqidi.com";
FileStream fr = new FileStream(InputFile, FileMode.Open);
FileStream fren = new FileStream(OutputFile, FileMode.Create);
CryptoStream Enfr = AES_EncryptStrream(fren, decryptKey);
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)
{
try
{
string decryptKey = "www.iqidi.com";
FileStream fr = new FileStream(InputFile, FileMode.Open);
FileStream frde = new FileStream(OutputFile, FileMode.Create);
CryptoStream Defr = AES_DecryptStream(fr, decryptKey);
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 < bytearrayoutput.Length)
break;
} while (true);
Defr.Close();
fr.Close();
frde.Close();
}
catch
{
//文件异常
return false;
}
return true;
}
#endregion
}
}