这篇文章主要介绍了C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例,每次解密时从密文中截取前16位,这就是实现随机的奥秘,本文同时给出了实现代码,需要的朋友可以参考下
思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前16位,其实就是我们之前加密的随机向量。
代码:
- public static string Encrypt(string plainText, string AESKey)
- {
- RijndaelManaged rijndaelCipher = new RijndaelManaged();
- byte[] inputByteArray = Encoding.UTF8.GetBytes(plainText);//得到需要加密的字节数组
- rijndaelCipher.Key = Convert.FromBase64String(AESKey);//加解密双方约定好密钥:AESKey
- rijndaelCipher.GenerateIV();
- byte[] keyIv = rijndaelCipher.IV;
- byte[] cipherBytes = null;
- using (MemoryStream ms = new MemoryStream())
- {
- using (CryptoStream cs = new CryptoStream(ms, rijndaelCipher.CreateEncryptor(), CryptoStreamMode.Write))
- {
- cs.Write(inputByteArray, 0, inputByteArray.Length);
- cs.FlushFinalBlock();
- cipherBytes = ms.ToArray();//得到加密后的字节数组
- cs.Close();
- ms.Close();
- }
- }
- var allEncrypt = new byte[keyIv.Length + cipherBytes.Length];
- Buffer.BlockCopy(keyIv, 0, allEncrypt, 0, keyIv.Length);
- Buffer.BlockCopy(cipherBytes, 0, allEncrypt, keyIv.Length * sizeof(byte), cipherBytes.Length);
- return Convert.ToBase64String(allEncrypt);
- }
- public static string Decrypt(string showText, string AESKey)
- {
- string result = string.Empty;
- try
- {
- byte[] cipherText = Convert.FromBase64String(showText);
- int length = cipherText.Length;
- SymmetricAlgorithm rijndaelCipher = Rijndael.Create();
- rijndaelCipher.Key = Convert.FromBase64String(AESKey);//加解密双方约定好的密钥
- byte[] iv = new byte[16];
- Buffer.BlockCopy(cipherText, 0, iv, 0, 16);
- rijndaelCipher.IV = iv;
- byte[] decryptBytes = new byte[length - 16];
- byte[] passwdText = new byte[length - 16];
- Buffer.BlockCopy(cipherText, 16, passwdText, 0, length - 16);
- using (MemoryStream ms = new MemoryStream(passwdText))
- {
- using (CryptoStream cs = new CryptoStream(ms, rijndaelCipher.CreateDecryptor(), CryptoStreamMode.Read))
- {
- cs.Read(decryptBytes, 0, decryptBytes.Length);
- cs.Close();
- ms.Close();
- }
- }
- result = Encoding.UTF8.GetString(decryptBytes).Replace("/0", ""); ///将字符串后尾的'/0'去掉
- }
- catch { }
- return result;
- }
调用:
- string jiaMi = MyAESTools.Encrypt(textBox1.Text, "abcdefgh12345678abcdefgh12345678");
- string jieMi = MyAESTools.Decrypt(textBox3.Text, "abcdefgh12345678abcdefgh12345678");
|
新闻热点
疑难解答