C#代码实现对AES加密解密
ES(TheAdvancedEncryptionStandard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。
本文实例为大家介绍C#实现对AES加密解密的详细代码,分享给大家供大家参考,具体内容如下
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Security.Cryptography;
usingSystem.IO;
namespaceAESDemo
{
publicstaticclassAESHelper
{
///<summary>
///AES加密
///</summary>
///<paramname="Data">被加密的明文</param>
///<paramname="Key">密钥</param>
///<paramname="Vector">向量</param>
///<returns>密文</returns>
publicstaticByte[]AESEncrypt(Byte[]Data,StringKey,StringVector)
{
Byte[]bKey=newByte[32];
Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)),bKey,bKey.Length);
Byte[]bVector=newByte[16];
Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)),bVector,bVector.Length);
Byte[]Cryptograph=null;//加密后的密文
RijndaelAes=Rijndael.Create();
try
{
//开辟一块内存流
using(MemoryStreamMemory=newMemoryStream())
{
//把内存流对象包装成加密流对象
using(CryptoStreamEncryptor=newCryptoStream(Memory,
Aes.CreateEncryptor(bKey,bVector),
CryptoStreamMode.Write))
{
//明文数据写入加密流
Encryptor.Write(Data,0,Data.Length);
Encryptor.FlushFinalBlock();
Cryptograph=Memory.ToArray();
}
}
}
catch
{
Cryptograph=null;
}
returnCryptograph;
}
///<summary>
///AES解密
///</summary>
///<paramname="Data">被解密的密文</param>
///<paramname="Key">密钥</param>
///<paramname="Vector">向量</param>
///<returns>明文</returns>
publicstaticByte[]AESDecrypt(Byte[]Data,StringKey,StringVector)
{
Byte[]bKey=newByte[32];
Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)),bKey,bKey.Length);
Byte[]bVector=newByte[16];
Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)),bVector,bVector.Length);
Byte[]original=null;//解密后的明文
RijndaelAes=Rijndael.Create();
try
{
//开辟一块内存流,存储密文
using(MemoryStreamMemory=newMemoryStream(Data))
{
//把内存流对象包装成加密流对象
using(CryptoStreamDecryptor=newCryptoStream(Memory,
Aes.CreateDecryptor(bKey,bVector),
CryptoStreamMode.Read))
{
//明文存储区
using(MemoryStreamoriginalMemory=newMemoryStream())
{
Byte[]Buffer=newByte[1024];
Int32readBytes=0;
while((readBytes=Decryptor.Read(Buffer,0,Buffer.Length))>0)
{
originalMemory.Write(Buffer,0,readBytes);
}
original=originalMemory.ToArray();
}
}
}
}
catch
{
original=null;
}
returnoriginal;
}
}
}
不使用向量的方式:
publicstaticclassAESCrypto
{
///<summary>
///IV向量为固定值
///</summary>
//privatestaticbyte[]_iV={
//85,60,12,116,
//99,189,173,19,
//138,183,232,248,
//82,232,200,242
//};
publicstaticbyte[]Decrypt(byte[]encryptedBytes,byte[]key)
{
MemoryStreammStream=newMemoryStream(encryptedBytes);
//mStream.Write(encryptedBytes,0,encryptedBytes.Length);
//mStream.Seek(0,SeekOrigin.Begin);
RijndaelManagedaes=newRijndaelManaged();
aes.Mode=CipherMode.ECB;
aes.Padding=PaddingMode.PKCS7;
aes.KeySize=128;
aes.Key=key;
//aes.IV=_iV;
CryptoStreamcryptoStream=newCryptoStream(mStream,aes.CreateDecryptor(),CryptoStreamMode.Read);
try{
byte[]tmp=newbyte[encryptedBytes.Length+32];
intlen=cryptoStream.Read(tmp,0,encryptedBytes.Length+32);
byte[]ret=newbyte[len];
Array.Copy(tmp,0,ret,0,len);
returnret;
}
finally{
cryptoStream.Close();
mStream.Close();
aes.Clear();
}
}
publicstaticbyte[]Encrypt(byte[]plainBytes,byte[]key)
{
MemoryStreammStream=newMemoryStream();
RijndaelManagedaes=newRijndaelManaged();
aes.Mode=CipherMode.ECB;
aes.Padding=PaddingMode.PKCS7;
aes.KeySize=128;
//aes.Key=_key;
aes.Key=key;
//aes.IV=_iV;
CryptoStreamcryptoStream=newCryptoStream(mStream,aes.CreateEncryptor(),CryptoStreamMode.Write);
try
{
cryptoStream.Write(plainBytes,0,plainBytes.Length);
cryptoStream.FlushFinalBlock();
returnmStream.ToArray();
}
finally
{
cryptoStream.Close();
mStream.Close();
aes.Clear();
}
}
}
希望通过这篇文章大家对AES加密解密有所了解,对C#程序设计有所帮助。