Привет Джеймс,
Похоже, что несколько недоразумений здесь. Позвольте мне начать с каким-то фоном. Это легче объяснить, что происходит, если мы отвлечемся немного: давайте начнем с определения
группа. Группа просто набор с операцией (так называемый +), некоторого множества элементов 0, что 0 + х = х + 0 = х для всех х в группе, и одноместной операцией - такие, что х + (-x) = 0 для всех х в группе. Таким образом, целые числа с добавлением представляют собой группа (как вещественные числа, рациональные и т.д.), вещественные числа с умножением представляют собой группа, множество обратимых матриц пХпа представляют собой группу под матричным умножением, и т.д.
Важная группа в криптографии является
эллиптическая кривая группа, которая представляет собой группу, элементы которой являются пары (х, у) чисел, которые удовлетворяют уравнение эллиптического кривое. Сложение определяется в немного смешно, но есть
Wikipedia страница на нем, что интересно.
Что важно об этих группах для криптографии заключается в следующем: дан элемент группы G, вы можете "умножать" целым числом п, путем добавления G к себе п раз. (Если п отрицательна, добавьте -G к себе -n раз.) Оказывается, что если зафиксировать элемент G в некоторой группе, а затем взять все элементы {Нг} для целых п это множество сама группа такая, что (Ng) + (мг) = (N + M) G. Это верное утверждение, что при ненулевых элементах в этой группе, скажем, P и Q, всегда есть некоторое число п такой, что P = NQ. Но для группы точек эллиптической кривой, есть так называемый "дискретный логарифм предположение" который говорит, что на самом деле вычисления п очень трудно. Существует также "Диффи-Хеллмана" предположение, которое говорит, что с учетом Ng, Мg в группе, то трудно вычислить НМГ. (Конечно, если вы знаете, н или м, это легко вычислить. Поэтому "общий секрет" Схема вы описали это эффективно вычислимая участниками, а также предположение Диффи-Хеллмана, почему это тайна.)
Так ... везде вы говорите Curve25519 (N, G), вы на самом деле означает Нг, где G является некоторый элемент в эллиптической кривой, определенной кривой curve25519 Djb в. Где вы говорите Curve25519 (A, B), где А и B являются элементами .... Я не знаю, что вы имеете в виду. Можете ли вы уточнить, что вы на самом деле вычисления здесь? Возможно, вы интерпретируете, как числа точек кривой не осознают этого, в этом случае вы должны использовать лучший язык программирования, который имеет тип системы. (В частности, С имеет очень слабую систему типа и код Djb использует символ * для
все, который является ослиным, что нужно сделать в общественном коде с тонкой работой. Но, возможно, он компилирует код быстрее, чем это было бы, если бы он использовал обертку .. структуры) можно преобразовать групповой элемент в ряд, например, путем выбора двоичного кодирования, хэширования это, и интерпретировать хэш как число.
Теперь, общие секреты не очень полезно для построения схем multisignature. Они позволяют построить 1-из-N подписей (каждая сторона, которая имеет секрет может подписать), но ничего сильнее. Причина заключается в том, что любая сторона, которая знает общий секрет, может использовать это, чтобы подписать произвольные сообщения. В качестве примера реальной схемы multisig, я покажу, как построить N-из-N multisig Шнорра подписи. Семантика будет, что до тех пор,
все Стороны соглашаются подписать конкретное сообщение, они могут сформировать подпись на этом сообщении. Тем не менее, ни один человек не будет видеть достаточно секретный материал для формирования подписи или ее собственной, или даже в сотрудничестве (менее N) других членов.
Схема ed25519 подписи Djb базируется от стандартной Шнорры подписи, но есть некоторые изменения, чтобы обеспечить эффективную проверку партии. Я не помню, что эти изменения (и не имеют бумаги со мной на автобусе, что я печатаю это с), так что я не уверен, если это применимо непосредственно .... но это иллюстративное в любом случае. Так вот это:
Предположим, у нас есть общественный P ключ, и пусть G образующая некоторой эллиптической кривой, и пусть Н хэш-функции. Стандартная схема шнорра представляет собой пару (с, е) чисел, которые удовлетворяют следующее соотношение: если R = эп + Sg то е = Н (м || R). Можно создать такую подпись, если вы знаете х, что XG = P (так х секретный ключ здесь, и "дискретный логарифм предположение" выше, поэтому она является секретной, даже если Р является публичным), с помощью следующего механизма: выбирают случайные секретные к и вычислить R = кГс; затем положить е = H (M || R) и S = K - ХЕ. Подпись (s, е). Учитывая некоторые очень сильные предположения о хэше-функции (что является непрозрачным мистическим источником равномерно случайных чисел, кроме того, что она возвращает тот же результат, когда данные же вход), мы можем доказать, что любой алгоритм, который подделывает подпись Шнорры может быть расширен, чтобы извлечь Секретный ключ. Поэтому, учитывая такую хэш-функцию, кузнечна подпись Шнорры так сложно, как дискретная задачу журнала.
Теперь возникает вопрос: как мы можем сделать подпись 2-в-2? Одна из идей, как Вы предложили, чтобы использовать общий секрет: пользователи имеют секретные значения х и у и образуют закрытый ключ из (хэш) XYG. Проблема с этим, как упоминалось: обе стороны знают весь секрет, так что они могут как форма подписи на своих собственных. Так что это на самом деле схема multisig 1-из-2. Для того, чтобы получить 2-из-2, мы должны быть немного более умным. Вот протокол:
0. Предположим, что мы имеем две пары ключей (х, XG) и (у, YG), принадлежащие сторонам А и В. Покажем, как построить подпись с "2-оф-2" ключ (х + у (х + у) G).
1. Обе стороны выбирают секретные случайные числа. Вызов секретного альфа элементов а и секретный & beta; Б. А посылает αG к В, и В посылает βG А. Теперь обе стороны могут вычислить R = αG + βG = (a + b) G, и они вычислить е = H (M || R).
2. вычисляет S'= а - ХЕ и В вычисляет S „“ = β - вы, и они посылают их друг к другу. Тогда оба вычислить S = S'+ s ''.
Теперь (s, е) подпись м на открытом ключе (х + у) G, которая требует сотрудничества обеих сторон в форме, но ни одна из сторон получила достаточно информации, чтобы произвести такую подпись в одиночку.
Это стоит упражнение (а) убедиться в том, что стандартная схема шнорра к - х действительно удовлетворяет соотношению (е = Н (т || R), где R = Sg + Ep), что я утверждал, что сделал, и (б) так делает 2-из-2 версии.
Это не совсем ответ на ваш вопрос, но я надеюсь, что это проливает некоторый свет на вещи.
Андрей
да! это делает его намного понятнее, но до сих пор пытается сопоставить все эти операции в код C.
Я обрабатывал функцию curve25519 как Blackbox, что я думал, что делаю операцию поля, но он делает много вещей с некоторыми байтами, являющимися полиномами, кодируемым или нет, и других являются числами:
curve25519_donna (u8 * mypublic, Const u8 * секрет, Const u8 * Basepoint)
конечности п.н. [5], х [5], г [5], zmone [5];
uint8_t е [32];
Int я;
для (я = 0; я < 32; ++ я) е [я] = секрет [I];
е [0] &= 248;
е [31] &= 127;
е [31]
Кажется, curve25519 (A, B) не имеет смысла, и он может быть использован только для Ng
Таким образом, чтобы закодировать свой протокол:
0. Предположим, что мы имеем две пары ключей (х, XG) и (у, YG), принадлежащие сторонам А и В. Покажем, как построить подпись с "2-оф-2" ключ (х + у (х + у) G).
1. Обе стороны выбирают секретные случайные числа. Вызов секретного альфа элементов а и секретный & beta; Б. А посылает αG к В, и В посылает βG А.
Я считаю, что G представлен {9}
(Х, XG) и (у, YG) являются стандартными curve25519 (х, О) и curve25519 (Y, G) пары ключей
Я думаю, мне нужно использовать функцию cmult сделать αG и βG:
/ * Вычисляет NQ, где Q является х-координата точки на кривой
*
* Resultx / resultz: координаты х полученной точки кривой (короткая форма)
* П: немного обратным порядком байтов, 32-битовый номер
* Д: точка кривой (короткая форма)
* /
статическая сила cmult (конечности * resultx, конечность * resultz, Const U8 * п, Const конечность * д)
А будет генерировать случайные 256 бит -> а и посылает cmult (X, Z, a, G) до В
В генерирует случайные его 256 бит -> р и посылает cmult (X, Z, p, G) к А
теперь оба А и В можно вычислить (αG + βG)
Теперь обе стороны могут вычислить R = αG + βG = (α + β) G,
, но я не уверен, как именно это сделать, есть "fmonty" функция:
/ * Input: Q, Q 'Q-Q'
* Выход: 2Q, Q + Q»
*
* X2 z3: длинная форма
* X3 z3: длинная форма
* Х г: короткая форма, разрушенные
* Xprime zprime: короткая форма, разрушенный
* QMQP: короткая форма, сохраняется
* /
статическая сила
fmonty (конечности * х2, конечности * * 2, / * выход 2Q * /
конечности * х3, конечности * Z3, / * Выход Q + Q»* /
конечностей * х, конечности * г, / * вход Q * /
конечностей * xprime, конечности * zprime, / * вход Q»* /
Const конечность * QMQP / * вход Q - Q»* /)
Я думаю, что Q может быть αG и Q «βG, но не знаете, как получить третий вход (Q-Q») или (αG - βG), глядя на код, похоже, это может быть просто G {9}?
и они вычислить е = H (M || R).
Я полагаю, Н может быть SHA256 и оба А и В можно вычислить R = αG + βG
е = sha256 (м || (αG + βG))
и т есть подпись, но я совершенно запутался следующее:
2. вычисляет S'= а - ХЕ и В вычисляет S „“ = β - вы, и они посылают их друг к другу. Тогда оба вычислить S = S'+ s ''.
Подпись два числа с и е, а т является подписью и он находится внутри хэш-функции.
sha256 ((с, е) || (αG + βG)) ?? не имеют ни малейшего представления о том, как это сделать.
Предполагая, что как-то е можно рассчитать, то есть последний вопрос из них того, мульт и вычитаний:
А (а - ХЕ) = S'-> В
В (β - Ye) = S '' ->
, и S = S'+ s ''
Может быть, это нормальные цифры и нормальная арифметика могут быть использованы?
Я извиняюсь за возможно супер просто недоразумение, но, по крайней мере, теперь я вижу намного лучше тип вещи, что происходит.
Джеймс
Постскриптум Большое спасибо за супер информативный пост!