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 @   唧唧复唧唧木兰当户织  阅读(931)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示