RSA加密

简介:

1. RSA加密算法是一种非对称可逆加密算法。公钥公开,私钥保密,它的加密解密算法是公开的。公钥负责加密,私钥负责解密。

2. 它既能用于加密,也能用于数字签名。

2.1 数字签名 :签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过。数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。数字签名是个加密的过程,数字签名验证是个解密的过程。

  /// <summary>
  /// 非对称加密算法RSA
  /// </summary>
  public static class RSA
  {
    /// <summary>
    /// 要使用的密钥的大小(以位为单位)
    /// </summary>
    public enum KeySize : int
    {
      Key1024 = 1024,
      Key2048 = 2048,
      Key3072 = 3072,
      Key7680 = 7680,
      Key15360 = 15360,

    }

    /// <summary>
    /// RSA秘钥
    /// </summary>
    public class RSAKeys
    {
      /// <summary>
      /// 公钥
      /// </summary>
      public string PublicKey;
      /// <summary>
      /// 私钥
      /// </summary>
      public string PrivateKey;
    }

    /// <summary>
    /// 生成 RSA 公钥和私钥
    /// </summary>
    /// <param name="keySize">要使用的密钥的大小(以位为单位)</param>
    /// <returns></returns>
    public static RSAKeys CreateRSAKeys(KeySize keySize)
    {
      RSAKeys rsaKeys = new RSAKeys();
      using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider((int)keySize))
      {
        rsaKeys.PublicKey = rsa.ToXmlString(false);
        rsaKeys.PrivateKey = rsa.ToXmlString(true);
        return rsaKeys;
      }
    }

    /// <summary>
    /// 生成 RSA 公钥和私钥XML文件
    /// </summary>
    /// <param name="keySize">要使用的密钥的大小(以位为单位)</param>
    /// <param name="savePrivateFile">保存私钥文件的物理路径</param>
    /// <param name="savePublicFile">保存公钥文件的物理路径</param>
    /// <returns></returns>
    public static void CreateRSAKeysXml(KeySize keySize, string savePrivateFile, string savePublicFile)
    {
      RSAKeys rsaKeys = CreateRSAKeys(keySize);
      using (StreamWriter writer = new StreamWriter(savePrivateFile))
      {
        writer.WriteLine(rsaKeys.PrivateKey);
      }
      using (StreamWriter writer = new StreamWriter(savePublicFile))
      {
        writer.WriteLine(rsaKeys.PublicKey);
      }
    }

    /// <summary>
    /// RSA加密
    /// </summary>
    /// <param name="publickey"> 公钥 </param>
    /// <param name="data"> 待加密的内容 </param>
    /// <param name="privatekey"> 以指定编码方式加载明文</param>
    /// <returns> 加密后的密文 </returns>
    public static string RSAEncrypt(string data, string publickey, Encoding dataEncoding)
    {
      using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
      {
        rsa.FromXmlString(publickey);
        byte[] encryptBytes = rsa.Encrypt(dataEncoding.GetBytes(data), false);
        return Convert.ToBase64String(encryptBytes);
      }
    }

    /// <summary>
    /// RSA解密
    /// </summary>
    /// <param name="data"> 要解密的密文 </param>
    /// <param name="privatekey"> 私钥 </param>
    /// <param name="privatekey"> 解密后以指定编码方式返回 </param>
    /// <returns> 解密后的明文 </returns>
    public static string RSADecrypt(string data, string privatekey, Encoding dataEncoding)
    {
      using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
      {
        rsa.FromXmlString(privatekey);
        byte[] decryptBytes = rsa.Decrypt(Convert.FromBase64String(data), false);
        return dataEncoding.GetString(decryptBytes);
      }
    }

  }

 

posted @ 2019-05-01 15:54  唧唧复唧唧木兰当户织  阅读(871)  评论(0编辑  收藏  举报