2012-03-27 190 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