Как обрабатывать ошибки заполнения в pkcs11?

Мне интересно как C_DecryptFinal & C_Decrypt должны иметь дело с ошибками заполнения.

Согласно pkcs11 2.20, C_DecryptFinal может вернуться CKR_ENCRYPTED_DATA_INVALID или же CKR_ENCRYPTED_DATA_LEN_RANGEтак что я полагаю, что если заполнение недопустимо, C_DecryptFinal/C_Decrypt вернуть CKR_ENCRYPTED_DATA_INVALID,

Это правильно?

Если это так, C_DecryptFinal/C_Decrypt уязвимы для нападок оракула?

1 ответ

Ссылаясь на стандарт (раздел 11.1.6):

  • CKR_ENCRYPTED_DATA_LEN_RANGE: Вход зашифрованного текста в операцию дешифрования был определен как недействительный зашифрованный текст только на основе его длины. В зависимости от механизма операции это может означать, что зашифрованный текст слишком короткий, слишком длинный или не кратен некоторому конкретному размеру блока. Это возвращаемое значение имеет более высокий приоритет, чем CKR_ENCRYPTED_DATA_INVALID.

  • CKR_ENCRYPTED_DATA_INVALID: Зашифрованный ввод для операции дешифрования был определен как недействительный зашифрованный текст. Это возвращаемое значение имеет более низкий приоритет, чем CKR_ENCRYPTED_DATA_LEN_RANGE.

Так что для блочных шифров CKR_ENCRYPTED_DATA_LEN_RANGE должен быть возвращен, когда вход не выровнен по блокам.

Если вход выровнен по блокам, CKR_ENCRYPTED_DATA_INVALID вероятно, возвращается в случае неправильного заполнения для CKM_*_PAD механизмы.

Таким образом, атака отступающего оракула, вероятно, возможна.


Поскольку заполнение PKCS#7 является единственной определенной схемой заполнения для блочных шифров, приложение часто отвечает за обработку заполнения, что приводит к тому, что, как мне кажется, должно быть ответом на ваш вопрос:

  • Приложение (то есть "клиент криптоки") не может предоставить внешнему злоумышленнику (то есть "клиенту приложения") никакого оракула, чтобы определить, что заполнение было неверным, независимо от источника этой информации (то есть криптоки). или само приложение).

  • Вероятно, бессмысленно защищать от атаки оракула-дополнения на уровне интерфейса криптоки (т. Е. Злоумышленника внутри приложения), поскольку такой злоумышленник может расшифровать все что угодно по своему усмотрению, используя соответствующие функции.


(Конечно, лучше использовать некоторую форму аутентифицированного шифрования и вообще не нужно беспокоиться об атаке с использованием оракулов).

Desclaimer: Я не эксперт по криптографии, поэтому, пожалуйста, подтвердите мои мысли.

Другие вопросы по тегам