Loading a PKCS#1 public key using M2Crypto
Marc Aymerich
glicerinu at gmail.com
Thu Jan 17 04:16:21 EST 2013
On Thursday, January 17, 2013 1:32:25 AM UTC+1, Piet van Oostrum wrote:
> Marc Aymerich <glicerinu at gmail.com> writes:
>
>
>
> > Hi,
>
> > I've been trying very, very hard to load an RSA key using M2Crypto but without any success.
>
> >
>
> > basically this is what I'm trying to do:
>
> >>>> from M2Crypto import BIO, RSA
>
> >>>>
>
> >>>> pubkey = """-----BEGIN RSA PUBLIC KEY-----
>
> > ... MIIBCgKCAQEApwotnfHT9RAmxnuaGEMdI3lYPYE4aaqSD9v4KbTh1E7Le3GNJQb7
>
> > ... wCpmDe8+n8S5Kp/gBEpWiYuvsVA/T4KseoX7NMcacP+DJMwjmNd9U58USn2vLz0Z
>
> > ... TMtXpc/FUhW5PZdgCiuNzw6IFgGn9ZCCv85jjUIW3KD8fUNdrUfVSv4olDoL9NkR
>
> > ... dTRg3Os/znC6l0gv/mqnLaqj2bJ/tx47kUmj6Oq13JuEq34T+DVmsUCFVundQnRp
>
> > ... c/vVEqQot7Rvj9UmSvTi4WKt/qxiAnyZf3gXOdrXvxfVTGzD5I/Xg+By+a4C2JwB
>
> > ... A5RGvZP3fyfhkCnnhFDpfws5lc20FA6ryQIDAQAB
>
> > ... -----END RSA PUBLIC KEY-----"""
>
> >>>>
>
> >>>> bio = BIO.MemoryBuffer(pubkey.encode('ascii'))
>
> >>>> RSA.load_pub_key_bio(bio)
>
> > Traceback (most recent call last):
>
> > File "<stdin>", line 1, in <module>
>
> > File "/usr/lib/python2.7/dist-packages/M2Crypto/RSA.py", line 422, in load_pub_key_bio
>
> > rsa_error()
>
> > File "/usr/lib/python2.7/dist-packages/M2Crypto/RSA.py", line 302, in rsa_error
>
> > raise RSAError, m2.err_reason_error_string(m2.err_get_error())
>
> > M2Crypto.RSA.RSAError: no start line
>
> >
>
> >
>
> > Reading all whats in Internet about this problem it seems that my key is in PKCS#1 format but M2Crypto only reads X.501 RSA keys.
>
> >
>
> > I know that python-crypto doesn't have any problem loading this key, but I'll prefer to stick with M2Crypto because I already have lots code using M2Crypto.
>
> >
>
> > So my question is, is there any way to load this key using M2Crypto? Can I convert somehow the key to X.501?
>
> >
>
> Converting to X.501 isn't difficult (assuming this is a 2048 bit key):
>
> Get rid of the 'RSA' in header and trailer
>
> Prepend X.501 header 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A' to the data
>
> Reformat the lines to 64 characters.
>
>
>
> from M2Crypto import BIO, RSA
>
>
>
> pubkey="""-----BEGIN RSA PUBLIC KEY-----
>
> MIIBCgKCAQEApwotnfHT9RAmxnuaGEMdI3lYPYE4aaqSD9v4KbTh1E7Le3GNJQb7
>
> wCpmDe8+n8S5Kp/gBEpWiYuvsVA/T4KseoX7NMcacP+DJMwjmNd9U58USn2vLz0Z
>
> TMtXpc/FUhW5PZdgCiuNzw6IFgGn9ZCCv85jjUIW3KD8fUNdrUfVSv4olDoL9NkR
>
> dTRg3Os/znC6l0gv/mqnLaqj2bJ/tx47kUmj6Oq13JuEq34T+DVmsUCFVundQnRp
>
> c/vVEqQot7Rvj9UmSvTi4WKt/qxiAnyZf3gXOdrXvxfVTGzD5I/Xg+By+a4C2JwB
>
> A5RGvZP3fyfhkCnnhFDpfws5lc20FA6ryQIDAQAB
>
> -----END RSA PUBLIC KEY-----
>
> """
>
>
>
> pk = pubkey.split('\n')
>
> pk = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A' + ''.join(pk[1:-2])
>
> pk = [pk[i:i+64] for i in range(0, len(pk), 64)]
>
> pk = '-----BEGIN PUBLIC KEY-----\n' + '\n'.join(pk) + '\n-----END PUBLIC KEY-----'
>
>
>
> bio = BIO.MemoryBuffer(pk) # pk is ASCII, don't encode
>
> key = RSA.load_pub_key_bio(bio)
>
>
Piet, that was really awesome, it seems so easy to do now :)
Thank you very, very much! really.
More information about the Python-list
mailing list