首页 > 编程 > C# > 正文

C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例

2019-10-29 21:41:46
字体:
来源:转载
供稿:网友

这篇文章主要介绍了C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例,每次解密时从密文中截取前16位,这就是实现随机的奥秘,本文同时给出了实现代码,需要的朋友可以参考下

思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前16位,其实就是我们之前加密的随机向量。

代码:

 

 
  1. public static string Encrypt(string plainText, string AESKey) 
  2. RijndaelManaged rijndaelCipher = new RijndaelManaged(); 
  3. byte[] inputByteArray = Encoding.UTF8.GetBytes(plainText);//得到需要加密的字节数组 
  4. rijndaelCipher.Key = Convert.FromBase64String(AESKey);//加解密双方约定好密钥:AESKey 
  5. rijndaelCipher.GenerateIV(); 
  6. byte[] keyIv = rijndaelCipher.IV; 
  7. byte[] cipherBytes = null
  8. using (MemoryStream ms = new MemoryStream()) 
  9. using (CryptoStream cs = new CryptoStream(ms, rijndaelCipher.CreateEncryptor(), CryptoStreamMode.Write)) 
  10. cs.Write(inputByteArray, 0, inputByteArray.Length); 
  11. cs.FlushFinalBlock(); 
  12. cipherBytes = ms.ToArray();//得到加密后的字节数组 
  13. cs.Close(); 
  14. ms.Close(); 
  15. var allEncrypt = new byte[keyIv.Length + cipherBytes.Length]; 
  16. Buffer.BlockCopy(keyIv, 0, allEncrypt, 0, keyIv.Length); 
  17. Buffer.BlockCopy(cipherBytes, 0, allEncrypt, keyIv.Length * sizeof(byte), cipherBytes.Length); 
  18. return Convert.ToBase64String(allEncrypt); 
  19.  
  20. public static string Decrypt(string showText, string AESKey) 
  21. string result = string.Empty; 
  22. try 
  23. byte[] cipherText = Convert.FromBase64String(showText); 
  24. int length = cipherText.Length; 
  25. SymmetricAlgorithm rijndaelCipher = Rijndael.Create(); 
  26. rijndaelCipher.Key = Convert.FromBase64String(AESKey);//加解密双方约定好的密钥 
  27. byte[] iv = new byte[16]; 
  28. Buffer.BlockCopy(cipherText, 0, iv, 0, 16); 
  29. rijndaelCipher.IV = iv; 
  30. byte[] decryptBytes = new byte[length - 16]; 
  31. byte[] passwdText = new byte[length - 16]; 
  32. Buffer.BlockCopy(cipherText, 16, passwdText, 0, length - 16); 
  33. using (MemoryStream ms = new MemoryStream(passwdText)) 
  34. using (CryptoStream cs = new CryptoStream(ms, rijndaelCipher.CreateDecryptor(), CryptoStreamMode.Read)) 
  35. cs.Read(decryptBytes, 0, decryptBytes.Length); 
  36. cs.Close(); 
  37. ms.Close(); 
  38. result = Encoding.UTF8.GetString(decryptBytes).Replace("/0"""); ///将字符串后尾的'/0'去掉 
  39. catch { } 
  40. return result; 

调用:

 

 
  1. string jiaMi = MyAESTools.Encrypt(textBox1.Text, "abcdefgh12345678abcdefgh12345678"); 
  2.  
  3. string jieMi = MyAESTools.Decrypt(textBox3.Text, "abcdefgh12345678abcdefgh12345678"); 
 

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表