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");