Я искал, как сделать слепую подпись, основанную на стандарте ECDSA и не мог найти что-нибудь полезное. Я нашел 10-летний документ с предложением, но он предлагает формулу несовместимой со стандартной ECDSA подписью, который используется в Bitcoin: http://mshwang.ccs.asia.edu.tw/www/myjournal/P191.pdf
Моя цель состоит в том, чтобы заблокировать средства в обычной multisig сделки, где частные ключи принадлежат N друзьям. Когда они подписывают мою сделку, они не должны быть в состоянии увидеть, что тратятся или там, где он идет от и до. Нарезка ключа с помощью СВУ ("Схема Секретной Sharing Шамира") Не является идеальным вариантом, как извлеченного секрет должен быть применен на одной машине, которая не может быть доверенным (думаю, что регулярные Win PC). Когда multisig транзакция подписывается каждым участником, ни одна машина не в состоянии тратить средства произвольно.
Мой вопрос к экспертам, является ли следующий алгоритм, который использует простой коэффициент умножения выполним:
TL; DR:
1. Вы отправляете деньги на й * Публичный вместо Публичного. (Х ваш секрет целое - "ослепление фактор")
2. Вы задаете третью сторону подписать (хэш / х) вместо хэш самого ТХ.
3. Вы используете х * подпись выкупить средства.
Более конкретно:
Часть 1. Отправка средств:
1. доверенная сторона дает свою ключевую D общественности (D = d * G, d - секретный ключ, G - стандартная точка генератора).
2. Вы выбираете секретное случайное целое число х ("ослепление фактор")
3. Вычисление открытого ключа D2 = х * D
4. Отправляйте деньги D2 (это может быть один из ключей в multisig скрипта).
5. Хранить в зашифрованном бумажнике информации о х, D и сделках, чтобы провести его позже.
Часть 2. дорожа фонды:
1. Вычислить хэш-ч = signatureHash (ТХ).
2. Вычислить h2 = (ч / х) по модулю п (п - порядок нашей кривой secp256k)
3. Отправить на h2 третьей стороны должны быть подписаны с их личным ключом д.
4. Третья сторона отправляет обратно вам обычный ECDSA подпись (R, S), где s = (к ^ -1) (h2 + d * г)
5. Вы умножить на х S и получить s2 = X * S = (к ^ -1) (х * H2 + х * д * г)
6. Эта новая подпись (г, s2) эквивалентно подписи ч подписал с закрытым ключом х * й.
7. Ни вы, ни третья сторона не знает х * й (только вы знаете х, только они знают, г), но вы знаете, х * d * G = х * D = D2 - открытый ключ, полученный из их открытого ключа.
8. Таким образом, подпись (г, s2) является допустимой подписью сообщения ч проверяемой с помощью открытого ключа D2 = х * D.
9. Вы публикуете транзакцию с подписью (г, s2) и третьей стороной, не может знать, что он был подписан ими.
Есть ли вина где-нибудь? Как вы думаете?
Благодарю.
EDIT: Эта схема не удается. Как gmaxwell отметил ниже, г не ослеплен и будет признан подписавшей стороны.