大家好。
我正在尝试使用 RSA 公钥和私钥以及PyCrypto的加密/解密,我遇到了一个对我来说似乎有点奇怪的问题(它现在的工作方式可能很有意义,但我没有对 RSA 非对称加密知之甚少,这就是为什么它让我感到困惑)。这是我遇到的无法解密只有公钥的东西。
事情是这样的:我有一个服务器和一个客户端。我希望服务器“识别”并注册客户端并将其显示在“已知设备”列表中。客户端将拥有服务器的公钥,而服务器将拥有客户端的公钥,因此当客户端与服务器通信时,它将使用其客户端的私钥和服务器的公钥对其数据进行加密。通过这样做,只有正确的服务器才能打开数据(使用它的私钥),并且能够验证发送者实际上是声称是......好吧......或者至少是这样的客户端我怎么想,因为我是这种非对称加密的新手。这个想法是,当其中一个客户端醒来时,它将发送其公钥(当然,使用服务器的公钥加密,但那嘿,我是新客户,这是我的公钥。使用我的 UUID 注册该密钥“服务器将服从,将该公钥与客户端的 UUID 相关联,并使用该密钥解密来自该客户端的数据。我只想传输客户端的公钥,保持其私钥秘密,秘密,秘密(这是私人的,对吗?)
我正在使用openssl和使用PyCrypto的非常简单的Python脚本进行一些测试(实际上,即使在服务器/客户端架构或任何东西中......只是试图用私钥加密某些东西并用公钥解密它)
首先,我创建了一个公钥/私钥集:
openssl genrsa -out ~/myTestKey.pem -passout pass:"f00bar" -des3 2048
好的,第一件事让我有点困惑......它只生成一个文件,带有私钥和公钥......嗯......好吧......无论如何。我可以使用以下方法提取公钥:
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
”用公钥解密。我知道...我是创意的典范...
所以,我用我的“ ”(用私钥)加密字符串“ Loren ipsum ”:encryptor.py
------------ 加密器.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
”我得到了很多乱码。对我来说,它看起来真的非常加密。
但是,当我尝试仅使用仅包含公钥的文件对其进行解密时...
----------- 解密器.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 个小时才找到正确的方法!!
我错过了什么?正如我所说,我在这个公共/私有非对称密钥加密方面是个新手,所以我可能有一个核心“概念错误”......任何提示将不胜感激。
先感谢您!