【问题标题】:Is it necessary to divide a file into chunks for encryption是否需要将文件分成块进行加密
【发布时间】:2016-08-24 16:43:12
【问题描述】:

我正在阅读ransom ware 的代码。根据代码,作者将文件分成 64 kb 的块进行加密。我无法理解为什么。

【问题讨论】:

  • 因为他可能使用的是分组密码
  • @sascha 为什么考虑到 AES 的块大小是 128 位?
  • 可能是为了限制内存占用与将整个文件加载到内存中,这在实现中是需要的。您的链接代码的第一行是指向其在 stackoverflow 上的来源的链接,为什么不添加评论@作者并要求澄清。
  • 如果任何给定的答案解决了您的问题,您可以accept 其中一个。如果没有,请详细说明问题所在。

标签: python encryption cryptography aes pycrypto


【解决方案1】:

如果您查看代码,加密器会将 1024 * 字节大小(实际上是 16 KiB)作为单个块读取,并使用相同的密码对象分别加密每个块。

为了能够加密大文件,必须这样做,因为有些文件太大而无法全部读入内存,然后加密然后写回。仅此一项就意味着可用内存必须是需要加密的文件大小的三倍以上。

由于 PyCrypto 没有基于流的密码实现,这是通过保持较小的内存占用来完成相同任务的最接近的方法。

通常,每个块的加密会产生独立的密文块,需要以与写入时相同的分块方式读回,但这不是必需的。 AES-CBC 将当前明文块与前一个密文块进行异或。如果是第一个块,则将 IV 用作前一个密文块。由于 IV 永远不会在密码对象上重置,它将始终保存先前的密文块。结果是产生的密文实际上相当于加密为一个大块。


作为参考,我说的是这个:

def encrypt(in_file, out_file, password, key_length=32):
    bs = AES.block_size
    salt = Random.new().read(bs - len('Salted__'))
    key, iv = derive_key_and_iv(password, salt, key_length, bs)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    out_file.write('Salted__' + salt)
    finished = False
    while not finished:
        chunk = in_file.read(1024 * bs)
        if len(chunk) == 0 or len(chunk) % bs != 0:
            padding_length = (bs - len(chunk) % bs) or bs
            chunk += padding_length * chr(padding_length)
            finished = True
    out_file.write(cipher.encrypt(chunk))

【讨论】:

    【解决方案2】:

    为什么是未知的,是攻击代码编写者的选择。

    没有必要使用当前的加密方法(例如 AES)将文件大小限制为 64KB。大多数实现可以处理任何大小的文件,但明智的做法是将 AES 的大小限制为 2^68 字节。

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 1970-01-01
      • 2011-01-03
      • 2014-07-26
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2014-06-21
      • 2015-04-10
      相关资源
      最近更新 更多