仅当我想在使用
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
使用相同的密钥和相同的密码,我确信这是迭代的问题。
就像总裁 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 字节的块。