2016-08-24 30 views
1

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

+0


仅供参考,我说的是这个。 – sascha

+0

@sascha为什么给出AES的块大小为128位? – zaph

+0

可能会限制内存占用量vs将整个文件加载到内存中,如该实现中所需要的那样。链接代码的最上面一行是在源代码中的链接,为什么不添加注释@作者并要求澄清。 –

回答

0

为什么不明,是攻击代码作者的选择。

使用AES等当前加密方法不需要将文件大小限制为64KB。大多数实现都可以处理任何大小的文件,但将AES的大小限制为2^68个字节是明智之举。

1

如果您查看代码,加密器会将1024 * blocksize的字节(实际上是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)) 
相关问题