Subtle.encrypt
, кажется, реализует WebCrypto.Хотя документация encrypt()
или режим CBC, например, Mozilla, не показывает заполнение.Также не указана спецификация NIST.
К счастью, указанный API-интерфейс WebCrypto указывает заполнение , где указан режим CBC :
При работе в режиме CBC,сообщения, которые не являются точными кратными размеру блока AES (16 байтов), могут быть дополнены различными схемами заполнения.В Web Crypto API поддерживается только один режим заполнения - это PKCS # 7, как описано в разделе 10.3, шаг 2, [RFC2315] .
Если вы перейдете по ссылке, то обнаружите, что PKCS # 7 является спецификацией синтаксиса криптографических сообщений или CMS.Однако указан только один режим заполнения.Этот режим не имеет более конкретного имени, чем заполнение PKCS # 7 (алгоритмы заполнения для ECB и CBC очень просты и поэтому часто не получают конкретного имени).
Проще говоря, этодобавляет от 1 до 16 байтов для шифров с размером блока 128 бит, таких как AES.Значения байтов идентичны количеству заполненных байтов, так что вы можете снять, удалив столько байтов, сколько указывает последний байт.Из-за этого заполнение всегда применяется , даже если последняя часть открытого текста завершена (в этом случае применяется заполнение 16 байтов).
Таким образом, у вас будет
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 // empty, zero byte message
PT 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F // PT means plaintext byte
PT PT 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E // byte values in hexadecimals
...
PT PT PT PT PT PT PT PT PT PT PT PT PT PT PT 01 // 15-byte message
// 16-byte message, one full block of padding added
PT PT PT PT PT PT PT PT PT PT PT PT PT PT PT PT 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
...
...
Обратите внимание, что заполнение не должно использоваться для проверки правильности открытого текста, что нападение оракула заполнения (вместо этого используйте режим аутентификации, такой как GCM!)то, что значения заполнения могут быть не все проверены (последний байт содержит достаточно информации для распаковки) и, наконец, вам следует использовать реализацию, которая проверяет, что байт заполнения находится в указанном диапазоне.
Также обратите внимание, что PKCSЗаполнение # 7 для AES иногда ошибочно (или лениво) упоминается как заполнение PKCS # 5 , например, в Java JCA.