Я читал код для ransom ware. Согласно коду, автор разделил файлы на 64 kb куски для шифрования. Я не могу понять, почему.Необходимо ли делить файл на куски для шифрования
ответ
Почему неизвестен и был выбран автором кода атаки.
Нет необходимости ограничивать размеры файлов до 64 КБ с использованием существующих методов шифрования, таких как AES. Большинство реализаций обрабатывают файлы любого размера, хотя разумно ограничить размер до 2^68 байт для AES.
Если вы посмотрите на код, шифр читает 1024 байта байта (на самом деле 16 KiB) как один кусок и использует один и тот же объект шифрования для шифрования каждого фрагмента отдельно.
Это необходимо сделать, чтобы иметь возможность шифровать большие файлы, потому что некоторые файлы просто слишком велики, чтобы полностью считывать их в памяти, а затем зашифровывать, а затем записывать обратно. Это само по себе означает, что свободная память должна быть в три раза выше, чем размер файла, который необходимо зашифровать.
Поскольку PyCrypto не имеет потоковой реализации своих шифров, это самое близкое, которое выполняет ту же задачу, поддерживая небольшой объем памяти.
Как правило, шифрование каждого фрагмента будет производить независимые фрагменты зашифрованного текста, которые необходимо будет прочитать в том же порядке, как они были написаны, но здесь это не обязательно. AES-CBC XOR - текущий блок открытого текста с предыдущим блоком зашифрованного текста. Если это первый блок, то 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))
Потому что он, вероятно, используя ** блок-шифра **. – sascha
@sascha Почему дано, что размер блока составляет 128 бит для AES? – zaph
Возможно ограничить площадь памяти и загрузить весь файл в память, как это необходимо в этой реализации. Верхняя строка связанного кода - это ссылка на ее источник здесь, в stackoverflow, почему бы не добавить комментарий @ автора и попросить разъяснения. –