Перейти к содержимому
ecdsa.com

DER (отличительные правила кодирования)

Каноническое двоичное кодирование ASN.1 из ITU-T X.690, при котором у каждого значения ровно одно байтовое представление; поэтому сертификаты, CSR, CRL, ключи и многие подписи кодируются в DER.
Другие написанияDistinguished Encoding RulesDER encodingBERX.690

Каждое значение имеет вид «тег — длина — значение»: байт тега (0x30 SEQUENCE, 0x02 INTEGER, 0x03 BIT STRING, 0x04 OCTET STRING, 0x05 NULL, 0x06 OBJECT IDENTIFIER, 0x0C UTF8String, 0x17 UTCTime), длина (один байт, если она меньше 128, иначе 0x81/0x82… и за ним байты длины) и содержимое. DER — ограниченная форма BER: только длины определённой формы, минимальное кодирование длин и целых чисел, 0xFF для TRUE, отсортированные элементы SET OF.

Каноническое кодирование важно, потому что подпись покрывает точные байты: tbsCertificate сертификата при повторном кодировании должен давать те же самые байты, иначе подпись не пройдёт проверку. Нестрогие парсеры, которые принимают BER там, где требуется DER, приводили к пластичности подписей (BIP 66 в Bitcoin) и к обходу проверки в нескольких библиотеках.

Целые числа в DER знаковые, поэтому к положительному значению, у которого установлен старший бит, в начало добавляется 0x00; именно поэтому подписи ECDSA в DER для P-256 занимают от 70 до 72 байт. PEM — это просто DER в base64 со строками заголовка BEGIN и END. Просмотр структуры ASN.1 локально декодирует любую структуру DER.

Стандарты и ссылки

Инструменты

Сравнения

Термины

Библиотеки

Статьи

Ошибки

Все термины