DER (Distinguished Encoding Rules) — это канонический бинарный формат
сериализации структур ASN.1. В контексте криптографических подписей он
используется для представления пары значений (r, s),
формируемых алгоритмами типа ECDSA.
ECDSA-ключевые подписи математически состоят из двух целых чисел
фиксированной битности:
- r — результат вычислений по кривой
- s — значение, зависящее от хеша сообщения и
приватного ключа
В Web Crypto API при использовании ECDSA через
SubtleCrypto.sign() результат возвращается именно в
DER-кодировке:
Особенности DER-формата:
- переменная длина представления чисел
- наличие ASN.1 заголовков (тип, длина)
- возможность появления ведущего байта
0x00 для
сохранения знака числа
- строгое каноническое кодирование (однозначность представления)
Типичный DER-encoded ECDSA подписи начинается с байта:
Далее следует длина, затем два INTEGER-элемента.
IEEE P1363 (raw формат
подписи)
IEEE P1363 определяет альтернативное представление подписей, часто
называемое “raw signature format”.
Для ECDSA это фиксированная конкатенация:
signature = r || s
Ключевые характеристики:
- отсутствует ASN.1 структура
- отсутствуют метаданные длины элементов
- r и s приводятся к фиксированной длине (padding слева нулями при
необходимости)
- результат строго фиксированного размера
Например, для кривой P-256:
- r: 32 байта
- s: 32 байта
- итоговая подпись: 64 байта
Принципиальные различия
форматов
Структурность
DER:
- структурированный формат
- содержит метаданные (типы, длины)
- самодокументируемый
P1363:
- плоский бинарный буфер
- структура известна только по контексту алгоритма
- минимальный размер
Размер подписи
DER:
- переменная длина
- зависит от значений r и s
- обычно 70–72 байта для P-256, но может варьироваться
P1363:
- фиксированная длина
- строго 2 × размер кривой в байтах
Обработка ведущих нулей
DER:
- допускает добавление
0x00 для сохранения положительного
знака INTEGER
- влияет на итоговый размер
P1363:
- ведущие нули используются только для выравнивания до фиксированной
длины
- структура не зависит от знака (интерпретация unsigned)
Поведение Web Crypto API
Web Crypto API (SubtleCrypto) не предоставляет выбора
между DER и P1363 для ECDSA:
crypto.subtle.sign("ECDSA", key, data) →
DER
crypto.subtle.verify("ECDSA", key, signature, data) →
ожидает DER
То есть WebCrypto следует ASN.1 DER стандарту по умолчанию.
Для алгоритмов:
ECDSA
- вход: данные (ArrayBuffer)
- выход: DER-подпись
RSA-PSS / RSA-PKCS1
- подпись возвращается как “raw integer-like buffer”
- но без ASN.1 структуры (не DER и не P1363 в чистом смысле)
Ed25519 / EdDSA
- всегда фиксированный raw формат (64 байта)
- не DER
- не ASN.1
- ближе к P1363 по концепции, но не идентичен спецификации IEEE
P1363
Причины существования двух
форматов
DER исторически связан с инфраструктурой:
- X.509 сертификаты
- OpenSSL
- PKCS#7 / CMS
- Java Cryptography Architecture
P1363 появился как оптимизация:
- минимизация размера передачи
- упрощение парсинга
- удобство в сетевых протоколах
Интероперабельность
и практические проблемы
JWT / JWS (ES256, ES384, ES512)
В JSON Web Signature используется формат, эквивалентный P1363:
- подпись =
R || S
- кодируется в Base64URL
Однако WebCrypto возвращает DER, поэтому требуется
преобразование.
Типичный разрыв:
- WebCrypto → DER
- JWS → P1363
Конвертация DER → P1363
Процесс:
- Распарсить ASN.1 SEQUENCE
- Извлечь r и s
- Удалить ASN.1 заголовки
- Привести r и s к фиксированной длине
- Конкатенировать
Конвертация P1363 → DER
Обратный процесс:
- Разделить буфер пополам
- Интерпретировать как INTEGER
- При необходимости добавить leading zero
- Упаковать в ASN.1 SEQUENCE
Размеры подписей в
популярных кривых
| Кривая |
DER (типично) |
P1363 |
| P-256 |
~70–72 байта |
64 байта |
| P-384 |
~104–108 байт |
96 байт |
| P-521 |
~140–144 байт |
132 байта |
Влияние на безопасность
и совместимость
Формат подписи не влияет на криптографическую стойкость алгоритма, но
влияет на:
- совместимость между библиотеками
- корректность валидации подписи
- возможность повторного использования в разных протоколах
DER-формат более универсален в традиционных PKI-системах, тогда как
P1363 предпочтителен в современных веб-протоколах и легковесных
реализациях.
Типичные ошибки при
работе с WebCrypto
Ошибка проверки
подписи из внешнего источника
Ситуация:
- подпись получена из JWT (P1363)
- проверяется через WebCrypto (DER)
Результат:
- verify всегда возвращает
false
Неправильное
предположение о фиксированной длине DER
Некорректно:
- ожидание, что подпись ECDSA всегда 64 байта
Фактически:
- DER может быть длиннее из-за ASN.1 overhead
Потеря ведущих нулей при
конвертации
Если r или s начинаются с 0x00, их удаление приводит
к:
- изменению значения числа
- полной невалидности подписи
Практическая модель выбора
формата
В экосистеме WebCrypto фактически закрепилось разделение:
- WebCrypto (ECDSA) → DER
- JWS / JWT → P1363
- OpenSSL → DER
- низкоуровневые протоколы → P1363 или raw
Это разделение требует постоянной трансформации данных при интеграции
систем, особенно в браузерных приложениях, работающих с внешними API и
токенами.