web-dev-qa-db-ja.com

PEM + PKCS#1形式でRSA公開鍵を読み取る方法

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のみをサポートしていることがわかりました。

28
Mr.Teen

PyCryptoは、X-509 SubjectPublicKeyInfoオブジェクトで読み取ることができるという意味でPKCS#1をサポートしていますcontainPKCSでエンコードされたRSA公開鍵#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はRsaPublicKey ASN.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)