有必要将文件分成块进行加密吗

2024-09-27 21:26:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我在读ransom ware的代码。根据代码,作者将文件分成64kb的块进行加密。我不明白为什么。在


Tags: 文件代码作者wareransom
2条回答

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

使用当前的加密方法(如AES)不必将文件大小限制为64KB。大多数实现都可以处理任何大小的文件,但是对于AES来说,将大小限制在2^68字节是明智的。在

如果你看一下代码,加密器将1024*blocksize字节(实际上是16kib)作为一个块读取,并使用相同的密码对象分别加密每个块。在

因为一些文件必须加密,然后才能被写回很大的内存中。仅此一项就意味着可用内存必须比需要加密的文件大三倍以上。在

由于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))

相关问题 更多 >

    热门问题