2013-05-10 94 views
8

我产生了私人和使用以下命令公钥:如何使用openssl生成的文件在Python-RSA中加载公共RSA密钥?

openssl genrsa -out private_key.pem 512 
openssl rsa -in private_key.pem -pubout -out public_key.pem 

然后我试着使用Python的RSA python脚本来加载它们:

import os 
import rsa 

with open('private_key.pem') as privatefile: 
    keydata = privatefile.read() 
privkey = rsa.PrivateKey.load_pkcs1(keydata,'PEM') 

with open('public_key.pem') as publicfile: 
    pkeydata = publicfile.read() 

pubkey = rsa.PublicKey.load_pkcs1(pkeydata) 

random_text = os.urandom(8) 

#Generate signature 
signature = rsa.sign(random_text, privkey, 'MD5') 
print signature 

#Verify token 
try: 
    rsa.verify(random_text, signature, pubkey) 
except: 
    print "Verification failed" 

我的Python脚本失败时,它试图加载公钥:

ValueError: No PEM start marker "-----BEGIN RSA PUBLIC KEY-----" found 
+1

我认为这个问题是公钥的格式。如果仔细观察,openssl生成的公钥的标题是“----- BEGIN PUBLIC KEY -----”。格式是X509 SubjectPublicKeyInfo。您正在使用的方法是寻找带有“----- BEGIN RSA PUBLIC KEY -----”标头的PKCS1格式。 – gtrig 2013-06-19 21:04:37

+0

你会告诉我们如何将X509转换为PKCS1有限? – fengxing 2013-08-22 06:42:29

回答

3

Python的RSA使用PEM RSAPublicKey格式和PEM RSAPublicKey格式使用页眉和页脚行: openssl NOTES

----- BEGIN RSA公钥----- ----- END RSA公钥-----

产出RSAPublicKey格式的私有密钥的公共部分: OpenSSL的实例

openssl rsa -in key.pem -RSAPublicKey_out -out pubkey.pem 
3

如果Python3,你还需要在二进制模式开关键,例如:

with open('private_key.pem', 'rb') as privatefile: 
相关问题