Подробное объяснение проблемы, включающее текст криптографических стандартов PKCS#5 и PKCS#7, см. здесь.
Заполнение PKCS#5 означает заполнение от 1 до 8 байтов. Сами байты заполнения содержат количество байтов заполнения, закодированное как байт. Заполнение PKCS#5 было указано для DES, но оно подходит для любого блочного шифра с размером блока 8 байт.
Теперь спецификации DES и даже спецификация PKCS#5 для шифрования на основе пароля предшествовали Java на довольно долгое время. AES был стандартизирован только в 2002 году, намного позже появления Java и даже Java 2. Таким образом (тройное) заполнение DES и PKCS#5 было интегрировано в Java до появления AES.
Когда Java — или, точнее, провайдер Sun JCE — получил функциональность AES, потребовался метод заполнения для блока размером 16 байт. PKCS#7 определяет этот метод заполнения, который идентичен заполнению PKCS#5, за исключением того, что он определен для размеров блоков. от 2 до 255 байтов (максимальное значение байта, если он кодирует целое число без знака, отсчитываемое от нуля). Однако метод заполнения уже существовал; он был назван "PKCS5Padding"
. Поэтому вместо того, чтобы вводить новое имя, "PKCS5Padding"
просто использовалось повторно.
К настоящему времени поставщик Sun должен действительно поддерживать "PKCS7Padding"
, поскольку заполнение PKCS#5 просто неверно. Это не просто проблема именования Java, это проблема любого разработчика, пытающегося внедрить криптографические протоколы или перенести другие приложения на Java. Однако сейчас вы должны использовать "PKCS5Padding"
вместо "PKCS7Padding"
.
person
Maarten Bodewes
schedule
24.01.2015