Позволять $d=x_2-x_1$, а открытые ключи пусть лежат на известной базовой точке $G$. Таким образом, пары ключей будут $(x_1, X_1=x_1G)$ и $(x_2, X_2=x_2G)$.
Значение $д$ может быть форсирован с помощью Большой шаг Маленький шаг метод, который займет менее секунды на современном процессоре при $n=20$.
Если вы используете подпись Шнорра для подписи сообщения $м$ с использованием $X_1$, вы бы создали пару подписей $(с, г_1)$ путем выбора равномерно случайного одноразового номера $к$, а затем вычисление $c=H(kG\mathbin\| м)$ и $r_1=k-cx_1$.
Подпись проверяется проверкой $c\overset{?}{=}H(r_1G+cX_1 \mathbin\| m)$.
Злоумышленник, совершивший перебор $д$, может затем создать подпись для того же сообщения, но, по-видимому, подписанного вашим другим закрытым ключом. $x_2$, следующее:
значения $к$ и $с$ останется прежним. Затем рассчитать $r_2=r_1-cd$. Поддельная подпись - это пара $(с, г_2)$.
Подпись будет проверена путем проверки того, что $c\overset{?}{=}H(r_2G+cX_2 \mathbin\| m)$.
Это успешно проверит, если $kG==r_2G+cX_2$, что будет верно, если $k==r_2+cx_2$.
Заменив $r_2==r_1-cd$ и $x_2==d+x_1$, мы можем видеть, что это будет верно благодаря нашему выбору $r_2$.
Эта атака работает только в том случае, если хеш или сообщение не связывают подпись с конкретным открытым ключом. Если протокол требует, чтобы $с$ вместо этого был рассчитан как $c=H(kG\mathbin\| X_1\mathbin\| m)$, атака не сработает, потому что значение $с$ нельзя было повторно использовать между подписями (поскольку верификатор проверял бы подпись путем конкатенации $X_2$ внутри хеша вместо $X_1$).