当前位置: 移动技术网 > IT编程>开发语言>c# > 少见的C# RSA算法

少见的C# RSA算法

2020年06月23日  | 移动技术网IT编程  | 我要评论
当下最流行的rsa加密算法,只有公钥和私钥同时拥有才能破解加密信息,rsa加密算法的出现有利于数据安全性传输1.c#中自带rsacryptoserviceprovider类可以让你很好的生成xml格式

当下最流行的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算法的资料请关注移动技术网其它相关文章!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网