有时间我们在做数据传输的时候,特别是api接口调用并传输数据时,需要加密
废话不多说直接上代码
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Utils
{
public class AesTool
{
private string key = "abcde234123@#ew9182h4r1238132&AUIFQEIfaidsfnqeiqewrndsifqnwqiwernqewiqeiqe";
private string iv = "s9afn1@#$!#asdfiqwnerasidfnqwiesndaf912#$!@341";
///
private string encrption(string input, string key, string iv)
{
MemoryStream msEncrypt = null;
RijndaelManaged aesAlg = null;
string sresult = string.Empty;
try
{
byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);
aesAlg = new RijndaelManaged();
aesAlg.Key = keys;
aesAlg.IV = ivs;
ICryptoTransform ict = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
msEncrypt = new MemoryStream();
using (CryptoStream cts = new CryptoStream(msEncrypt, ict, CryptoStreamMode.Write))
{
using (StreamWriter sw = new StreamWriter(cts))
{
sw.Write(input);
}
}
}
finally
{
if (aesAlg != null)
{
aesAlg.Dispose();
aesAlg.Clear();
}
}
if (msEncrypt != null)
{
byte[] content = msEncrypt.ToArray();
sresult = Convert.ToBase64String(content);
}
return sresult;
}
private string decrption(string input, string key, string iv)
{
string sresult = string.Empty;
byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);
byte[] inputbytes = Convert.FromBase64String(input);
RijndaelManaged rm = null;
try
{
rm = new RijndaelManaged();
rm.Key = keys;
rm.IV = ivs;
ICryptoTransform ict = rm.CreateDecryptor(rm.Key, rm.IV);
using (MemoryStream ms = new MemoryStream(inputbytes))
{
using (CryptoStream cs = new CryptoStream(ms, ict, CryptoStreamMode.Read))
{
using (StreamReader sr = new StreamReader(cs))
{
sresult = sr.ReadToEnd();
}
}
}
}
finally
{
if (rm != null)
{
rm.Dispose();
rm.Clear();
}
}
return sresult;
}
//默认密钥向量
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 = "123456")
{
byte[] byteArray = Encoding.UTF8.GetBytes(plainText);
Byte[] bKey = new Byte[32];
Array.Copy(Encoding.UTF8.GetBytes(strKey.PadRight(bKey.Length)), bKey, bKey.Length);
RijndaelManaged rDel = new RijndaelManaged();
// rDel.Key = Encoding.UTF8.GetBytes(strKey);
rDel.Key = bKey;
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 = "123456")
{
byte[] byteArray = Convert.FromBase64String(cipherText);
Byte[] bKey = new Byte[32];
Array.Copy(Encoding.UTF8.GetBytes(strKey.PadRight(bKey.Length)), bKey, bKey.Length);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = bKey;
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;
}
#region AES 加密/解密
/// <summary>
/// AES 加密
/// </summary>
/// <param name="str">明文(待加密)</param>
/// <param name="key">密文</param>
/// <returns></returns>
public static string AesEncryptToHex(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str); //命名空间: using System.Text;
System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = System.Security.Cryptography.CipherMode.ECB,
Padding = System.Security.Cryptography.PaddingMode.PKCS7
};
System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
var hex = BitConverter.ToString(resultArray, 0).Replace("-", string.Empty).ToLower();
return hex;
}
/// <summary>
/// AES 解密
/// </summary>
/// <param name="str">明文(待解密)</param>
/// <param name="key">密文</param>
/// <returns></returns>
public static string AesDecryptFromHex(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
var toEncryptArray = new byte[str.Length / 2];
for (var x = 0; x < toEncryptArray.Length; x++)
{
var i = Convert.ToInt32(str.Substring(x * 2, 2), 16);
toEncryptArray[x] = (byte)i;
}
//Byte[] toEncryptArray = Convert.FromBase64String(str);
System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = System.Security.Cryptography.CipherMode.ECB,
Padding = System.Security.Cryptography.PaddingMode.PKCS7
};
System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
#endregion
}
}
调用
//加密密匙
string key = "adhakdhakfai78123871";
//要加密的明文数据
stirng data="admin=张三|age=23|phone=13167898877";
//加密
string str = AesTool.AesEncryptToHex(data,key);
//解密
string str2= AesTool.AesDecryptFromHex(str,key);
if(data == str2){
//前后相同
}