Python RSA文件加密 - 解密结果因大文件而异

时间:2017-03-30 02:04:24

标签: python python-3.x cryptography rsa pycrypto

我知道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))

然后我做了类似的解密。

1 个答案:

答案 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.因此,根据明文块的前(几个)位,所有位将在解密后翻转。