Как использовать python gdata.tlslite.utils.asn1parser для получения экспонента и модуля?
-
26-10-2019 - |
Вопрос
То, что я пытаюсь сделать, это прочитать некоторые общественные ключи PEM, используя Python Gae.
Модуль Rsakey не разрабатывает общедоступные ключи от PEM, просто частные.
Если я смогу получить модуль и показатель от PEM, я могу пойти оттуда.
Изучение типичной PEM (такого рода, который я буду использовать) с OpenSSL ASN1Parse Я могу найти BIT STRING
где они живут.
Но я не могу понять, как их найти, используя Gdata Asn1parser.
Например, выход OpenSSL:
openssl asn1parse -i -in test.pem
0:d=0 hl=3 l= 159 cons: SEQUENCE
3:d=1 hl=2 l= 13 cons: SEQUENCE
5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption
16:d=2 hl=2 l= 0 prim: NULL
18:d=1 hl=3 l= 141 prim: BIT STRING
А потом бурение вниз я вижу модуль и показатель RSA:
openssl asn1parse -strparse 18 -i -in test.pem
0:d=0 hl=3 l= 137 cons: SEQUENCE
3:d=1 hl=3 l= 129 prim: INTEGER :09C7A8007111B2B...
135:d=1 hl=2 l= 3 prim: INTEGER :010001
Если я тогда возьму ту же PEM и в Python вставьте его в bytes
, как мне заставить правильного ребенка получить эти значения?
asn1 = ASN1Parser(bytes)
modulus = asn1.getChild(1).getChild(0).value
exponent = asn1.getChild(1).getChild(1).value
binascii.hexlify(modulus)
Или что? Я не могу понять, какой уровень и т. Д. Мне нужно посмотреть. Я также действительно не знаю, что я делаю ... используя hexlify, я вижу там значения, но всегда (игра с ребенком и глубиной) с дополнительными вещами впереди, и/или не полное число, как показано на рисунке в OpenSsl.
Решение
Я изменил TLSLITE, чтобы делать то, о чем вы говорите ... вот фрагмент, который должен вам помочь. «Байты» - это кодированный открытый ключ DER.
Я думаю, что проблема, с которой у вас возникает, заключается в том, что у некоторых ключей могут быть «наполнение». Длина прокладки является первым байтом полезной нагрузки. Затем вам нужно будет пропустить байты прокладки и столько байтов прокладки.
@staticmethod
def parseDERPublicKey(bytes):
a = ASN1Parser(bytes)
b = a.getChild(1)
padding = b.value[1]
# TODO: I am assuming padding is 0, this is wrong.
# Skip the padding as well.
c = b.value[1:] # get the mod/exp portion after the padding
d = ASN1Parser(c)
modulus = bytesToNumber(d.getChild(0).value)
exponent = bytesToNumber(d.getChild(1).value)