PyCrypto:仅使用文件中的公钥解密(无私钥+公钥)

2024-06-19

大家好。

我正在尝试使用 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 and ~/myTestKey.pub分别。嗯...显然我做错了什么,因为PyCrypto不喜欢这个集会。我不知道为什么。

我有两个非常简单的测试脚本,“encryptor.py" and "decryptor.py". The "encryptor.py“应该用私钥加密某些内容,并且”decryptor.py“,用公钥解密。我知道......我是原创性的典范......

所以,我加密了字符串“洛雷姆·伊普苏姆“ 和我的 ”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

是啊,当然不能用了!我提取了公钥!我花了两个小时才找到正确的做法!

我缺少什么?正如我所说,我在这种公共/私人非对称密钥加密方面是相当新手,所以我可能有一个核心“概念错误”......任何提示将不胜感激。

先感谢您!


你搞错了,用公钥加密,用私钥解密。

公开可用的加密密钥被广泛分发,而私有解密密钥只有接收者知道。消息使用接收者的公钥进行加密,并且只能使用相应的私钥进行解密。Source https://en.wikipedia.org/wiki/Public-key_cryptography#How_it_works

这个想法是,你向发送方提供公钥(任何人都可以拥有,因此你可以公开分发它),然后用它加密数据,然后用你的私钥(只有你拥有)解密它)。这样数据就可以保持安全。

您可以使用私钥加密某些内容,因为私钥包含生成公钥所需的信息,但这样做并不常见,因为通常加密数据的人会这样做not有私钥。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyCrypto:仅使用文件中的公钥解密(无私钥+公钥) 的相关文章

随机推荐