Я знаю, что размеры ключей в ECDH зависят от размера эллиптической кривой.
Если это 256-битная кривая (secp256k1), ключи будут:
Public: 32 bytes * 2 + 1 = 65 (uncompressed)
Private: 32 bytes
384-битная кривая (secp384r1):
Public: 48 bytes * 2 + 1= 97 (uncompressed)
Private: 48 bytes
А вот с 521-битная кривая (secp521r1) ситуация очень странная:
Public: 66 bytes * 2 + 1 = 133 (uncompressed)
Private: 66 bytes or 65 bytes.
Я использовал криптомодуль node.js для генерации этих ключей.
Почему значение закрытого ключа 521-битной кривой является переменным?





Закрытый ключ других кривых также является переменным, но они с меньшей вероятностью будут демонстрировать эту изменчивость, когда дело доходит до кодирования в байты.
Открытый ключ кодируется как два целых числа статический размер с префиксом несжатого индикатора точки 04. Размер идентичен размеру ключа в байтах.
Закрытый ключ на самом деле не имеет заранее установленной кодировки. Это одно случайное значение (или вектор) в диапазоне 1..N-1, где N — порядок кривой. Теперь, если вы закодируете это значение как беззнаковое число переменный размер, тогда как правило будет иметь тот же размер, что и ключ в байтах. Однако случайно он может быть на один байт меньше, или на два, или на три, или больше. Конечно, вероятность того, что он на много меньше, довольно мала.
Теперь 521-битный ключ немного странен, потому что первый, старший байт порядка не начинается с бита, установленного в 1; у него только значимый бит наименее установлен в 1. Это означает, что гораздо выше вероятность того, что старший байт частного значения (обычно называемый s) будет на байт короче.
Точный шанс, конечно, зависит от полной стоимости заказа:
01FF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFA
51868783 BF2F966B 7FCC0148 F709A5D0
3BB5C9B8 899C47AE BB6FB71E 91386409
но, как вы можете догадаться, это довольно близко к 1 из 2, потому что впоследствии многие биты устанавливаются в 1. Вероятность того, что двух байт не хватает, конечно же, 1 из 512, а трех байтов — 1 из 131072 (и т. д.).
Обратите внимание, что размеры подписи ECDSA также могут колебаться. Схема подписи X9.42 использует два целых числа подписал в кодировке DER. Тот факт, что они подписаны, может привести к тому, что все байты будут установлены в нули, если старший бит самого старшего байта установлен в 1, иначе значение будет интерпретироваться как отрицательное. Тот факт, что он состоит из двух чисел, r и s, и что размер кодирования DER также зависит от размера закодированных целых чисел, делает размер полного кодирования довольно трудным для предсказания.
Другое менее распространенное (плоское) кодирование подписи ECDSA использует те же целые числа статического размера, что и открытый ключ, и в этом случае он вдвое превышает размер порядка N в байтах.
ECDH не имеет этой проблемы. Обычно общий секрет представляет собой статически закодированную координату X точки, которая является результатом вычисления ECDH, или, по крайней мере, значение, полученное из него с помощью функции вывода ключей (KDF).
Вероятность того, что он на 17 байт короче, составляет 1 к 2 в степени 129 — это в два раза меньше, чем угадывание 128-битного ключа AES за один раз, поэтому можно предположить, что размер больше 49 байт :)