Средний Урок 2 4 мин чтения

От закрытого ключа к открытому ключу: кривая secp256k1

Публичный ключ — это частный ключ, умноженный на фиксированную точку. Уход занимает миллисекунды — а вот обратный процесс никто в мире не умеет делать.

Многие представляют себе закрытый и открытый ключи как две половины пары, которые создаются одновременно. Это не так. Существует только одно число, и это число — закрытый ключ. Открытый ключ — это вычисление, основанное на этом числе: тот, у кого есть закрытый ключ, может вычислить открытый за доли секунды, но обратный процесс никто в мире сделать не может.

Закрытый ключ — это целое число, и ничего больше: число между 1 и пределом чуть ниже 2^256. Нет ни регистрации, ни сервера, ни органа, который его выдает. Выбрать случайное число в этом диапазоне — это уже иметь кошелек, и именно это имел в виду предыдущий модуль, когда повторял, что тот, у кого есть ключ, перемещает монеты.

Что превращает это число в открытый ключ, так это операция, выполненная на кривой. Кривая Bitcoin называется secp256k1, и ее уравнение умещается в одну строку: y² = x³ + 7. График не является гладкой дугой из школьных учебников: координаты — это целые числа в конечном поле, где p равно 2^256 минус 2^32 минус 977. График — это облако разбросанных точек, и арифметика этого облака — тема для продвинутого изучения. Здесь достаточно одного правила.

Правило заключается в том, что две точки на кривой, сложенные вместе, дают третью точку на той же кривой: проведите прямую через две точки, посмотрите, где она пересекает кривую в третий раз, и отразите это пересечение на другую сторону оси. Результат никогда не выходит за пределы кривой.

Существует начальная точка, называемая G, генератор. Она не выбирается вами или вашим кошельком: она записана в стандарте с фиксированными координатами и является одной и той же точкой для всех кошельков Bitcoin с момента создания блока генезиса.

Все начинают с одного и того же камня. Что отличает один ключ от другого, так это количество шагов, которые он сделал оттуда.

Ваш открытый ключ — это G, сложенный с самим собой столько раз, сколько стоит ваш закрытый ключ. Если закрытый ключ — это число k, то открытый — это точка kG — точка, умноженная на число, операция, называемая скалярным умножением.

Сложение G с самим собой в таком порядке величины, шаг за шагом, заняло бы больше, чем возраст Вселенной — и все же вычисление происходит мгновенно. Трюк заключается в удвоении вместо сложения. Сложив точку с самой собой, вы получаете два; удвоив, четыре; удвоив снова, восемь. С 256 удвоениями и несколькими сложениями в середине можно достичь любой точки в интервале.

Обратного трюка не существует. Данная точка kG, зная, что начальная точка была G, нахождение k — это задача дискретного логарифма. После сорока лет попыток лучший известный метод все еще требует порядка 2^128 шагов. Урок 5 измеряет это число. Пока что важно понять форму асимметрии: легко в одном направлении, невозможно в другом, как функция хеширования из предыдущего урока — только здесь, с другой стороны, не файл. Это ваши деньги.

Повторить удар просто. Посмотреть на неподвижный шар и сказать, сколько ударов было, никто не умеет.

Выбор кривой был странным в то время. secp256k1 была опубликована в 2000 году SECG, группой, связанной с канадской компанией Certicom, и почти никто ее не использовал: мир работал с P-256, от американского института NIST. Сатоши выбрал менее используемую. Параметры secp256k1 слишком просты, чтобы скрывать что-то — ноль и семь в уравнении, p чуть ниже 2^256 —, в то время как параметры P-256 происходят из констант, которые никогда не были объяснены. В 2013 году документы, утекшие от Эдварда Сноудена, показали, что АНБ заплатило десять миллионов долларов, чтобы ослабить другой стандарт из той же семьи, Dual_EC_DRBG. Никогда ничего не было доказано против P-256, и есть криптографы, которые защищают его до сих пор; можно сказать, что выбор 2008 года хорошо выдержал испытание временем.

Отсюда следует самая практическая из всех последствий: закрытый ключ никогда не должен покидать место, где он был создан. Устройство вычисляет открытый ключ на его основе, и именно открытый ключ путешествует — это то, что видит сеть и что входит в формулу вашего адреса. Аппаратный кошелек существует полностью из-за этой асимметрии — он хранит число и выдает точку.

Матрица остается на столе; то, что выходит за дверь, — это отпечаток, который она произвела.

То, что вы отправляете, когда просите кого-то заплатить вам, — это не открытый ключ. Это более короткая цепочка, которая все еще содержит механизм для отказа от неправильно введенного символа. В следующем уроке — адрес, построенный байт за байтом.