Формат подписи DER vs IEEE P1363

DER (Distinguished Encoding Rules) — это канонический бинарный формат сериализации структур ASN.1. В контексте криптографических подписей он используется для представления пары значений (r, s), формируемых алгоритмами типа ECDSA.

ECDSA-ключевые подписи математически состоят из двух целых чисел фиксированной битности:

  • r — результат вычислений по кривой
  • s — значение, зависящее от хеша сообщения и приватного ключа

В Web Crypto API при использовании ECDSA через SubtleCrypto.sign() результат возвращается именно в DER-кодировке:

  • структура SEQUENCE

    • INTEGER r
    • INTEGER s

Особенности DER-формата:

  • переменная длина представления чисел
  • наличие ASN.1 заголовков (тип, длина)
  • возможность появления ведущего байта 0x00 для сохранения знака числа
  • строгое каноническое кодирование (однозначность представления)

Типичный DER-encoded ECDSA подписи начинается с байта:

  • 0x30 — ASN.1 SEQUENCE

Далее следует длина, затем два 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

Процесс:

  1. Распарсить ASN.1 SEQUENCE
  2. Извлечь r и s
  3. Удалить ASN.1 заголовки
  4. Привести r и s к фиксированной длине
  5. Конкатенировать

Конвертация P1363 → DER

Обратный процесс:

  1. Разделить буфер пополам
  2. Интерпретировать как INTEGER
  3. При необходимости добавить leading zero
  4. Упаковать в 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 и токенами.