Python,Pycrypto,RSA,AES
我正在尝试实现一个脚本,该脚本将使用随机生成的AES密钥加密文件,然后使用RSA公钥加密所述AES密钥。加密的AES密钥将与拥有私钥的授权人员共享以对其进行解密。代码如下:
from Crypto.PublicKey import RSA
from Crypto.Cipher import AES
from Crypto import Random
RSAkey = '-----BEGIN PUBLIC KEY-----\nSome RSA Key here\n-----END PUBLIC KEY-----'
RSAkey = RSA.importKey(RSAkey)
key = Random.new().read(32)
enc_key = RSAkey.encrypt(key, '')
enc_key = str(enc_key)
custom_writefile_function('enc_key.txt', enc_key)
我将enc_key转换为字符串,以便我可以将其写入文本文件,否则enc_key.txt将包含垃圾。但问题是,在另一个脚本中,用于解密enc_key以获取用于加密文件的原始AES密钥,尝试解密已转换为字符串的enc_key会产生错误:
RSAkey.decrypt(str(RSAkey.encrypt(key,''))) Traceback(最近一次调用最后一次): 文件“”,第1行,in 文件“/usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.py”,第174行,解密 return pubkey.pubkey.decrypt(self,ciphertext) 文件“/usr/lib/python2.7/dist-packages/Crypto/PublicKey/pubkey.py”,第93行,解密 明文= self._decrypt(密文) _decrypt中的文件“/usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.py”,第237行 cp = self.key._blind(ciphertext,r) ValueError:消息太大
代码如下:
RSAkey = custom_readfile_function('private_key.txt', 'r')
RSAkey = RSA.importKey(RSAkey)
enc_key = custom_readfile_function('enc_key.txt', 'r')
aes_key = RSAkey.decrypt(enc_key)
custom_writefile_function('key.txt', str(aes_key), 'w')
我相信问题是类型不匹配。 RSAkey.encrypt(key,'')返回类型'tuple',所以我认为RSA.decrypt()也需要这种类型,但我不能将该类型写入文本文件。因此,当我将其转换为字符串以写入文件时,我需要在解密时将其转换回类型'tuple'。我怎样才能做到这一点?或者也许有一种更好的方法可以达到我想要的结果,我还没有考虑过?
由于
答案 0 :(得分:3)
使用base 64而不是直接转换为字符串。
谨防您使用的the documentation of the encrypt
method:
返回: 一个有两个项目的元组。第一项是与明文相同类型的密文(字符串或长整数)。第二项始终为无。 覆盖:pubkey.pubkey.encrypt
此外,您应该注意以下建议:
注意:此函数执行简单的原始RSA加密(教科书)。在实际应用程序中,您始终需要使用正确的加密填充,并且不应使用此方法直接加密数据。如果不这样做可能会导致安全漏洞。建议使用模块Crypto.Cipher.PKCS1_OAEP或Crypto.Cipher.PKCS1_v1_5。
答案 1 :(得分:0)
即使你问了这个问题还有一年多的时间,我仍然希望为你的问题提供一个实际的答案,因为我自己也在努力解决这个微小而又不舒服的错误,所以任何遇到这种情况的人都会能够快速解决它。
首先,正如另一个答案所示,为了人类的可读性,我会使用base64编码:
enc_key = RSAkey.encrypt(key, '')
enc_key = base64.b64encode(enc_key[0])
其中[0]
表示由encrypt
方法(密文本身)生成的元组的第一个值。
然后,当你想解密整个事情时,你打电话:
aes_key = RSAkey.decrypt(base64.b64decode(enc_key))
应该返回没有ValueError: Message too large