Python gdata.tlslite.utils.asn1parserを使用して、指数と弾性率を取得する方法は?
-
26-10-2019 - |
質問
私がやろうとしているのは、Python Gaeを使用してPEMパブリックキーを読むことです。
Rsakeyモジュールは、PEM形式のパブリックキーを解析しませんが、プライベートだけです。
PEMからモジュラスと指数を取得できれば、そこから行くことができます。
openssl asn1parseを使用して(私が使用する種類の)典型的なpemを探る私は 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)
所属していません StackOverflow