当下最流行的rsa加密算法,只有公钥和私钥同时拥有才能破解加密信息,rsa加密算法的出现有利于数据安全性传输
1.c#中自带rsacryptoserviceprovider类可以让你很好的生成xml格式的公钥和私钥,两句代码就搞定
2.但是生成的xml格式前端不能很好的利用和读懂,所以在生成的xml格式里需要转换成pem格式,这样才能直接copy到验证工具里加密解密,非常方便
首先,我们先导入一个第三方库,因为下面涉及到的转换代码都是需要依赖这个库来实现,导入操作如下
控制台里输入
pm > install-package bouncycastle
导入到引用里面
3.好了,下面就是纯代码实现了,目的就是将xml格式转换为pem格式,无论公钥还是私钥,不罗嗦直接代码走起
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
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算法的资料请关注服务器之家其它相关文章!
原文链接:https://www.imooc.com/article/68672