2024-09-27 21:26:27 发布
网友
我在读ransom ware的代码。根据代码,作者将文件分成64kb的块进行加密。我不明白为什么。在
为什么是未知的,是攻击代码编写者的选择。在
使用当前的加密方法(如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))
为什么是未知的,是攻击代码编写者的选择。在
使用当前的加密方法(如AES)不必将文件大小限制为64KB。大多数实现都可以处理任何大小的文件,但是对于AES来说,将大小限制在2^68字节是明智的。在
如果你看一下代码,加密器将1024*blocksize字节(实际上是16kib)作为一个块读取,并使用相同的密码对象分别加密每个块。在
因为一些文件必须加密,然后才能被写回很大的内存中。仅此一项就意味着可用内存必须比需要加密的文件大三倍以上。在
由于PyCrypto没有基于流的密码实现,因此这是通过保持较小的内存占用来完成相同任务的最接近的方法。在
一般来说,每个块的加密都会产生独立的密文块,这些密文块需要以与编写时相同的分块方式读回,但这里不需要这样做。AES-CBC将当前明文块与前一个密文块进行异或。如果它是第一个块,那么IV就用作前一个密文块。因为IV永远不会在密码对象上重置,它将始终保存以前的密文块。结果是,产生的密文实际上相当于将加密作为一个单独的大区块。在
作为参考,我说的是:
相关问题 更多 >
编程相关推荐