Размер закрытого ключа ECDH

Я знаю, что размеры ключей в 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-битной кривой является переменным?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
2 510
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Закрытый ключ других кривых также является переменным, но они с меньшей вероятностью будут демонстрировать эту изменчивость, когда дело доходит до кодирования в байты.

Открытый ключ кодируется как два целых числа статический размер с префиксом несжатого индикатора точки 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 байт :)

Maarten Bodewes 30.01.2019 05:25

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