大家好。
我正在尝试使用RSA公钥和私钥以及使用 PyCrypto 进行加密/解密,我遇到了一些对我来说有点奇怪的问题(它可能很有意义)它现在的工作方式,但我不太了解RSA非对称加密,这就是为什么它让我感到困惑)。我无法解密只有公钥的东西。
事情就是这样:我有一台服务器和一台客户端。我希望服务器“识别”并注册客户端并将其显示在“已知设备”列表中。客户端将拥有服务器的公钥,服务器将拥有客户端的公钥,因此当客户端与服务器通信时,它将使用客户端的私钥和服务器的公钥加密其数据。通过这样做,只有正确的服务器才能打开数据(使用其私钥),并且能够验证发件人实际上是声称是......好的客户端......或者至少,这是我的想法,因为我在这种非对称加密方面相当新手。这个想法是,当其中一个客户醒来时,它会发送它的公钥(当然,用服务器的公钥加密,但这可能不相关......)说“嘿,我这是一个新客户端,这是我的公钥。使用我的UUID注册该密钥“服务器将遵守,将该公钥与客户端的UUID相关联,并使用该密钥解密来自该客户端的数据。我只是想传输客户端的公钥,保密私钥,秘密,秘密(它是私有的,对吗?)
我正在使用openssl和非常简单的Python脚本进行一些测试,这些脚本使用 PyCrypto (实际上,即使在服务器/客户端架构中也没有任何东西......只是尝试用私钥加密某些东西并使用公钥解密它
首先,我创建了一个公钥/私钥集:
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
”使用公钥解密。我知道......我是一个独创的人......
所以,我用“encryptor.py
”(带私钥)加密字符串“ Loren ipsum ”:
----------- 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个小时找到如何正确地做到这一点!
我错过了什么?正如我所说,我在这种公共/私有非对称密钥加密方面相当新手,所以我可能会有一个核心的“概念错误”......任何提示都会受到赞赏。
¡提前谢谢你!
答案 0 :(得分:2)
你有错误的方法,用公钥加密,用私钥解密。
公开可用的加密密钥广泛分发,而私有解密密钥仅为收件人所知。邮件使用收件人的公钥加密,并且只能使用相应的私钥解密。 Source
这个想法是你给发送方公钥(任何人都可以拥有,所以你可以在公开场所发布),然后你用它加密数据,然后用你的私钥解密它(只有你有)。这样数据就可以保持安全。
您可以使用私钥加密某些内容,因为私钥包含生成公钥所需的信息,但这样做很不寻常,因为通常加密数据的人不有私钥。