【发布时间】:2023-03-25 12:38:01
【问题描述】:
此代码适用于适合 RAM 的文件 myfile:
import Crypto.Random, Crypto.Cipher.AES # pip install pycryptodome
nonce = Crypto.Random.new().read(16)
key = Crypto.Random.new().read(16) # in reality, use a key derivation function, etc. ouf of topic here
cipher = Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_GCM, nonce=nonce)
out = io.BytesIO()
with open('myfile', 'rb') as g:
s = g.read()
ciphertext, tag = cipher.encrypt_and_digest(s)
out.write(nonce)
out.write(ciphertext)
out.write(tag)
但是如何使用这种技术加密一个 64 GB 的文件呢?
显然,g.read(...) 应该使用较小的缓冲区大小,例如128 MB。
但是,它对加密部分是如何工作的?我们应该为每个 128 MB 的块保留一个 (ciphertext, tag) 吗?
或者整个文件是否可以只有一个tag?
【问题讨论】:
-
我会使用更小的缓冲区大小,
bytearray大小类似于 65536。您可以尝试不同的大小,看看是否有任何性能差异。加密可以分段完成。对于每条数据d,您可以通过调用cipher.encrypt(d)获得一段密文。在最后一块之后,您必须致电cipher.digest()获取标签。 -
@PresidentJamesK.Polk 谢谢,我想这就是答案!您可以将其发布为答案。关于标签:
.digest()将适用于整个文件还是仅适用于最后一块? -
.digest()适用于自创建密码对象以来传递给.update()和.encrypt()的所有内容,所以是的,整个文件。 -
您对我在@PresidentJamesK.Polk 发布的解决方案有何看法?是你心里想的吗?您会将
tag放在末尾(导致this problem 在末尾停止读取减去16 个字节),还是放在开头,从而需要多次使用f.seek(...)?
标签: python cryptography pycrypto aes-gcm pycryptodome