大家好。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個小時才找到正確的方法!
我錯過了什麼?正如我所說,我是公共/私人非對稱密鑰加密的新手,所以我可能有一個核心「概念錯誤」...任何暗示將不勝感激。
¡預先感謝您!
只是一個建議:使用'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