少见的C# RSA算法
程序员文章站
2022-04-29 09:52:31
当下最流行的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算法的资料请关注其它相关文章!