Надеясь удовлетворить приглашение @fgrieu в комментариях, я пытаюсь ответить, исходя из реализации Monero. Источником этих слов является шпаргалка, которую я написал https://getmonero.org/library/RingsCheatsheet20210301.pdf во время учебы https://www.getmonero.org/library/Zero-to-Monero-2-0-0.pdf
Я считаю правильным начать с неинтерактивной (в духе Fiat-Shamir) подписи Шнорра для ключей над эллиптической кривой. Давайте быстро повторим это.
скажем $(х,х)$ пара закрытый/открытый ключи, где $X\треугольникqxG$ с $G$ генераторная точка ЭК; $tx$ это транзакция/текст/все, что нам нужно подписать; Подписание $tx$ с $х$ означает возможность генерировать пару $(с,г)$ так что:
$H(tx, rG + cX)=c$
куда $Ч$ является хешем (неважно, какой именно) и $с$ и $г$ называются «вызовом» и «ответом», причем термины исходят из интерактивной схемы. $с$ получается из секретного случайного уникального $\альфа$ известна только подписывающей стороне и никогда не используется повторно в двух подписях, а вышеприведенное равенство эквивалентно:
$rG + cX = \альфа G$
(кстати, заменив, вы получите, как $с$ определено ;) )
Итак, глядя на это с высоты птичьего полета, можно сказать, что проверка $tx$ подпись $х$ является функцией подписанного материала, открытого ключа, вызова и ответа:
$f(tx,X,r,c)$
Кольцевые подписи предназначены для поиска вариантов этой схемы с помощью приманок, сохраняя при этом только одного ФАКТИЧЕСКОГО подписывающего (с технической точки зрения: требуется много $X_i$ - скажем $n$- при проверке алгоритма, но одиночного $х$ в алгоритме подписи); и все это без согласования между заинтересованными ключевыми владельцами.
Для каждого есть вызов и ответ $X_i$, так что у нас есть $c_i$ и $r_i$, однако дела обстоят согласованный так что от $c_i$ мы можем рассчитать $с_{я+1}$, с "переполнением", когда $я=n$ (вот оно "кольцо"), итак:
$H(tx, r_{i}G + c_{i}X_{i})=c_{i+1}$ с $1 \le i \le n-1$
$H(tx, r_{n}G + c_{n}X_{n})=c_1$ с $я=n$
учитывая, что мы можем регрессировать от $c_n$ к $c_1$ вышеуказанные условия приводят к функции проверки подписи:
$f(tx, X_i, r_i, c_1)$
Но откуда берется «магия»? Как договоренность сделано, чтобы иметь $c_i$ образуя замкнутую цепочку, в которой по одному значению задачи можно вычислить все остальные (обратите внимание, что мы выбрали $c_1$ как особенный, но в этом нет ничего особенного)?
Что ж, благодаря этим фактам:
- если мы укажем как $с_\пи$ вызов, связанный с ФАКТИЧЕСКИМ подписывающим лицом, $с_{\пи+1}$ вычисляется из случайного секрета $\альфа$ известно только ФАКТИЧЕСКОМУ подписавшемуся (это что-то напоминает? ;) );
- все остальные $c_i$ рассчитываются по приведенной выше цепной формуле;
- все $r_i$ просто случайные числа, за исключением $r_\pi$ который выбран так, чтобы позволить $с_{\пи+1}$ также уважать цепную формулу (даже если она исходит от $\альфа$)
И вот, наконец, ключевой образ $Х^*$! Часть рекламируется в транзакции для предотвращения двойных расходов, она также является частью $c_i$ исчисление, и снова $\альфа$Используется трюк с формулой /chain: и он выполняется только в том случае, если ключевое изображение $Х^*$ получается очень специфическим способом, функцией закрытого и открытого ключей ФАКТИЧЕСКОГО подписывающего лица.
Вот почему вы не можете просто выбрать случайный еще неиспользованный!
Я понимаю, что это только основная линия рассуждений, многие детали упущены, но я надеюсь, вы сможете найти их в шпаргалке с помощью этих слов-компаньонов (полагаю, для ваших нужд вас может волновать только "Неинтерактивный (Фиат) -Шамир) Шнорр", "САГ" и "бЛСАГ")