Первоначальная схема подписи Шнорра страдает от атаки по связанным ключам (RKA), как описано Морита и др.. Затем авторы этой статьи предлагают изменить алгоритм подписи для предотвращения RKA следующим образом:
- Установлен $\psi \leftarrow g^x$, куда $х$ является закрытым (подписывающим) ключом схемы.
- Установите хэш вызова $h \leftarrow H(M || r || \psi)$.
Второй шаг выше отличается от исходной схемы Шнорра (здесь), который требует только $h \leftarrow H(r || M)$.
Эта модификация имеет смысл, однако статья Morita et al. говорит (на странице 9):
«Обратите внимание, что второй шаг алгоритма подписи, вычисление $\psi \leftarrow g^x$, не следует изменять, чтобы просто использовать ключ подтверждения $у$ как $\psi$."
Авторы не объясняют, почему $у$ (открытый / проверочный ключ) нельзя использовать вместо $\psi$, несмотря на то, что имеют точно такое же значение - есть ли для этого причина?
Что делает это еще более запутанным, так это то, что, когда Шнорр был добавлен в Биткойн в софт-форке Taproot, разработчики Bitcoin Core написали свою собственную реализацию для подписей Шнорра (как описано в BIP340), включая меры по смягчению последствий RKA. Однако в BIP340 они решили использовать $у$ в хэше вызова $\psi$, что противоречит предыдущей рекомендации.
Является ли эта реализация неправильной?