2011-11-30 47 views
0

我想要做的是使用Python GAE讀取一些PEM公鑰。如何使用Python gdata.tlslite.utils.ASN1Parser獲取指數和模數?

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 

如果我再取此相同的質子交換膜,並在Python它貼到bytes ,我如何獲得正確的孩子來獲得這些價值?

asn1 = ASN1Parser(bytes) 
modulus = asn1.getChild(1).getChild(0).value 
exponent = asn1.getChild(1).getChild(1).value 
binascii.hexlify(modulus) 

還是什麼?我無法弄清楚我需要看什麼水平等。我也不知道自己在做什麼...使用hexlify,我可以看到那裏的值,但總是(帶着孩子和深度玩耍)前面有額外的東西,和/或不是如圖所示的完整數字在openssl中。

回答

0

我修改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)