【发布时间】:2016-06-11 13:12:38
【问题描述】:
我一直在使用 pycrypto 模块通过 RSA 密钥对和算法进行加密和解密。问题是当我尝试加密大文件(10kB 的文本文件)时,我在读取文件并加密时采用 32 字节的块大小
>>> f = open('10kb','rb')
>>> p = open('enc','wb')
>>> while True:
data = f.read(32)
if not data:
break
enc_data = public_key.encrypt(data,32)
p.write(enc_data[0])
p.close()
f.close()
它给出了输出:
128
128
.......and the many 128 blocks it is writing
当我尝试解密加密文件时,我需要以 128 字节块读取它,以便返回 32 字节块,
>>> f = open('enc','rb')
>>> p = open('dec','wb')
>>> while True:
data = f.read(128)
if not data:
break
dec_data = private_key.decrypt(data)
p.write(dec_data)
p.close()
f.close()
它给出了输出:
32
32
.....so many 32 byte blocks it is decrypting, then
128
128
128
128
Traceback (most recent call last):
File "<pyshell#251>", line 5, in <module>
enc_data = private_key.decrypt(data)
File "/usr/lib/python3/dist-packages/Crypto/PublicKey/RSA.py", line 174, in decrypt
return pubkey.pubkey.decrypt(self, ciphertext)
File "/usr/lib/python3/dist-packages/Crypto/PublicKey/pubkey.py", line 93, in decrypt
plaintext=self._decrypt(ciphertext)
File "/usr/lib/python3/dist-packages/Crypto/PublicKey/RSA.py", line 237, in _decrypt
cp = self.key._blind(ciphertext, r)
ValueError: Message too large
在输出块大小为 32 的情况下,它是正确解密的,但从 128 开始,它就搞砸了。为什么它说消息大小太大?有没有更好更快的方法来使用 pycrypto 模块解密大文本文件?
【问题讨论】:
-
人们永远不会在这种“块模式”中为 RSA 加密大文件。它不是很安全,而且速度非常慢。请改用hybrid encryption。
-
在pycrypto中怎么做?
-
对不起,我或多或少的 OT 点:我不知道 prcrypto。 prcrypto 是否仅限于处理非常小的块,例如 32 位或 128 位?如果 RSA 模数是 1024 位,我无法想象这样的小块是单独用它加密的。如果你碰巧有时间,你可以在 s13.zetaboards.com/Crypto/topic/7234475/1/ 中试用我的 Python 代码(参见那里的 Ex.3,它使用 RSA 处理高达模数大小的块块密码和身份验证意义上的区块链)并告诉我你对它的评价。
-
@JamesKPolk 已编辑.. 谢谢 :)
-
RSA 加密仅限于加密比其密钥大小更短的数据。使用教科书 RSA,1024 位密钥最多可以加密 127 字节,而 2048 位密钥最多可以加密 255 字节。对于较大的数据,使用 AES 和随机密钥加密数据,然后使用 RSA 加密密钥。
标签: python encryption rsa python-3.4 pycrypto