【问题标题】:Encrypt a big file that does not fit in RAM with AES-GCM使用 AES-GCM 加密不适合 RAM 的大文件
【发布时间】: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


【解决方案1】:

正如@PresidentJamesK.Polk 的评论中提到的,这似乎是解决方案:

out.write(nonce)
while True:
    block = g.read(65536)
    if not block:
        break
    out.write(cipher.encrypt(block))
out.write(cipher.digest())  # 16-byte tag at the end of the file

唯一的问题是,在读回这个文件进行解密时,stopping at the end minus 16 bytes is a bit annoying

或者也许应该这样做:

out.write(nonce)
out.seek(16, 1)  # go forward of 16 bytes, placeholder for tag
while True:
   ...
   ...
out.seek(16)
out.write(cipher.digest())  # write the tag at offset #16 of the output file

?

【讨论】:

  • 应该可以的。对于在结束前停止 16 个字节,如果从文件中读取,那么您可以使用链接到的解决方案,但对我来说,避免 ftell() 并使用 os.stat().st_size 获取文件大小并仅读取 st_size - 16 似乎更简单字节。然后读入标签的最后 16 个字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2015-02-18
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2022-01-15
  • 2015-02-23
相关资源
最近更新 更多