我知道RSA一次不能加密超过128个字节(模数),因此我正在以块的形式加密和解密文件。但是,如果我的文件大于几kb,则每次运行程序时结果都会更改。有时整个文件都经过加密和正确解密。有时只有前100行等。此时我想知道它是否是Crypto.PublicKey.RSA模块的可靠性问题。这是我的代码:
def encrypt(file, public_key):
read_size = 128
with open(file, 'rb') as original_file:
e_file = file + '.e'
with open(e_file, 'wb') as encrypted_file:
while True:
file_part = original_file.read(read_size)
if len(filePart) == 0:
break
encrypted_file.write(public_key.encrypt(file_part, None)[0])
os.remove(file)
def decrypt(file, private_key):
read_size = 128
with open(file, 'rb') as encrypted_file:
d_file = file[:-2]
with open(d_file, 'wb') as decrypted_file:
while True:
file_part = encrypted_file.read(read_size)
if len(filePart) == 0:
break
decrypted_file.write(private_key.decrypt(file_part))
os.remove(file)
private_key = RSA.generate(1024)
public_key = RSA.importKey(private_key.publickey().exportKey())
my_file = 'myfile.txt'
encrypt(my_file, public_key)
decrypt(my_file + '.e', private_key)
编辑:: Maarten的回答是有效的。这是我如何用他的答案解决我的问题的具体例子。 我使用了这个导入:
from Crypto.Cipher import PKCS1_OAEP
然后我没有直接使用公钥加密,而是使用了这个:
cipher = PKCS1_OAEP.new(publicKey)
encryptedFile.write(cipher.encrypt(filePart))
然后我做了类似的解密。
答案 0 :(得分:0)
RSA要求填充是安全的,例如OAEP或较旧的,安全性较低的PKCS#1 v1.5填充。这些带来了一些开销。通常,这不是一个大问题,因为经常使用混合密码系统,其中RSA与对称密码配对。很好的选择是RSA-OAEP和AES-GCM - 您也可以先签署明文。
如果使用原始RSA,那么如果设置了最高有效位(左侧,RSA使用大端/网络顺序),则可能会遇到麻烦。在这种情况下,明文将被视为与明文模数N 相同,即RSA计算中使用的模数。
因此,例如4%5 = 4但9%5也是4)。当您执行解密时,即使输入为9,答案也将为4.因此,根据明文块的前(几个)位,所有位将在解密后翻转。