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

思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前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");
(0)

相关推荐

  • C#实现的AES加密解密完整实例

    本文实例讲述了C#实现的AES加密解密.分享给大家供大家参考,具体如下: /****************************************************************** * 创建人:HTL * 说明:C# AES加密解密 *******************************************************************/ using System; using System.Security.Cryptography;

  • C# 3DES加密详解

    最近一个项目中,因为服务端是用的java开发的,客户端是用的C#,由于通信部分采用到了3DES加密,所以做个记录,以备以后需要的时候直接用. 这是对方(java)的加密算法,和网上流传的代码也差不多(主密钥直接写死了,方便测试) package org.zwork.market.mina.msg; import java.security.spec.KeySpec; import javax.crypto.Cipher; import javax.crypto.SecretKey; import

  • C#代码实现对AES加密解密

    ES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范.它被预期能成为人们公认的加密包括金融.电信和政府数字信息的方法. 本文实例为大家介绍C#实现对AES加密解密的详细代码,分享给大家供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cry

  • C#使用DES和AES实现加密解密功能示例

    本文实例讲述了C#使用DES和AES实现加密解密功能.分享给大家供大家参考,具体如下: using System; using System.Text; using System.Security.Cryptography; using System.IO; namespace MyCryptography { /// <summary> /// DES加密解密 /// </summary> public class DES { /// <summary> /// 获取

  • C#的3DES加密解密算法实例代码

    C#类如下: 复制代码 代码如下: using System;using System.Collections.Generic;using System.Text;using System.Security.Cryptography;using System.IO; namespace ConsoleApplication1{    /// <summary>    /// 加解密类    /// </summary>    public class EncryptHelper  

  • C# DES加密算法中向量的作用详细解析

    DES一共就有4个参数参与运作:明文.密文.密钥.向量.为了初学者容易理解,可以把4个参数的关系写成:密文=明文+密钥+向量:明文=密文-密钥-向量.为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复,那么这个词加上密钥形成的密文,仍然会重复,这给破解者有机可乘,破解者可以根据重复的内容,猜出是什么词,然而一旦猜对这个词,那么,他就能算出密钥,整篇文章就被破解了!加上向量这个参数以后,每块文字段都会依次加上一段值,这样,即使相同的文字,加密出来的密文,也是不一样的,算法的安全性大大提高!

  • C#实现对AES加密和解密的方法

    AES简介 AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范.它被预期能成为人们公认的加密包括金融.电信和政府数字信息的方法. AES 是一个新的可以用于保护电子数据的加密算法.明确地说,AES 是一个迭代的.对称密钥分组的密码,它可以使用128.192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据.与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据.通过分组密码返回的加密数据

  • Javascript C#真正可以交互的DES加解密代码

    因项目需要,要用js加密后,提交给C#解密, 在网上找了半天,网上有无数个版本,却找不到一个能互相使用的 甚至就连都是js版本的,都不能互通,汗一个. 因为时间关系,没有去深究加密代码,就随便下载了一个JS版本的, 并把它改写成C#版本的 这样JS加密后的结果,C#也能解密 反之C#加密后的结果,JS也能解密 我把它发出来给大家共享吧 注:源代码是VS.Net2008版本创建的,里面包含js的加解密函数和C#的加解密函数 如果你找到什么bug,或有啥好建议,不妨联系一下俺,呵呵: btw:在改写

  • C#编写DES加密、解密类

    这个C#类封装的DES加密解密,可以使用默认秘钥进行加密.解密,也可以自定义秘钥进行加密.解密,调用简单方便. 示例一: using System; using System.Security.Cryptography; using System.Text; namespace DotNet.Utilities { /// <summary> /// DES加密/解密类. /// </summary> public class DESEncrypt { public DESEncr

  • c#通过DES加密算法加密大文件的方法

    本文实例讲述了c#通过DES加密算法加密大文件的方法.分享给大家供大家参考.具体实现方法如下: using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using Syst

随机推荐