Openssl生成RSA公私钥以及将公钥转换成C#支持的格式

Openssl生成RSA公私钥以及将公钥转换成C#支持的格式

1.RSA算法介绍

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。RSA的算法涉及三个参数,n、e、d。其中,n是两个大质数p、q的积,n被称为模数,n的二进制表示时所占用的位数,就是所谓的密钥长度。e和d是一对相关的值,e被称为公钥指数,e的值可以任意取,但要求e与(p-1)*(q-1)互质(X.509标准中建议采用65537);d被称为私钥指数,d的值要求满足(d×e)≡1(mod(p-1)×(q-1))。(n,e)两个数作为公钥使用,(n,d)两个数作为私钥使用。 RSA加解密的算法完全相同,设A为明文,B为密文,则:B=A^e(mod n)被称为加密运算;A=B^d(mod n)被称为解密运算。

2.生成私钥文件

可以通过OpenSSL的genrsa程序生成私钥文件,调用命令如下: openssl genrsa -out key.pem 1024 生成文件名为key.pem,密钥长度为1024的私钥文件,私钥文件同时包含了RSA公钥和私钥两部分。 私钥文件内容如下图所示: <img src="https://images2018.cnblogs.com/blog/1239000/201802/1239000-20180226214851724-1896418155.png" width="650px" />

3.将私钥文件转换为公钥文件

可以通过OpenSSL的genrsa程序生成私钥文件,调用命令如下:openssl rsa -in key.pem -pubout -out pubkey.pem 公钥文件包含RSA公钥,即模数n和公钥指数e。 公钥文件内容如下图所示: <img src="https://images2018.cnblogs.com/blog/1239000/201802/1239000-20180226214910023-74571132.png" width="650px" />

4.提取出私钥文件中的模,转化为C#支持的XML文件

C#有一个System.Security.Cryptography模块可以执行RSA加解密运算,可以通过XElement publickeyFromFile = XElement.Load(@"pubkey.xml")方法载入XML格式保存的RSA公钥。我编写了一个Python脚本,从前面生成的私钥文件提取出XML保存的RSA公钥。代码如下所示:

1#!/usr/bin/python 2#coding:utf-8 3 4import os 5import sys 6import base64 7 8''' 9用Openssl生成服务器私钥文件, 10并将公钥变成C#可以使用的xml格式文件 11''' 12 13def main(): 14 15 filepath = "/var/key.pem" 16 fd_pubkey = open("/var/pubkey.xml", "w") 17 os.system("/usr/bin/openssl genrsa -out %s 1024 >/dev/null 2>&1" %filepath) 18 # print filepath 19 # 提取公钥文件的模 20 # modulus = os.popen("/usr/bin/openssl rsa -in %s -pubin -modulus -noout" %filepath).read() 21 # 提取私钥文件的模 22 modulus = os.popen("/usr/bin/openssl rsa -in %s -modulus -noout" %filepath).read() 23 # print modulus 24 modulus1=modulus.split("=", 1)[1].strip() 25 st=[] 26 for i in range(len(modulus1)/2): 27 st.append(int(modulus1[i*2:(i+1)*2], 16)) 28 st1=[] 29 for i in st: 30 st1.append(chr(i)) 31 32 st1=''.join(st1) 33 modulus2=base64.b64encode(st1) 34 # print modulus2 35 exp="AQAB" 36 RSAKey="<RSAKeyValue><Modulus>"+modulus2+"</Modulus><Exponent>"+exp+"</Exponent></RSAKeyValue>" 37 fd_pubkey.write(RSAKey) 38 return 0 39 40if __name__=='__main__': 41 sys.exit(main()) 42

生成的XML文件如下所示:<br> <RSAKeyValue><Modulus>t0DhW51Tw8nWkmkO/3+Zlzf1f/DwKwAhS/nh7a/eoICCfMXV4BDUN9iZ6Kjo5KhdSMuedBdBXEM8bmhB5TEEF/4wdNkqt4hkooLRwA81XGjE9vcidEbfdm5CTU/nRSbBLm25ZaRdfmx0T5u1AiUsDyR3cNeqzH++Fh150Sbb9Y0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue><br> 其中AQAB对应公钥指数65537的BASE64编码值。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

SSH公钥免密登录其他主机

在多台主机之间使用SSH免密登录,假设主机A免密登录主机B:1\.在主机A上生成自己的ssh公钥:root@A~sshkeygentrsa执行上面命令,一路回车,完成后,会在~/.ssh目录下生成2个文件:id\_rsa(私钥)和id\_rsa.pub(公钥)2\.将主机A上生成的公钥

RSA加密、解密、签名、验签的原理及方法

一、RSA加密简介  RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。

RSA加密

rsa加密的解决方案都是需要证书或者文件的,对于服务端提供了公钥,没有给证书或者pem文件的rsa加密:把公钥和你需要编码得Nsstring都转换成NSData用rsa公钥编码你所需要编码得内容最后转换成Nsstring//库 SecKeyWrapper//RSA加密\(NSString\)encryptWithStr