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公钥和私钥两部分。
私钥文件内容如下图所示:

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

可以通过OpenSSL的genrsa程序生成私钥文件,调用命令如下:openssl rsa -in key.pem -pubout -out pubkey.pem 公钥文件包含RSA公钥,即模数n和公钥指数e。
公钥文件内容如下图所示:

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

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

#!/usr/bin/python
#coding:utf-8

import os
import sys
import base64

'''
用Openssl生成服务器私钥文件,
并将公钥变成C#可以使用的xml格式文件
'''

def main():
    
    filepath = "/var/key.pem"
    fd_pubkey = open("/var/pubkey.xml", "w")
    os.system("/usr/bin/openssl genrsa -out %s 1024 >/dev/null 2>&1" %filepath)
    # print filepath
    # 提取公钥文件的模
    # modulus = os.popen("/usr/bin/openssl rsa -in %s -pubin -modulus -noout" %filepath).read() 
    # 提取私钥文件的模
    modulus = os.popen("/usr/bin/openssl rsa -in %s -modulus -noout" %filepath).read() 
    # print modulus
    modulus1=modulus.split("=", 1)[1].strip()
    st=[]
    for i in range(len(modulus1)/2):
        st.append(int(modulus1[i*2:(i+1)*2], 16))
    st1=[]
    for i in st:
        st1.append(chr(i))

    st1=''.join(st1)
    modulus2=base64.b64encode(st1)
    # print modulus2
    exp="AQAB"
    RSAKey="<RSAKeyValue><Modulus>"+modulus2+"</Modulus><Exponent>"+exp+"</Exponent></RSAKeyValue>"
    fd_pubkey.write(RSAKey)
    return 0

if __name__=='__main__':
    sys.exit(main())

生成的XML文件如下所示:

<RSAKeyValue><Modulus>t0DhW51Tw8nWkmkO/3+Zlzf1f/DwKwAhS/nh7a/eoICCfMXV4BDUN9iZ6Kjo5KhdSMuedBdBXEM8bmhB5TEEF/4wdNkqt4hkooLRwA81XGjE9vcidEbfdm5CTU/nRSbBLm25ZaRdfmx0T5u1AiUsDyR3cNeqzH++Fh150Sbb9Y0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>

其中AQAB对应公钥指数65537的BASE64编码值。

posted on 2018-02-26 22:03  proxytang  阅读(910)  评论(0编辑  收藏  举报

导航