少见的C# RSA算法

 更新时间:2020年06月02日 16:40:44   作者:蝴蝶刀刀  
这篇文章主要介绍了非常少见的C# RSA算法,文章简单易懂,实例代码帮助大家更好的学习,感兴趣的朋友可以了解下

当下最流行的RSA加密算法,只有公钥和私钥同时拥有才能破解加密信息,RSA加密算法的出现有利于数据安全性传输

1.C#中自带RSACryptoServiceProvider类可以让你很好的生成XML格式的公钥和私钥,两句代码就搞定

2.但是生成的XML格式前端不能很好的利用和读懂,所以在生成的XML格式里需要转换成PEM格式,这样才能直接Copy到验证工具里加密解密,非常方便

首先,我们先导入一个第三方库,因为下面涉及到的转换代码都是需要依赖这个库来实现,导入操作如下

控制台里输入

PM > Install-Package BouncyCastle

导入到引用里面

3.好了,下面就是纯代码实现了,目的就是将XML格式转换为PEM格式,无论公钥还是私钥,不罗嗦直接代码走起

 static void Main(string[] args) {
  RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();  string xmlPrivateKey = rsa.ToXmlString(true);//XML密钥
  string pemPrivateKey = Xml2PemPrivate(xmlPrivateKey, "F:/privatePEM.txt");//PEM密钥

  string xmlPublicKey = rsa.ToXmlString(false);//XML公钥
  string pemPublicKey = Xml2PemPublic(xmlPublicKey, "F:/publicPEM.txt");//PEM密钥
 } /// <summary>
 /// XML格式公钥转PEM格式公钥
 /// </summary>
 /// <param name="xml">XML格式的公钥</param>
 /// <param name="saveFile">保存文件的物理路径</param>
 public static string Xml2PemPublic(string xml, string saveFile) {  var rsa = new RSACryptoServiceProvider();
  rsa.FromXmlString(xml);  var p = rsa.ExportParameters(false);
  RsaKeyParameters key = new RsaKeyParameters(false, new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent));  using (var sw = new StreamWriter(saveFile))
  {  var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(sw);
  pemWriter.WriteObject(key);
  }

  SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(key);  byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();  string publicKey = Convert.ToBase64String(serializedPublicBytes);  return Format(publicKey, 1);
 } /// <summary>
 /// XML格式私钥转PEM
 /// </summary>
 /// <param name="xml">XML格式私钥</param>
 /// <param name="saveFile">保存文件的物理路径</param>
 public static string Xml2PemPrivate(string xml, string saveFile) {  var rsa = new RSACryptoServiceProvider();
  rsa.FromXmlString(xml);  var p = rsa.ExportParameters(true);  var key = new RsaPrivateCrtKeyParameters(  new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent), new BigInteger(1, p.D),  new BigInteger(1, p.P), new BigInteger(1, p.Q), new BigInteger(1, p.DP), new BigInteger(1, p.DQ),  new BigInteger(1, p.InverseQ));  using (var sw = new StreamWriter(saveFile))
  {  var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(sw);
  pemWriter.WriteObject(key);
  }

  PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(key);  byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();  string privateKey = Convert.ToBase64String(serializedPrivateBytes);  return Format(privateKey, 2);
 } /// <summary>
 /// 格式化公钥/私钥
 /// </summary>
 /// <param name="key">生成的公钥/私钥</param>
 /// <param name="type">1:公钥 2:私钥</param>
 /// <returns>PEM格式的公钥/私钥</returns>
 public static string Format(string key, int type) {  string result = string.Empty;  int length = key.Length / 64;  for (int i = 0; i < length; i++)
  {  int start = i * 64;
  result = result + key.Substring(start, 64) + "\r\n";
  }

  result = result + key.Substring(length * 64);  if (type == 1)
  {
  result = result.Insert(0, "-----BEGIN PUBLIC KEY-----\r\n");
  result += "\r\n-----END PUBLIC KEY-----";
  }  if (type == 2)
  {
  result = result.Insert(0, "-----BEGIN PRIVATE KEY-----\r\n");
  result += "\r\n-----END PRIVATE KEY-----";
  }  return result;
 }

4.最后输出在F盘的TXT文件里面就是可以直接用来Copy到验证工具里面直接加密/解密数据用的

人说,如果你很想要一样东西,就放它走 。如果它回来找你,那么它永远都是你的。要是它没有回来,那么不用再等了,因为它根本就不是你的。 ——伊恩·麦克尤恩

以上就是少见的C# RSA算法的详细内容,更多关于C# RSA算法的资料请关注脚本之家其它相关文章!

相关文章

  • C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法

    C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法

    这篇文章主要介绍了C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法,结合实例形式分析了WinForm图片重叠后造成图片不透明的原因与相应的解决方法,需要的朋友可以参考下
    2016-06-06
  • C#实现学生管理系统

    C#实现学生管理系统

    这篇文章主要为大家详细介绍了C#实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 浅析WPF中ToolTip工具提示的应用

    浅析WPF中ToolTip工具提示的应用

    在日常应用中,当鼠标放置在某些控件上时,都会有相应的信息提示,从软件易用性上来说,这是一个非常友好的功能设计,本文就来和大家简单聊聊WPF中ToolTip工具提示的相关使用,有兴趣的可以了解下
    2023-12-12
  • C#过滤DataTable中空数据和重复数据的示例代码

    C#过滤DataTable中空数据和重复数据的示例代码

    这篇文章主要给大家介绍了关于C#过滤DataTable中空数据和重复数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 秒表计时器以及STOPWATCH(实例讲解)

    秒表计时器以及STOPWATCH(实例讲解)

    下面小编就为大家分享一篇秒表计时器以及STOPWATCH(实例讲解),具有很好的参考价值,希望对大家有所帮助
    2017-11-11
  • PC蓝牙通信C#代码实现

    PC蓝牙通信C#代码实现

    这篇文章主要为大家详细介绍了PC蓝牙通信C#代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • C#实现网络通信共享库NetShare的使用示例

    C#实现网络通信共享库NetShare的使用示例

    本文主要介绍了C#实现网络通信共享库NetShare,网络通信共享库NetShare用于保证客户端与服务器通信数据包的规范和统一,感兴趣的可以了解一下
    2023-11-11
  • 使用C#的正则表达式验证中文字符(实例代码)

    使用C#的正则表达式验证中文字符(实例代码)

    本文通过实例代码给大家介绍了使用C#的正则表达式验证中文字符的方法,需要的的朋友参考下吧
    2017-07-07
  • C#开发Winform实现文件操作案例

    C#开发Winform实现文件操作案例

    这篇文章介绍了C#开发Winform实现文件操作的案例,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#中实现AES算法加密解读

    C#中实现AES算法加密解读

    这篇文章主要介绍了C#中实现AES算法加密实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论