我一直在使用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适用于数字。只有在序列化这些长整数时,才能从中获得字节。因为这些数字没有固定的大小,所以它们序列化时需要尽可能多的字节,但不能更多。
RSA encryption c=memod n可能会产生密文,密文比n小得多,所以并不是所有字节都被填满,因为数字的前导零不必序列化。
有时(取决于模数和明文)可能会发生这样的情况:在加密过程中,您编写的是127字节的块,而不是128字节的块,但在解密过程中,您总是读取128字节的块。这意味着,您从下一个块中删除了一个字节。当对齐中断时,您可能会遇到各种随机行为,例如块大于模数,因此不是有效的密文。
有两种方法可以解决这个问题:
>
总是在密文块之前写下它的长度。
加密:
data = f.read(readsize)
if not data:
break
i += 1
enc_data = public_key.encrypt(data, 32)[0]
p.write(chr(len(enc_data)))
p.write(enc_data)
解密:
length = f.read(1)
if not length:
break
data = f.read(ord(length))
print(length, len(data))
j += 1
dec_data = private_key.decrypt(data)
p.write(dec_data[:readsize])
最后,您必须将密文减小到原始明文大小,因为您在没有PKCS#1 v1.5填充或OAEP的情况下工作。
填充加密过程中丢失的零字节。
加密:
data = f.read(readsize)
if not data:
break
i += 1
enc_data = public_key.encrypt(data, 32)[0]
while len(enc_data) < writesize:
enc_data = "\x00" + enc_data
p.write(enc_data)
解密:
data = f.read(writesize)
if not data:
break
j += 1
dec_data = private_key.decrypt(data)
p.write(dec_data[:readsize])
请注意readsize=127
和Writesize=128
。下面是两个变体的完整源代码。
现在,这是一个部分的答案,因为这仍然会导致损坏的文件,这些文件也太短了,但至少它修复了OP的错误。
据我所知,如我所愿,我应该能够使用RSA来确保真实性或隐私。在我的例子中,我想确保真实性,所以我用私钥加密数据,并允许任何人用公钥解密。数据并不是真正的秘密,但我需要保证它是由公钥(和私钥)的所有者创建的。 当我尝试使用PyCrypto解密时,我从PyCrypto得到没有私钥错误。代码是这样的: 我使用公钥文件的路径(OpenSSH格式)调用它加密数据不是由我生成的,它不是用Python而是用PH
文件解密后,输出包含一些不相关的额外值。为什么结果中有额外的数据?
问题内容: PHP 5.3是否有任何类可提供RSA加密/解密而无需填充? 我有私钥和公钥,p,q和模数。 问题答案: 您可以使用phpseclib,这是一个纯PHP RSA实现:
本文向大家介绍Python使用Pycrypto库进行RSA加密的方法详解,包括了Python使用Pycrypto库进行RSA加密的方法详解的使用技巧和注意事项,需要的朋友参考一下 密码与通信 密码技术是一门历史悠久的技术。信息传播离不开加密与解密。密码技术的用途主要源于两个方面,加密/解密和签名/验签 在信息传播中,通常有发送者,接受者和窃听者三个角色。假设发送者Master想要写信给接受者Gho
让AES密码文本解密有点困难。 在这个特定的场景中,我使用Crypto-JS在客户端加密数据,并使用PyCrypto在python服务器上解密数据。 加密。js: 解密。py: 我成功地重新计算了HMAC,但当我尝试然后解密密码时,我得到了一些似乎用密码加密的东西�'结果如何。 我在密码文本的输入长度方面遇到了错误,但当我切换到CFB模式时,修复了它,所以我认为这不是一个填充问题。
作为一个自学练习,我正在尝试学习如何使用一些pycrypto库。我需要使用AES在CBC_模式下解密密文字符串。I密文、密钥和IV都已给出。以下是我编写的代码: 当我运行这个,我得到以下错误: ValueError:IV的长度必须为16字节 我知道IV字符串是32个十六进制字符,因此是16个字节。我认为这可能是一个打字问题,但我不知道如何纠正它。有人能帮忙吗? 非常感谢。