В криптографии заполнение — это любой из множества различных методов, каждый из которых включает добавление данных в начало, середину или конец сообщения перед шифрованием.
Это сжатое предложение;
Режимы блочного шифрования, такие как CBC и ECB, требуют заполнения, чтобы можно было правильно зашифровать блоки сообщений - не все сообщения кратны размеру блока шифра. Обычное заполнение — PKCS#7, применяется в конце. В последнее время в моде такие режимы, как CTR, которые не требуют отступов. Это удалило один вектор атаки; атака оракула заполнения.
Шифрование с открытым ключом RSA требует заполнения для защиты от атак, в этом случае данные имеют префикс некоторых фиксированных и случайных символов.
- ОАЭП: $\text{T=lhash||PS||01||Сообщение}$
- ПККС#1.v5: $\text{EM = 0x00 || 0x02 || ПС || 0x00 || Сообщение}$
Во время хеширования, если нам нужно объединение двух строк, мы не объединяем две строки путем чистой конкатенации строк, а добавляем специальные разделители, чтобы предотвратить простое столкновение;
$$Hash(\texttt{abcd||efgh}) = Hash(\texttt{abc||defgh})$$ куда $s_1 = abcd, s_2 = efgh, s_3 = abc, s_4 = defgh$ это 4 разные строки, но их конкатенация создает одно и то же значение хеш-функции. Чтобы смягчить ситуацию, мы применяем некоторые отступы в середине с некоторыми специальными значениями для домена;
$$Hash(\texttt{abcd||<sperator>||efgh}) \neq Hash(\texttt{abc||<sperator>||defgh})$$ изменение коллизии незначительно для хорошего криптографического хэша.
В классической криптографии заполнение может включать в себя добавление бессмысленных фраз к сообщению, чтобы скрыть тот факт, что многие сообщения заканчиваются предсказуемым образом.
Это связано с тем, что мы не хотим давать злоумышленнику известный открытый текст, против которого были небезопасны почти все классические алгоритмы.
Рассмотрим шифр Хилла размера $n$ и если последний блок содержит только один символ из сообщения и если вы заполняете оставшиеся фиксированным известным значением, то вы дали злоумышленнику свой ключ. Им просто нужно решить систему уравнений 26 раз, чтобы получить ключ шифрования.
Как видите, заполнение больше связано с безопасностью и функциональностью.
Похоже, контрольная сумма служит тем же способом, который добавляется в сообщение, и верификатор проверяет по сумме и по модулю предварительно согласованный делитель.
Контрольная сумма предназначена для обнаружения ошибок. Здесь мы различаем контрольную сумму с целостностью в криптографии, где мы используем хеш-функции. Хэш-функции могут обеспечивать обнаружение ошибок, однако они более эффективны, чем контрольные суммы.
Имейте в виду, что хотя заполнение может указывать на ошибки, как заполнение PKCS#7, это не означает, что целью является целостность (или контрольная сумма), и что интересно, эта ошибка используется для атак оракула заполнения для расшифровки сообщений на серверах, которые возвращают Ошибка.