13

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

PyCrypto を使用して復号化しようとすると、PyCryptoからNo private keyエラーが発生します。コードは次のとおりです。

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 形式) へのパスを使用して呼び出しています。暗号化されたデータは私が生成したものではなく、Python ではなく PHP で作成されたものです。PHP には、openssl_public_decryptこのデータを簡単に復号化する関数があります。

PyCryptoで公開鍵を使用して復号化することはまったく可能ですか?

4

2 に答える 2

7

パディングなしで生の 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 コードを変更することを強くお勧めします。

于 2013-10-23T20:37:06.767 に答える
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
于 2013-11-20T04:07:16.840 に答える