Converte a chave pública do openssh para o objeto da chave rsa

Eu precisava converter uma chave openssh em uma chave rsa para ser usada para validação de assinatura usando esta biblioteca: http://stuvel.eu/rsa . Veja como:

import base64
import struct

from pyasn1.type import univ
from pyasn1.codec.der import encoder as der_encoder
import rsa


def read_openssh_public_key(keydata):
"""
Convert an openssl formatted key into a pkcs#1 formatted key as used by our rsa library


:param keydata: The key in openssl encoded/formatted form.


:return: An rsa PublicKey object

"""

actual_keydata
= base64.b64decode(keydata.split(None)[1])

parts
= []
while actual_keydata:
# read the length of the data
dlen
= struct.unpack('>I', actual_keydata[:4])[0]
# read in <length> bytes
data
= actual_keydata[4:dlen + 4]
actual_keydata
= actual_keydata[4 + dlen:]
parts
.append(data)
e_val_list
= ['%02X' % struct.unpack('B', x)[0] for x in parts[1]]
e_val
= eval('0x' + ''.join(e_val_list))
n_val_list
= ['%02X' % struct.unpack('B', x)[0] for x in parts[2]]
n_val
= eval('0x' + ''.join(n_val_list))
pkcs1_seq
= univ.Sequence()
pkcs1_seq
.setComponentByPosition(0, univ.Integer(n_val))
pkcs1_seq
.setComponentByPosition(1, univ.Integer(e_val))
encoded_string
= base64.encodestring(der_encoder.encode(pkcs1_seq))
key_data
= ('-----BEGIN RSA PUBLIC KEY-----n'
'{0}n'
'-----END RSA PUBLIC KEY-----').format(encoded_string)
return rsa.PublicKey.load_pkcs1(key_data)

adaptado de: http://blog.oddbit.com/2011/05/converting-openssh-public-keys.html