Как использовать Python gdata.tlslite.utils.ASN1Parser для получения показателя степени и модуля? - PullRequest
0 голосов
/ 30 ноября 2011

Я пытаюсь прочитать некоторые открытые ключи 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.

1 Ответ

0 голосов
/ 16 апреля 2012

Я изменил tlslite, чтобы делать то, о чем вы говорите ... Вот фрагмент, который должен вам помочь.«bytes» - это открытый ключ, закодированный в 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)
...