欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

少见的C# RSA算法

程序员文章站 2022-09-02 08:54:38
当下最流行的rsa加密算法,只有公钥和私钥同时拥有才能破解加密信息,rsa加密算法的出现有利于数据安全性传输1.c#中自带rsacryptoserviceprovider类可以让你很好的生成xml格式...

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

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

少见的C# RSA算法

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

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

少见的C# RSA算法

控制台里输入

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# rsa 算法