How to load a public RSA key into Python-RSA from a file?

为君一笑 提交于 2019-11-27 16:28:09

问题


I generated a private and a public key using OpenSSL with the following commands:

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

I then tried to load them with a python script using Python-RSA:

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"

My python script fails when it tries to load the public key:

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

回答1:


Python-RSA uses the PEM RSAPublicKey format and the PEM RSAPublicKey format uses the header and footer lines: openssl NOTES

-----BEGIN RSA PUBLIC KEY-----
-----END RSA PUBLIC KEY-----

Output the public part of a private key in RSAPublicKey format: openssl EXAMPLES

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



回答2:


If on Python3, You also need to open the key in binary mode, e.g:

with open('private_key.pem', 'rb') as privatefile:



回答3:


To load an OpenSSL generated public key file with python-rsa library, try

with open('public_key.pub', mode='rb') as public_file:
    key_data = public_file.read()
    public_key = rsa.PublicKey.load_pkcs1_openssl_pem(key_data)



回答4:


You can generate private key by ssh-keygen:

ssh-keygen -t rsa

and generate public key like this:

ssh-keygen -e -m pem -f xxx > pubkey.pem

http://blog.oddbit.com/2011/05/08/converting-openssh-public-keys/




回答5:


from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend


def load_keys():
    with open("public.pem", "rb") as f:
        public = serialization.load_pem_public_key(
            f.read(), backend=default_backend()
        )
    with open("private.pem", "rb") as f:
        private = serialization.load_pem_private_key(
            f.read(), None, backend=default_backend()
        )
    return private, public


来源:https://stackoverflow.com/questions/16482800/how-to-load-a-public-rsa-key-into-python-rsa-from-a-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!