28

PEM 形式の RSA 公開鍵 + PKCS#1 を持っています (推測):

-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+zn
JDEbNHODZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE=
-----END RSA PUBLIC KEY-----

Python で ASN1 エンコード バージョンの SHA1 ダイジェストを取得したいと考えています。最初のステップはこのキーを読み取ることですが、私は PyCrypto でそれを行うことができませんでした:

>> from Crypto.PublicKey import RSA
>> RSA.importKey(my_key)
ValueError: RSA key format is not supported

PyCryptoのドキュメントには、PEM + PKCS#1 がサポートされていると記載されているため、混乱しています。M2Crypto も試してみましたが、M2Crypto は PKCS#1 をサポートせず、X.509 のみをサポートしていることがわかりました。

4

1 に答える 1

26

PyCrypto は、PKCS#1でエンコードされた RSA 公開鍵を含むSubjectPublicKeyInfoX.509オブジェクトを読み取ることができるという意味で、 PKCS# 1をサポートしています。

代わりに、キーでエンコードされたデータは純粋なRSAPublicKeyオブジェクト (つまり、2 つの INTEGER、係数、および公開指数を含む ASN.1 SEQUENCE) です。

それでも読み込めます。次のようなものを試してください:

from Crypto.PublicKey import RSA
from Crypto.Util import asn1
from base64 import b64decode

key64 = 'MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k\
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+znJDEbNHOD\
ZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE='

keyDER = b64decode(key64)
seq = asn1.DerSequence()
seq.decode(keyDER)
keyPub = RSA.construct( (seq[0], seq[1]) )

バージョン 2.6 以降、PyCrypto はRsaPublicKeyASN.1 オブジェクトもインポートできます。コードははるかに単純になります。

from Crypto.PublicKey import RSA
from base64 import b64decode

key64 = b'MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k\
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+znJDEbNHOD\
ZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE='

keyDER = b64decode(key64)
keyPub = RSA.importKey(keyDER)
于 2012-05-13T19:53:19.297 に答える