Просто прочитайте это: https://bitcoin.stackexchange.com/a/1715/
Каков процесс создания сжатых ключей публикации через ECDSA?
Не существует алгоритма для создания сжатых открытых ключей из ключей закрытых ключей. На самом деле, все внутренние вычисления, связанные с точками, выполняются с использованием координат x
и соответствующих точек. y
Нет другого способа работать с точками, кроме как с помощью (x,y)
координат. Сжатое представление точки полезно при передаче и хранении данных, поскольку для передачи точки требуется всего 33 байта, а не 65. Очень легко перейти от compressed -> uncompressed
того, когда возникает необходимость выполнять операции, связанные с точками, и еще проще перейти от uncompressed -> compressed
представления. Чтобы ответить на ваш вопрос, вы должны сгенерировать открытый ключ, как обычно, с несжатым публичным ключом, и, когда вы закончите, искать четность или нечетность ключа.y
координата. Если он четный, закодируйте только x
координату с 0x02
байтом префикса, а если он нечетный, то префикс 0x03
. Чтобы вернуться compressed -> uncompressed
(на самом деле я просто имею в виду найти исходную y
координату), вы должны просто решить уравнение кривой:
y^2 = x^3 + a*x + b
В частности, для secp256k1 кривая, используемая в биткойнах, a
равна нулю, что упрощает этот расчет, и есть сокращение: из-за свойства параметра кривой p
, где p ≡ 3 mod 4
мы можем получить y
координату из x
координаты, просто вычислив:
q = (p+1) * invmod(4) mod p
y = powmod(y^2,q) mod p
И вот мы y
вернули исходную координату.
y
координат следует выбрать при распаковке точки.С небольшой помощью arubi я нарисовал эту картинку. Синяя часть — это логика ECDSA. Ключи WIF и закрытые ключи связаны через кодирование/декодирование base58check. В зависимости от того, как вы предоставляете закрытый ключ (сжатый или несжатый), программное обеспечение решает, как создать открытый ключ и биткойн-адрес. Очевидно, биткойн-адрес будет отличаться для сжатых/несжатых ключей. С несжатыми ключами у вас есть 512-битный ключ публикации с компонентами x/y, тогда как сжатый ключ публикации может быть представлен только как компонент x. Программное обеспечение добавит префикс 04 для несжатого файла или 02 (если четный y) или 03 (если y нечетный) и будет использовать его в качестве входных данных для sha256/ripemd160 для создания хэша публичного ключа. На последнем шаге снова используется кодировка base58check с контрольной суммой.
Пример (тестнет):
privkey Hex: 18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
privkey WIF: 91msh178DnLBqFhbuYqazuUwWpKBkRQvgj8bggdWMp81nVp9PfM
privkey WIF-c: cNR4jZU2sR5goytD4wXT4aeKcbqGSekbxLxY69v8aryxTU1SMnJZ
pubkey hex без сжатия (04 + x + y):
04 50863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B2352 2CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6
pubkey сжат в шестнадцатеричном формате (02 + x, y = четный):
02 50863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B2352
соответствующие биткойн-адреса:
(pubkey uncompressed): mfcSEPR8EkJrpX91YkTJ9iscdAzppJrG9j
(pubkey compressed): n3svudhm7bt6j3nTT9uu1A57Cs9pKK3iXW
x
и y
, а его длина составляет 1 + 64 байта (как несжатый публичный ключ), но байт префикса может быть либо , 0x07
либо 0x06
.y
координаты, закодированной в ключе. Я не думаю, что гибридный ключ когда-либо использовался в основной сети, но, тем не менее, он является действительным публичным ключом и может отображаться в сценарии. WIF-кодирования гибридного закрытого ключа не существует, но любой может подписать и выкупить скрипт p2pkh с помощью такого ключа, и мы не узнаем, пока он не будет передан для траты. Включив его в вашу диаграмму, публичный ключ станет входом для третьего шага.
пебвиндкрафт