Рейтинг:3

Теоретически возможно ли делегировать генерацию открытого ключа?

флаг in

Представьте себе следующий сценарий:

В данной криптовалюте конфиденциальность должна быть максимально высокой.
Для этого для каждой входящей транзакции создается новая учетная запись с новым адресом (адрес является открытым ключом пары закрытый/открытый ключ). Однако пользователи не всегда находятся в сети, чтобы создавать новые учетные записи с новыми адресами, как только кто-то хочет отправить им деньги. Поэтому все пользователи должны иметь возможность создавать новые учетные записи с новыми адресами для других пользователей, когда они хотят отправить кому-то деньги. Разумеется, только получатель должен иметь возможность тратить деньги, переведенные на счета, созданные для него другими людьми.

Все это должно быть основано на ЕСС, то есть расширение ЭЦДСА Алгоритм, так сказать.
Но, как только что было описано в примере с криптовалютой, только тому человеку, для которого был сгенерирован открытый ключ, разрешено подписывать сообщения для этого открытого ключа или расшифровывать данные, которые были зашифрованы этим открытым ключом.

Поскольку безопасность используемого криптографического алгоритма имеет решающее значение для криптовалюты, только НИСТ и SECG будут использоваться предварительно созданные и стандартизированные параметры кривой, которые, как известно, безопасны и эффективны.

Единственные технические изменения, которые следует учитывать, заключаются в следующем.:

Примечание: Поскольку адрес учетной записи будет соответствующим открытым ключом пары ключей, термины «адрес» и «открытый ключ» в дальнейшем будут использоваться взаимозаменяемо.

Параметры из алгоритма ECDSA:

  • $д$ = случайно сгенерированный закрытый ключ
  • $G$ = базовая точка эллиптической кривой

Изменения:

  • Доступный интервал для закрытых ключей уменьшен с $[1, n - 1]$ к $[1, \frac{n}{2} - 1]$
  • Как и в случае с генерацией открытого ключа, точка $P$ рассчитывается следующим образом: $P = d \times G$. Эта точка $P$ формирует так называемый ключ генерации делегированного адреса (ключ DAG).
  • Чтобы сгенерировать адрес (открытый ключ) для другого человека, используется случайный так называемый ключ рандомизации адреса (ключ AR) ($я$) с тем же интервалом, что и у закрытого ключа ($[1, \frac{n}{2} - 1]$) должен быть сгенерирован
  • Для генерации адреса для произвольного человека ключ DAG ($P$) этого человека добавляется умножением ключа AR ($я$) и базовая точка ($G$): $Q = P + i \times G$. С $P$ является $d \раз G$, должно выполняться следующее: $Q = P + i \times G = (d + i) \times G$. Эта точка $Q$ формирует новый адрес лица, чей ключ DAG использовался для расчета.

Пример:

  1. Алиса создает случайно сгенерированный закрытый ключ ($д$).
  2. Алиса использует свой закрытый ключ для создания ключа DAG ($P$)
  3. Алиса делает ключ DAG общедоступным
  4. Боб хочет сгенерировать адрес (открытый ключ) для Алисы и для этого получает от Алисы ключ DAG.
  5. Боб создает случайно сгенерированный ключ AR.
  6. Боб создает новый адрес для Алисы, используя ключ DAG Алисы и ключ AR, сгенерированный на предыдущем шаге.
  7. Боб отправляет сумму на вновь созданный адрес
  8. Боб отправляет ключ AR Алисе
  9. Только Алиса может отправлять деньги с этого адреса, потому что только она может создавать действительные подписи для вновь созданного адреса (открытого ключа). Для этого ей просто нужно вычислить приватный ключ к этому адресу следующим образом: $ д + я $ (добавление ее закрытого ключа $д$ и ключ АР $я$ созданный Бобом).

Вопросы:

Возможно ли вообще теоретически делегировать генерацию открытого ключа?

Если да, возможно ли такое изменение стандартного алгоритма ECDSA? Другими словами, создавать открытые ключи для других людей, не зная и не раскрывая закрытый ключ к этому открытому ключу?

Или есть лучший подход к решению этой проблемы?

meshcollider avatar
флаг gb
BIP-32 и другие схемы генерации иерархических детерминированных адресов допускают делегирование генерации открытого ключа.
флаг in
Спасибо @meshcollider, я посмотрю на это. Знаете ли вы, работает ли это так, как я предложил?
meshcollider avatar
флаг gb
Чем-то похожи, да. Основные отличия заключаются в том, что он детерминирован (использует хеш-функцию для выбора того, что вы называете AR, чтобы Алиса могла сгенерировать его в одиночку), и вам не нужно ограничивать диапазон закрытых ключей (группа является циклической, поэтому, если вы добавите большие ключи он будет "обертывать" по модулю группового порядка)
флаг in
Имеет смысл! Это действительно круто. Большое спасибо @meshcollider, это мне очень помогает! И да, я понятия не имел, как назвать эти «ключи».
Рейтинг:3
флаг es

Если я правильно понял вашу схему, то Алисе нужен отдельный защищенный канал для связи $я$ к Бобу.

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

У получателя есть две пары ключей: $(а, А=аГ)$ и $(б, В=bG)$, куда $G$ является известной базовой точкой.

Отправитель создает пару эфемерных ключей $(г, R=rG)$ и публикует $R$.

Одноразовый открытый ключ назначения $H(rA)G+B$, куда $Ч$ является криптографически безопасным хэшем, который возвращает скалярное значение.

Соответствующий закрытый ключ может быть восстановлен только получателем, т.к. $H(aR)+b$.

Причина, по которой получатель имеет две пары ключей, заключается в том, что ему требуется только закрытый ключ. $а$ быть необходимым для сканирования входящих средств и дополнительно требовать только второй закрытый ключ $б$ когда необходимо потратить средства. Однако, если вам не нужно это различие, получатель может иметь только одну пару ключей. $(а,А)$ и тогда одноразовый открытый ключ назначения будет $H(rA)G+A$ и соответствующий закрытый ключ будет $H(aR)+a$.

Вы можете прочитать о реализации Monero одноразовых адресов в разделе 4.2. здесь и стр. 7 оригинального технического описания CryptoNote. здесь.

kelalaka avatar
флаг in
Ирония заключается в том, что как только поступающие средства достигают $A$, вам нужно перевести их на свои расходы в $B$.
knaccc avatar
флаг es
@kelalaka В Monero ничего не передается из $A$ в $B$. Единый адрес кошелька — это объединение открытых ключей $A$ и $B$. Средства тратятся напрямую путем ссылки на одноразовый открытый ключ в кольцевой подписи. Я просто хотел указать, что вам нужны только $a$ и $B$ для сканирования входящих средств, и только в момент траты вам нужно дополнительно знать $b$. Это позволяет жестко ограничить доступ к $b$, так как его нужно знать только тогда, когда необходимо потратить средства.
kelalaka avatar
флаг in
Да, я знаю о вашем указании. Можете ли вы предоставить ссылку, чтобы прочитать его из Monero?
knaccc avatar
флаг es
@kelalaka Конечно, это раздел «4.2 Одноразовые адреса» здесь: https://www.getmonero.org/library/Zero-to-Monero-2-0-0.pdf В моих обозначениях $a$ — это частный ключ просмотра, а $b$ — приватный ключ трат.
knaccc avatar
флаг es
@kelalaka спасибо, добавил
knaccc avatar
флаг es
@kelalaka Я добавил ссылку на копию этой статьи, так как ссылка cryptonote.org не работает, когда я пытаюсь щелкнуть по ней. Обратите внимание, что в статье CryptoNote есть ошибка, поскольку она определяет $H_s()$ как создание элемента поля, тогда как вместо этого она должна создавать скаляр, меньший, чем размер группы базовой точки.
флаг in
@knaccc Вау, это великолепно! Именно то, что я искал и намного лучше, чем то, что я придумал. Большое спасибо! Единственное, что я еще не понял: зачем мне включать (криптографически безопасный хэш) при генерации ключей? А что нужно хешировать, чтобы получить ?
knaccc avatar
флаг es
@E.Bramtergan $H(rA)$ означает скалярное умножение точки эллиптической кривой $r$ на $A$, обработку результата как последовательности байтов и применение хэша (например, SHA-512/256) в обычном образом, а затем выполните $mod\ell$ для результата, где $\ell$ — это порядок базовой точки, который будет зависеть от выбранной вами кривой. Причина, по которой вам нужен $H()$, состоит в том, чтобы преобразовать общий секрет Диффи-Хеллмана $rA==aR$ в скаляр, чтобы его можно было использовать в качестве закрытого ключа в уравнении.Документы Monero, на которые я ссылаюсь, объясняют все это гораздо более подробно.
флаг in
@knaccc Понятно. Действительно приятно, люблю это. Еще раз спасибо!

Ответить или комментировать

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