2017-07-26 14 views
1

サービスをPython 2.7からPython 3.5に移行し、RSA暗号化/復号化を使用して別のサービスと通信しています。rsaモジュールとm2cryptoからRSA署名が異なる


パイソン(V2.7)m2crypto(0.25.1)<正しい署名>

key = M2Crypto.RSA.load_key(private_key) 
digest = hashlib.sha1(bytes(cipher_text, encoding="UTF-8")).hexdigest() 
signature = hexlify(key.private_encrypt(digest, M2Crypto.RSA.pkcs1_padding)) 

パイソン(V3.5)、RSA(v3.4.2)

pri_key = rsa.PrivateKey.load_pkcs1(private_key) 
signature = hexlify(rsa.sign(cipher_text.encode(), pri_key, "SHA-1")) 

上記のコードで生成された署名が異なります。これらのパッケージの違いは何ですか?

答えて

0

異なる暗号化操作を実行しています。秘密鍵で暗号化!=デジタル署名PCKS#1 V1.5でのデジタル署名アルゴリズム識別子と符号化されたメッセージのダイジェストをダイジェストにRSA暗号化を行い

signature = hexlify(key.private_encrypt(digest, M2Crypto.RSA.pkcs1_padding)) 

signature = hexlify(rsa.sign(cipher_text.encode(), pri_key, "SHA-1")) 

ASN.1

signature = 
    RSA_Encryption( 
     ASN.1(DigestAlgorithmIdentifier + SHA1(message))) 

に暗号化がダイジェストアルゴリズム識別子

0123が含まれていませんが

は、Python key.private_encryptpkcs1_paddingあなたが

PKCS#1 v1.5のパディングRSA_PKCS1_PADDING

使用しているという警告を見てみましょうopensslのRSA_private_encryptのラッパーであるようです。この関数は、アルゴリズム識別子をPKCS#1に指定して処理しません。 PKCS#1署名を生成または検証する場合は、RSA_sign(3)およびRSA_verify(3)を使用する必要があります。

デジタル署名にはsignでなく、private_encryptを使用する必要があります。しかし、メッセージの内容を隠すように暗号化したい場合、秘密鍵ではなく公開鍵で暗号化を使用する必要があります。

+0

しかし、2番目のサービスがm2cryptoコードから生成された署名を受け入れる場合、どうすればよいでしょうか? – infiQuanta

+0

このサービスをご利用の場合は、それに応じて変更することをお勧めします。可能であれば、私はあなたに 'private_encrypt'を続けるしかないと思います。 – pedrofb

+1

代替オプションは、https://gitlab.com/m2crypto/m2crypto/merge_requests/65を終了させるのに役立ちます。あなたは移植する必要はありませんM2Cryptoのうち;しかし、私は今OpenSSL 1.1.0のサポートに取り組んでいます。そのため、そのブランチの主なリベースは期待されています。 – mcepl