2013-10-23 15 views
6

私が理解する限り、RSAを使用して信頼性やプライバシーを確​​保できるはずです。私の場合、私は秘密鍵でデータを暗号化し、誰でも公開鍵でそれを解読できるように真正性を保証したいと思います。データは実際には秘密ではありませんが、パブリック(およびプライベート)キーの所有者によって作成されたことを保証する必要があります。PyCryptoでRSA公開鍵を使用して復号する

PyCryptoを使用して復号化しようとすると、PyCryptoから秘密鍵エラーが発生します。私は、公開鍵ファイルへのパスでそれを呼んでいる暗号化されたデータは、私によって生成されていないと、それはPythonが、PHPで行われていなかった

def _decrypt_rsa(decrypt_key_file, cipher_text): 
    from Crypto.PublicKey import RSA 
    from base64 import b64decode 

    key = open(decrypt_key_file, "r").read() 
    rsakey = RSA.importKey(key) 
    raw_cipher_data = b64decode(cipher_text) 
    decrypted = rsakey.decrypt(raw_cipher_data) 
    return decrypted 

(OpenSSHの形式インチ):コードはこれです。 PHPには、このデータを簡単に解読する関数openssl_public_decryptがあります。

PyCryptoで公開鍵を使って解読することはできますか?

+1

あなたはそれを逆にしました。公開鍵は暗号化に使用され、秘密鍵は復号化に使用されます。 – jchysk

+1

公開復号化は暗号化と同じです。 'decrypted = rsakey.encrypt(raw_cipher_data、0)' – Helio

+0

ソースが実際に秘密鍵で暗号化されていれば、データを効果的に署名したことになります。 Javaのようないくつかのツールは、これを可能にします。署名を復号化するには、公開鍵(または秘密鍵の公開部分)を使用できます。参照してください:https://stackoverflow.com/questions/48280670/pycrypto-how-to-view-raw-rsa-signature-data –

答えて

5

パディングなしで未処理のRSAを使用しているため、これは完全に安全ではありません。

アプリケーションには署名が必要なため、暗号化や復号化を扱ってはいけません。たとえば、PKCS#1 v1.5は、シグネチャが信頼性を証明したいものに追加する必要のあるデータであっても、優れたプロトコルです。

はPythonでPKCS#1 v1.5のシグネチャの確認するには、実行します。

from Crypto.PublicKey import RSA 
from Crypto.Signature import PKCS1_v1_5 
from Crypto.Hash import SHA 

rsa_key = RSA.importKey(open(verification_key_file, "rb").read()) 
verifier = PKCS1_v1_5.new(rsa_key) 
h = SHA.new(data_to_verify) 
if verifier.verify(h, signature_received_with_the_data): 
    print "OK" 
else: 
    print "Invalid" 

私は強くそれは、このような署名を作成するようにPHPコードを変更することをお勧めします。

+0

あなたの提案をありがとう、私は間違いなくそれを検討します。非公開のデータを復号化して真正性を証明するために公開鍵を使用することについて不安なことを詳しく説明できますか?私は詰め物がないので、あなたはそれが偽装されていると言っていますか? – sergiopereira

+0

秘密鍵のない人は、実際の所有者からの有効なメッセージのように見えるものをまだ捏造することができます。これは、証明されたパディングと組み合わせないと、RSAはかなり柔軟なアルゴリズムであるという事実によるものです。あなたが記述しているのは、実際には完全なメッセージ回復と呼ばれるシグネチャです.1つの例は完全に壊れているISO 9796-1標準です。 – SquareRootOfTwentyThree

+0

"importKey"は "import"しないでください。 –

0

あなたの機能は正しいです。公開鍵ではなく復号化するために、秘密鍵へのパスを与えるだけです。公開鍵は暗号化用であり、秘密鍵は復号化用である。

def _decrypt_rsa(decrypt_key_file, cipher_text): 
    ''' 
    Decrypt RSA encrypted package with private key 
    :param decrypt_key_file: Private key 
    :param cipher_text: Base64 encoded string to decrypt 
    :return: String decrypted 
    ''' 
    from Crypto.PublicKey import RSA 
    from base64 import b64decode 

    key = open(decrypt_key_file, "r").read() 
    rsakey = RSA.importKey(key) 
    #optionally could use OAEP 
    #from Crypto.Cipher import PKCS1_OAEP 
    #rsakey = PKCS1_OAEP.new(rsakey) 
    raw_cipher_data = b64decode(cipher_text) 
    decrypted = rsakey.decrypt(raw_cipher_data) 
    return decrypted 
+1

その後、誰がメッセージを暗号化したかを保証することはできません。私は受け入れられた答えの中で提案に従って終わり、代わりに署名を使用するように移動しました。また、私の問題はOAuthトークンに関連していました。最終的には署名も使用するJWTに移行しました。 – sergiopereira

+0

それを送信した人が自分の秘密鍵でメッセージに署名し、あなたが別個に自分のものであることを確認した公開鍵を持っていない限り、真正性を判断することはできません。 JWTでは、RS512のようなアルゴリズムで署名するためにRSAを使用することができます。送信者の信頼性を確保することに重点を置いている場合は、発行者属性に焦点を当てるべきです。 – jchysk

関連する問題