我正在阅读代码ransom ware。根据代码,作者已经将这些文件分成64 kb的块进行加密。我无法理解为什么。是否需要将文件分成块进行加密
1
A
回答
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))
相关问题
- 1. 是否需要进行HTML加密?
- 2. OAuth:我是否需要通过HTTPS对HMAC-SHA1进行加密
- 3. 我们是否需要使用插件进行模块化
- 4. 我是否需要生成第二个文件来对文件进行排序?
- 5. 文件加密成N个文件,但是至少只需要解密M个?
- 6. 加密货币是否需要区块链技术?
- 7. SHA加密 - 是否真的需要盐?
- 8. 是否需要头文件?
- 9. 是否需要resx文件?
- 10. 是否需要对文件名进行网址编码?
- 11. 是否需要对.dmg文件进行签名?
- 12. 需要使用PEM密钥进行加密和解密
- 13. 提取在Linux分裂的.tar文件,这需要分别进行解密
- 14. 是否需要配置块?
- 15. 我是否需要SSL进行论坛
- 16. mysql_close()是否需要进行REAL优化?
- 17. 是否需要对JSON进行消毒?
- 18. config.json文件是否加密?
- 19. 我们是否需要在IE8中对此进行区分?
- 20. 我是否需要WOW64转储进行GDI句柄分析?
- 21. 用于.htaccess的密码是否需要加密?
- 22. 是否需要加密认证的密钥?
- 23. 更改before_filter不需要密码进行配置文件编辑
- 24. 是否可以根据需要加载模块/组件?
- 25. 需要在Web配置文件中加密某些部分
- 26. 我们是否需要在heroku上添加security.yml进行部署?
- 27. 服务模块是否仍然需要密钥
- 28. Perl将文本文件分割成块
- 29. 在.properties文件中的加密值之前是否需要ENC功能?
- 30. 使用ansible对加密AWS .pem密钥文件进行加密
:
仅供参考,我说的是这个。 – sascha
@sascha为什么给出AES的块大小为128位? – zaph
可能会限制内存占用量vs将整个文件加载到内存中,如该实现中所需要的那样。链接代码的最上面一行是在源代码中的链接,为什么不添加注释@作者并要求澄清。 –