C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例
思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前16位,其实就是我们之前加密的随机向量。
代码:
publicstaticstringEncrypt(stringplainText,stringAESKey)
{
RijndaelManagedrijndaelCipher=newRijndaelManaged();
byte[]inputByteArray=Encoding.UTF8.GetBytes(plainText);//得到需要加密的字节数组
rijndaelCipher.Key=Convert.FromBase64String(AESKey);//加解密双方约定好密钥:AESKey
rijndaelCipher.GenerateIV();
byte[]keyIv=rijndaelCipher.IV;
byte[]cipherBytes=null;
using(MemoryStreamms=newMemoryStream())
{
using(CryptoStreamcs=newCryptoStream(ms,rijndaelCipher.CreateEncryptor(),CryptoStreamMode.Write))
{
cs.Write(inputByteArray,0,inputByteArray.Length);
cs.FlushFinalBlock();
cipherBytes=ms.ToArray();//得到加密后的字节数组
cs.Close();
ms.Close();
}
}
varallEncrypt=newbyte[keyIv.Length+cipherBytes.Length];
Buffer.BlockCopy(keyIv,0,allEncrypt,0,keyIv.Length);
Buffer.BlockCopy(cipherBytes,0,allEncrypt,keyIv.Length*sizeof(byte),cipherBytes.Length);
returnConvert.ToBase64String(allEncrypt);
}
publicstaticstringDecrypt(stringshowText,stringAESKey)
{
stringresult=string.Empty;
try
{
byte[]cipherText=Convert.FromBase64String(showText);
intlength=cipherText.Length;
SymmetricAlgorithmrijndaelCipher=Rijndael.Create();
rijndaelCipher.Key=Convert.FromBase64String(AESKey);//加解密双方约定好的密钥
byte[]iv=newbyte[16];
Buffer.BlockCopy(cipherText,0,iv,0,16);
rijndaelCipher.IV=iv;
byte[]decryptBytes=newbyte[length-16];
byte[]passwdText=newbyte[length-16];
Buffer.BlockCopy(cipherText,16,passwdText,0,length-16);
using(MemoryStreamms=newMemoryStream(passwdText))
{
using(CryptoStreamcs=newCryptoStream(ms,rijndaelCipher.CreateDecryptor(),CryptoStreamMode.Read))
{
cs.Read(decryptBytes,0,decryptBytes.Length);
cs.Close();
ms.Close();
}
}
result=Encoding.UTF8.GetString(decryptBytes).Replace("\0","");///将字符串后尾的'\0'去掉
}
catch{}
returnresult;
}
调用:
stringjiaMi=MyAESTools.Encrypt(textBox1.Text,"abcdefgh12345678abcdefgh12345678"); stringjieMi=MyAESTools.Decrypt(textBox3.Text,"abcdefgh12345678abcdefgh12345678");