2013-10-23 4 views
6

내가 이해하는 한 RSA를 사용하여 신뢰성 또는 개인 정보를 보호 할 수 있어야합니다. 필자는 개인 키로 데이터를 암호화하고 누구나 공개 키를 사용하여 데이터를 해독 할 수 있도록 확실성을 보장하고자합니다. 데이터는 실제 비밀은 아니지만 공용 (개인) 키의 소유자가 생성했음을 보장해야합니다.PyCrypto로 RSA 공개 키를 사용하여 암호 해독

PyCrypto를 사용하여 암호 해독하려고하면 개인 키가 없습니다. PyCrypto에서 오류가 발생했습니다. 코드는 다음과 같습니다

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 

내가 공개 키 파일의 경로로 전화 해요 암호화 된 데이터에 날에 의해 생성되지 않고 파이썬하지만 PHP로 수행되지 않았다 (OpenSSH의 형식.). PHP에서는이 데이터를 쉽게 해독 할 수있는 openssl_public_decrypt 함수가 있습니다.

PyCrypto를 사용하여 공개 키를 사용하여 암호를 해독 할 수 있습니까?

+1

귀하는 반대입니다. 공개 키는 암호화에 사용되며 개인 키는 암호 해독에 사용됩니다. – jchysk

+1

공개 decrypt는 encrypt와 동일합니다. 문제는 다음과 같이 해결할 수 있습니다 :'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는 서명이 신뢰할 수있는 것을 증명하려는 데이터에 추가되어야하는 데이터 임에도 불구하고 훌륭한 프로토콜입니다.

파이썬에서 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는 증명 된 패딩과 결합하지 않으면 오히려 가단성있는 알고리즘이라는 사실 때문입니다. 당신이 묘사하는 것은 실제로 완전한 메시지 복구라고 불리는 서명입니다. 한 예로 ISO 9796-1 표준이 있습니다. 이것은 완전히 망가졌습니다. – SquareRootOfTwentyThree

+0

은 "가져 오기"가 "importKey"가 아니어야합니까? –

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

관련 문제