密码学“cryptography.fernet.InvalidToken” while 循环与 functools.partial

问题描述 投票:0回答:1

仅当我想在使用

cryptography.fernet.InvalidToken
迭代文件时解密数据时,才会收到
functools.partial
错误。

key = Fernet.generate_key()
print(key)
cypher = Fernet(key)


def encryypt():
    with open('file.pdf', 'rb') as f, open('file2.pdf', 'wb') as target_f: 
        for _bytes in iter(partial(f.read, 10*2048), ''):
            encrypt_data = cypher.encrypt(_bytes)
            target_f.write(encrypt_data)
            if not _bytes:break
    target_f.close()

def decryypt() :
    with open('file2.pdf', 'rb') as ff, open('file3.pdf', 'wb') as target_ff: 
        for __bytes in iter(partial(ff.read, 10*2048), ''):
            decrypt_data = cypher.decrypt(__bytes)
            target_ff.write(decrypt_data)
            if not __bytes:break
encryypt()
decryypt()

加密()函数工作完美,但解密()失败并出现以下错误:

Traceback (most recent call last):
  File "C:\Users\#\#\.venv\Lib\site-packages\cryptography\fernet.py", line 134, in _verify_signature
    h.verify(data[-32:])
cryptography.exceptions.InvalidSignature: Signature did not match digest.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\Users\#\#\Bin2\Start\test.py", line 43, in <module>
    decryypt()
  File "c:\Users\#\#\Bin2\Start\test.py", line 39, in decryypt
    decrypt_data = cypher.decrypt(__bytes)
                   ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\#\#\.venv\Lib\site-packages\cryptography\fernet.py", line 91, in decrypt
    return self._decrypt_data(data, timestamp, time_info)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\#\#\.venv\Lib\site-packages\cryptography\fernet.py", line 152, in _decrypt_data
    self._verify_signature(data)
  File "C:\Users\#\#\.venv\Lib\site-packages\cryptography\fernet.py", line 136, in _verify_signature
    raise InvalidToken
cryptography.fernet.InvalidToken

使用相同的密钥和相同的密码,我确信这是迭代的问题。

python cryptography functools
1个回答
0
投票

就像总裁 James K.Polk 所说,Fernet 并不是为了加密大数据或流数据。

来自医生

限制:

Fernet 非常适合加密易于放入内存的数据。作为一个 设计功能它不会暴露未经验证的字节。这意味着 完整的消息内容必须在内存中可用,使得 Fernet 目前一般不适合非常大的文件。

因此,通过 Fernet 迭代加密数据的唯一方法是对数据进行分块,然后对其进行加密。

在下面的代码中,我们将文件分成 6MB 的块,然后对其进行加密。

in_file = 'linux.zip'
enc_file = 'linux_enc.zip'
out_file = 'linux_out.zip'
key = Fernet.generate_key()
cypher = Fernet(key)


def encryypt():
    with open(in_file, 'rb') as f, open(enc_file, 'wb') as target_f: 
        for _bytes in iter(partial(f.read,600000), ''):
            if not _bytes:break
            encrypted_data = cypher.encrypt(_bytes)
            target_f.write(encrypted_data)
            print(f'encrypted block size:{str(len(encrypted_data))}')  
    target_f.close()

def decryypt() :
    with open(enc_file, 'rb') as ff, open(out_file, 'wb') as target_ff: 
        for __bytes in iter(partial(ff.read,800100), ''):
            if not __bytes:break
            decrypted_data = cypher.decrypt(__bytes)
            target_ff.write(decrypted_data)
            print(f'decrypted block size:{str(len(decrypted_data))}')  
        target_ff.close()
encryypt()
decryypt()

为了解密,我们需要增加块大小,因为加密后文件更大。

要加密 6000000 字节的块,我们必须解密 8000100 字节的块。

© www.soinside.com 2019 - 2024. All rights reserved.