C#实现加密与解密详解

  ///

  /// 获取加密所使用的key,RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

  ///

  public static void GetKey()

  {

  string PublicKey = string.Empty;

  string PrivateKey = string.Empty;

  RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();

  PublicKey = rSACryptoServiceProvider.ToXmlString(false);

  // 获取公匙,用于加密

  PrivateKey = rSACryptoServiceProvider.ToXmlString(true);

  // 获取公匙和私匙,用于解密

  //Console.WriteLine("PublicKey is {0}", PublicKey); // 输出公匙

  //Console.WriteLine("PrivateKey is {0}", PrivateKey); // 输出密匙

  //密匙中含有公匙,公匙是根据密匙进行计算得来的。

  using (StreamWriter streamWriter = new StreamWriter("PublicKey.xml"))

  {

  streamWriter.Write(rSACryptoServiceProvider.ToXmlString(false));// 将公匙保存到运行目录下的PublicKey

  }

  using (StreamWriter streamWriter = new StreamWriter("PrivateKey.xml"))

  {

  streamWriter.Write(rSACryptoServiceProvider.ToXmlString(true)); // 将公匙&私匙保存到运行目录下的PrivateKey

  }

  }

  ///

  /// 加密

  ///

  private static string Encryption(string str)

  {

  RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();

  using (StreamReader streamReader = new StreamReader("PublicKey.xml")) // 读取运行目录下的PublicKey.xml

  {

  rSACryptoServiceProvider.FromXmlString(streamReader.ReadToEnd()); // 将公匙载入进RSA实例中

  }

  byte[] buffer = Encoding.UTF8.GetBytes(str); // 将明文转换为byte[]

  // 加密后的数据就是一个byte[] 数组,可以以 文件的形式保存 或 别的形式(网上很多教程,使用Base64进行编码化保存)

  byte[] EncryptBuffer = rSACryptoServiceProvider.Encrypt(buffer, false); // 进行加密

  return Convert.ToBase64String(EncryptBuffer); // 如果使用base64进行明文化,在解密时 需要再次将base64 转换为byte[]

  }

  ///

  /// 解密

  ///

  private static string Decrypt(string strEncryptBase64)

  {

  RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider();

  using (StreamReader streamReader = new StreamReader("PrivateKey.xml")) // 读取运行目录下的PrivateKey.xml

  {

  rSACryptoServiceProvider.FromXmlString(streamReader.ReadToEnd()); // 将私匙载入进RSA实例中

  }

  byte[] buffer = Convert.FromBase64String(strEncryptBase64);

  // 解密后得到一个byte[] 数组

  byte[] DecryptBuffer = rSACryptoServiceProvider.Decrypt(buffer, false); // 进行解密

  string str = Encoding.UTF8.GetString(DecryptBuffer); // 将byte[]转换为明文

  return str;

  }