2012-03-27 188 views
3

大家好。PyCrypto:解密只用文件中的公鑰(無私鑰+公鑰)

我想玩RSA的公鑰和私鑰,加密/解密與PyCrypto和我遇到和問題,這似乎有點奇怪,我可能會使它很有道理它的工作方式現在,但我對RSA非對稱加密知之甚少,這就是爲什麼我困惑)。我無法解密只有公鑰的東西。

這是事情:我有一個服務器和一個客戶端。我希望服務器「識別」並註冊客戶端,並將其顯示在「已知設備」的列表中。客戶端將擁有服務器的公鑰,並且服務器將擁有客戶端的公鑰,因此當客戶端與服務器通信時,它將使用客戶端的私鑰和服務器的公鑰來加密數據。通過這樣做,只有合適的服務器才能夠打開數據(使用其私鑰),並且將能夠驗證發件人實際上是聲稱是......的客戶......呃......或者至少,這就是我認爲,因爲我在這個非對稱加密中很新手。這個想法是,當其中一個客戶端醒來時,它會發送它的公鑰(當然,用服務器的公鑰加密,但這可能與此時不相關),說:「嘿,我是一個新的客戶端,這是我的公鑰,用我的UUID註冊該密鑰「,服務器將服從,將該公鑰與客戶端的UUID相關聯,並使用該密鑰來解密來自該客戶端的數據。我只是想傳遞客戶端的公鑰,保持其私有密鑰的祕密,機密,祕密(它是私有的,對不對?)

我做與OpenSSL的一些測試和使用PyCrypto(其實很簡單的Python腳本,即使在服務器/客戶端架構或任何東西......只是試圖用私鑰加密某些東西並用公鑰解密)

首先,我創建了一個公鑰/私鑰集:

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

好的,第一件事讓我感到困惑......它只產生一個fi樂,私人和公共鑰匙......好吧......好吧......不管。我可以提取使用公鑰:

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

所以我想我有我的私人夫婦的(私有+公共,實際上),並分別在~/myTestKey.pem~/myTestKey.pub公鑰。那麼...顯然我做錯了什麼,因爲PyCrypto不喜歡這個大會。我不知道爲什麼。

我有兩個非常簡單的測試腳本,「encryptor.py」和「decryptor.py」。 「encryptor.py」應該使用私鑰對「東西」進行加密,「decryptor.py」使用公鑰進行解密。我知道...我原創的parangon ...

所以,我加密字符串「羅蘭存有」我「encryptor.py」(與私鑰):

---- ------- 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 2012-03-27 17:30:32

回答

2

你有錯誤的方式,你用公鑰加密,並用私鑰解密。

公開可用的加密密鑰是廣泛分佈的,而私人解密密鑰僅爲接收者所知。消息使用收件人的公鑰進行加密,只能使用相應的私鑰解密。 Source

的想法是,你給發送方的公鑰(任何人都可以有,這樣你就可以在打開的分發),那麼你加密與它的數據,然後解密它與您的最終你的私鑰(只有你)。這樣數據就保持安全。

您可以加密與私鑰作爲私鑰的內容,包含使公共密鑰所需的信息,但它是不尋常的這樣做,因爲通常對數據進行加密的人做有私鑰。

+0

'你有錯誤的方式',Yeeep ...我知道它: - D謝謝 – BorrajaX 2012-03-27 17:16:17

+0

@BorrajaX不用擔心,如果它回答你的問題,請隨時[接受它](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235# 5235)。 – 2012-03-27 17:19:48

+0

你能解釋一下怎麼做OP想要做的事情嗎? – Helio 2016-11-04 12:36:40