К основному содержимому

Введите слово из вопроса или названия статьи.

1 · Основы

Криптография с открытым ключом: как подпись доказывает, что это вы

Как работают закрытый и открытый ключи, откуда берётся адрес, что такое цифровая подпись ECDSA и почему кошельку не нужен пароль. С наглядным примером.

3 мин чтенияОбновлено:
В этой статье

Когда вы нажимаете «Подтвердить» в кошельке, вы не вводите пароль. Вместо этого кошелёк создаёт цифровую подпись. Она доказывает, что действие одобрил владелец ключа, и при этом сам ключ остаётся секретным. За этим стоит одна из красивейших идей в математике - криптография с открытым ключом.

Идея: замок, который закрывают все, а открывает один

Представьте почтовый ящик с щелью: бросить письмо может кто угодно, а достать - только владелец ключа. В асимметричной криптографии у каждого участника пара ключей:

  • Закрытый (секретный) ключ - знает только владелец.
  • Открытый ключ - известен всем, из него получают адрес.

Эти ключи математически связаны, но связь односторонняя: из закрытого ключа открытый получить легко, а наоборот - невозможно за разумное время.

Что такое закрытый ключ

Закрытый ключ - это просто очень большое случайное число: 256 бит, то есть около 10^77 вариантов. Это сопоставимо с оценкой числа атомов во Вселенной, поэтому угадать чужой ключ перебором нельзя. Это число и есть «доступ к деньгам»: кто его знает, тот распоряжается адресом. В кошельках ключ выводится из seed-фразы, которую вы записываете при создании (как не потерять).

От ключа к адресу

В Ethereum и Bitcoin используется эллиптическая кривая secp256k1. Путь от секрета к адресу такой:

  1. Закрытый ключ k (число).
  2. Открытый ключ = точка на кривой, полученная умножением: K = k × G, где G - общая для всех «базовая точка». Результат - 64 байта.
  3. Адрес = последние 20 байт хеша от открытого ключа (что такое хеш): keccak256(K).

Вот почему адрес можно смело показывать всем. Из него нельзя вычислить открытый ключ, а тем более закрытый. Это как номер банковского счёта, а не как пароль.

Цифровая подпись

Подпись отвечает на вопрос: «Как доказать, что сообщение написал владелец ключа, не показывая ключ?»

Схема ECDSA:

  1. Отправитель берёт хеш сообщения или транзакции.
  2. Вычисляет подпись из хеша и закрытого ключа. Подпись - пара чисел (r, s) плюс «подсказка» v, всего 65 байт.
  3. Любой может проверить: по подписи и хешу вычисляется открытый ключ (и адрес) подписавшего. Совпал с адресом отправителя - подпись настоящая.

Важные свойства:

  • Подпись привязана к сообщению. Изменили одну букву - подпись перестаёт подходить.
  • Подделать её нельзя без закрытого ключа.
  • Закрытый ключ остаётся секретом, сколько бы подписей вы ни выпустили.

Пример: подпись в сделке

Анна создаёт сделку. Её кошелёк:

  1. формирует транзакцию: «вызвать createOffer с такими-то параметрами»;
  2. считает хеш транзакции;
  3. подписывает его ключом Анны;
  4. отправляет транзакцию с подписью в сеть.

Узлы сети не знают ключа Анны, но по подписи видят: отправитель - адрес Анны, и параметры не менялись. Поэтому контракт может доверять тому, что msg.sender - именно Анна: подпись проверена до того, как код контракта начал исполняться.

Что подписывают, кроме транзакций

  • Сообщения для входа («Sign-In with Ethereum»): вы доказываете сайту, что владеете адресом, без пароля и без отправки транзакции.
  • Структурированные данные (стандарт EIP-712): кошелёк показывает читаемую форму - получатель, сумма, срок (подробнее о подписях).
  • Разрешения (permit): подпись, позволяющая контракту списать токены без отдельной транзакции approve (об этом).

Чем подпись отличается от шифрования

Подпись не прячет содержимое - она подтверждает авторство и целостность. Шифрование, наоборот, прячет содержимое от посторонних. Блокчейн в основном использует подписи: всё публично, но подделать нельзя.

Что почитать дальше

Узнайте, как из одной фразы получаются все ваши ключи: HD-кошельки и seed-фраза. Или вернитесь к практике: чек-лист безопасности кошелька.

Упоминается в статьях

Готовы попробовать?

Создайте первую сделку за пару минут. Деньги блокируются в смарт-контракте и выплачиваются по правилам, которые видны заранее.