2012-03-27 2 views
3

안녕하십니까. PyCrypto : 파일의 공개 키만 사용하여 암호 해독 (개인 + 공개 키 없음)

내가 PyCrypto와 RSA 공개 키와 개인 키 및 암호화/암호 해독과 비트를 재생하려고하고 있는데이 발생하여 가지 이상한 나에게 보이는 문제가있다 (이것은 아마도 많은 의미를가 작동하고 길을 만든다

지금,하지만 나는 RSA 비대칭 암호화에 대해 많이 알지 못한다. 그래서 그것이 나를 혼란스럽게 만든다.) 공개 키만 갖는 무언가를 암호 해독하는 것이 내가 겪은 무능력입니다.

다음과 같은 사항이 있습니다. 서버와 클라이언트가 있습니다. 서버가 클라이언트를 "인식"하고 등록하고 "알려진 장치"목록에 표시하려고합니다. 클라이언트는 서버의 공개 키를 가지며 서버는 클라이언트의 공개 키를 가지므로 클라이언트가 서버와 통신 할 때 클라이언트의 개인 키와 서버의 공개 키를 사용하여 데이터를 암호화합니다. 이렇게하면 적절한 서버 만 (개인 키로) 데이터를 열 수 있고 발신자가 실제적으로 주장하는 클라이언트인지 확인할 수 있습니다. 음 ... 또는 적어도 내가 생각하기에, 나는이 비대칭 암호화에서 꽤 초보자이기 때문이다. 그 중 한 클라이언트가 깨어나면 공개 키 (물론 서버의 공개 키로 암호화되어 있지만 아직까지는 관련이 없습니다 ...)가 "이봐, 나는 새 클라이언트이고 이것이 내 공개 키입니다. 해당 키를 내 UUID "에 등록하면 서버는 해당 공개 키를 클라이언트의 UUID와 연결하고 해당 키를 사용하여 해당 클라이언트에서 오는 데이터를 해독합니다. 난 그냥 개인 키의 비밀을 유지, 클라이언트의 공개 키를 전송하려면, 비밀, (그것은 바로, 개인입니까?)

가 좀있는 OpenSSL과 테스트 및 PyCrypto (실제로 사용 아주 간단한 파이썬 스크립트를하고있는 중이 야 비밀, 서버/클라이언트 아키텍처 등에서조차도 ... 개인 키로 무언가를 암호화하고 공개 키를 사용하여 암호 해독하려고 시도 함)

먼저 공개/개인 키 세트를 다음과 같이 설정했습니다 :

openssl genrsa -out ~/myTestKey.pem -passout pass:"f00bar" -des3 2048 

좋아, 처음에는 저를 약간 괴롭 힙니다. 르, 사적 열쇠와 공개 열쇠 둘 다로 ... 글쎄 ... 오 .. 뭐든간에.

openssl rsa -pubout -in ~/myTestKey.pem -passin pass:"f00bar" -out ~/myTestKey.pub 

그래서 내가 (실제로, 민간 + 공공) I 개인의 내 몇 줄 알았는데 각각 ~/myTestKey.pem~/myTestKey.pub에서 공개 키 : 나는와 공개 키를 추출 할 수 있습니다. 음 ... 분명히 뭔가 잘못하고 있습니다. 왜냐하면 PyCrypto이이 어셈블리를 좋아하지 않기 때문입니다. 왜 그런지 모르겠습니다.

두 개의 매우 간단한 테스트 스크립트 "encryptor.py"과 "decryptor.py"이 있습니다. "encryptor.py"은 개인 키로 무언가를 암호화하고 "decryptor.py"을 공개 키로 해독해야합니다. 나는 (개인 키) "로렌 ipsum의"내 "encryptor.py"와 그래서, 문자열을 암호화 ... 나는 독창성의 parangon 해요 ...

을 알고

---- ------- encryptor.py ----------------

#!/usr/bin/python 

from Crypto.PublicKey import RSA 

def encrypt(message): 
    externKey="/home/borrajax/myTestKey.pem" 
    privatekey = open(externKey, "r") 
    encryptor = RSA.importKey(privatekey, passphrase="f00bar") 
    encriptedData=encryptor.encrypt(message, 0) 
    file = open("/tmp/cryptThingy.txt", "wb") 
    file.write(encriptedData[0]) 
    file.close() 

if __name__ == "__main__": 
    encryptedThingy=encrypt("Loren ipsum") 

그리고 그것은 잘 작동합니다. 잘...파일에서 "/tmp/cryptThingy.txt"나는 많은 횡설수설을하기 때문에 그렇게 생각합니다. 정말 나에게 암호화되어 보인다.

하지만 그것은 단지 공개 키가 포함 바로 파일을 사용하여 암호를 해독 할 때 ...

----------- decryptor.py -------- -------

#!/usr/bin/python 

from Crypto.PublicKey import RSA 

def decrypt(): 
    externKey="/home/borrajax/myTestKey.pub" 
    publickey = open(externKey, "r") 
    decryptor = RSA.importKey(publickey, passphrase="f00bar") 
    retval=None 

    file = open("/tmp/cryptThingy.txt", "rb") 
    retval = decryptor.decrypt(file.read()) 
    file.close() 
    return retval 


if __name__ == "__main__": 
    decryptedThingy=decrypt() 
    print "Decrypted: %s" % decryptedThingy 

... PyCrypto은 나를 으악 :

File "/usr/local/lib/python2.7/dist-packages/pycrypto-2.5-py2.7-linux-i686.egg/Crypto/PublicKey/RSA.py", line 107, in _decrypt 
    mp = self.key._decrypt(cp) 
TypeError: Private key not available in this object 

네, 물론 그것의 사용 불가! 공개 키를 추출했습니다! 그것을 올바르게하는 방법을 발견하는 것은 2 시간 걸렸다!!

무엇이 누락 되었습니까? 내가 말했듯이, 나는 공개/비공개 비대칭 키 암호화에서 매우 초보자이므로 핵심 "개념 오류"가있을 수 있습니다 ... 어떤 힌트도 인정 될 것입니다.

¡ 미리 감사드립니다!

+3

조언 : 암호화/암호 해독을 위해'Cipher.PKCS1_OAEP' 모듈을 사용하십시오. 그것은 당신의 메시지에 안전한 패딩을 적용 할 것입니다. RSA 키 자체의 암호화/암호 해독 방법을 사용하지 마십시오. 여기를 참조하십시오 : https://www.dlitz.net/software/pycrypto/api/current/Crypto.Cipher.PKCS1_OAEP-module.html – SquareRootOfTwentyThree

답변

2

틀린 방식으로 공개 키로 암호화하고 개인 키로 해독합니다.

공개적으로 사용 가능한 암호화 키는 널리 배포되지만 개인 해독 키는 수신자에게만 알려져 있습니다. 메시지는 수신자의 공개 키로 암호화되며 해당 개인 키로 만 해독 할 수 있습니다. Source

아이디어는, 당신은 그것으로 데이터를 암호화 (열기에 배포 할 수 있습니다 사람이 가질 수있는, 그래서)와 최종에 암호를 해독하면 송신 측에게 공개 키를 제공한다는 것입니다 귀하의 비공개 키 (당신 만). 이렇게하면 데이터가 안전하게 유지됩니다.

개인 키는 공개 키를 만드는 데 필요한 정보가 포함되어 있기 때문에 무언가를 암호화 할 수 있지만 일반적으로 데이터를 암호화하는 사람은 이 아니기 때문에에는 개인 키가 있습니다 .

+0

'네가 잘못한 길을 가졌다. '예. D Thanks – BorrajaX

+0

@BorrajaX 질문에 대한 답변이 있으면 걱정할 필요가 없습니다. [accept at] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235# 5235). –

+0

OP가하고자하는 일을하는 방법을 설명해 주시겠습니까? – Helio