Podpisz bez znajomości klucza prywatnego w ECDSA

Ten post został po raz pierwszy opublikowany na Medium.

Pokazujemy, jak wygenerować ważny podpis bez znajomości klucza prywatnego przy użyciu algorytmu podpisu cyfrowego krzywej eliptycznej (ECDSA).

Podpisanie ECDSA

Alicja ma zatem klucz prywatny (d) i klucz publiczny (Q = dG). Podpisuje wiadomość (m), wykonując następujące kroki:

Zaszyfruj wiadomość: h = HASH(m).
Utwórz losową liczbę k i oblicz R = kG. Znajdź współrzędną x R R.
Oblicz s = (h + rd)/k.
Podpisem jest para (r, s). Zarówno r, jak i s są liczbami skalarnymi.

Podpisz bez znajomości klucza prywatnego

Konwencjonalnie Alicja musi znać klucz prywatny, aby wygenerować ważny podpis na podstawie swojego klucza publicznego. Co ciekawe, prawidłowy podpis można wygenerować bez znajomości klucza prywatnego w następujący sposób:

Wygeneruj liczbę losową r. Jeśli na krzywej nie ma punktu R, którego współrzędną x jest r, po prostu wypróbuj inną wartość r.
Wygeneruj liczbę losową s.
Oblicz klucz publiczny jako Q = (sR – hG)/r.
(r, s) to ważny podpis dla klucza publicznego Q i wiadomości m. Aby zobaczyć dlaczego, możemy wyprowadzić Q w następujący sposób:

s = (h + rd)/k
sk = godz + rd
skG = hG + rdG
sR = hG + rQ
Q = (sR – hG)/r

Nazywamy Q kluczem publicznym bez klucza, ponieważ nie pochodzi on ze znanego klucza prywatnego. W umowie nazwijmy klucz publiczny kluczem, jeśli pochodzi on ze znanego klucza prywatnego, jak to zwykle się robi.

Należy pamiętać, że podpis jest generowany najpierw przed wygenerowaniem klucza publicznego, co jest przeciwieństwem zwykłego podpisu ECDSA.

Implikacje

Jeśli klucz publiczny jest generowany bez klucza, tylko osoba, która go generuje, może wystawić na nim ważny podpis, zawierający podpis i wiadomość z hashem h. Podpis i wiadomość działają tutaj wspólnie jako klucz prywatny, który istnieje, ale jest nieznany. Uwaga: skrót wiadomości h jest używany i dlatego jest zatwierdzany przy obliczaniu Q, co oznacza, że podpis jest ważny tylko dla m, ale nie dla żadnej innej wiadomości. Zarówno podpis, jak i wiadomość są potrzebne, aby podpis mógł zostać zweryfikowany z kluczem publicznym.

Klucz bezkluczykowy a klucz z kluczem

Klucz prywatny klucza publicznego z kluczem jest znany, natomiast klucz bezkluczykowy jest nieznany. W scenariuszu z kluczem klucz publiczny jest znany przed podpisaniem, natomiast w scenariuszu bezkluczowym jest odwrotnie.

Patrząc na sam klucz publiczny, nie można określić, czy jest on kluczowy czy bezkluczykowy.

Nawet jeśli dla jednej wiadomości zostanie ujawniony jeden podpis, nie można zdecydować, czy klucz publiczny jest kluczowy, czy nie, ponieważ podpis może pochodzić z klucza prywatnego lub zostać wygenerowany wcześniej.

Jeśli jednak Alicja może podpisać się pod wiadomością wybraną przez Boba, jest niezwykle prawdopodobne, że zna klucz prywatny, ponieważ nie zna wcześniej wiadomości zapisanej w kluczu publicznym i nie może wygenerować prawidłowego podpisu.

Jeśli istnieją podpisy dla dwóch różnych wiadomości, nawet obu wybranych przez Alicję, możemy być pewni, że klucz publiczny jest kluczowany.

Użyj w Bitcoinie

Zarzuca się, że klucz publiczny (oznaczony jako Q₀) w transakcji Bitcoin Genesis Coinbase nie wymaga klucza. Jeśli tak, osoba posiadająca podpis może podpisać jedną wiadomość, tę używaną przy obliczaniu Q₀. Nie może podpisać żadnej innej wiadomości.

Jednak podpis jest ważny tylko poza łańcuchem, ale nie w łańcuchu. Monet wysłanych na ten Q₀ nie można wydać z takim podpisem, także tych wysłanych po bloku Genesis¹. Aby zrozumieć dlaczego, musimy sprawdzić, jaka wiadomość jest podpisana podczas tworzenia transakcji. Zasadniczo obejmuje bieżącą transakcję wydatków oraz wydatkowaną produkcję. Dane wyjściowe zawierają Q₀ w części skryptowej, co oznacza, że m zależy od Q₀. Jednak samo Q₀ zależy od skrótu h, m. Ta cykliczna zależność (aby uzyskać Q₀, potrzebujesz najpierw m, ale aby otrzymać m, potrzebujesz najpierw Q₀), podobna do podpisu, który nie może podpisać się w Bitcoinie, uniemożliwia wygenerowanie Q₀.

Należy pamiętać, że dotyczy to dowolnego klucza publicznego w bitcoinie, nie tylko Q₀.

Realizacja

Poniżej znajduje się pełny działający przykład, w którym generowany jest podpis bez znajomości klucza prywatnego.

gist.githubusercontent.com/xhliu/1e1bdfec41e6b03c243e33359d922e5e/raw/07c00621eb3a5e93e10e1b536ff52c484e9abbec/unknownPrivkeySig.ts

Każdy może to uruchomić i samodzielnie zweryfikować. Poniżej przedstawiono przebieg próbny.

Bibliografia

Blake, I.F., Seroussi, G. i Smart, N.P. (red.) (2005) Postępy w kryptografii krzywych eliptycznych. Cambridge: Cambridge University Press (seria notatek z wykładów London Mathematical Society).
Wykres: Buchanan, William J (2024). Algorytm podpisu cyfrowego na krzywej eliptycznej (ECDSA). Asecuritysite.com. https://asecuritysite.com/ecdsa/ecdsa2


[1] Wyjście Coinbase w bloku Genesis nie może zostać wydane, nawet jeśli zawarty w nim klucz publiczny jest kluczowany, ponieważ nie jest zawarty w zestawie UTXO. https://Gist.github.com/msinkec/5eaf5aa97ed0f5e8d66e7e32fd8b1a0a

Obejrzyj: Tożsamość cyfrowa, zasoby cyfrowe umożliwiają Web3

Autor : BitcoinSV.pl

Źródło : Sign without knowing the private key in ECDSA – CoinGeek

Author: BitcoinSV.pl
CEO