Понимание основ криптографии: как генерируются закрытые и открытые ключи

Ключи и адреса

Ethereum имеет два разных типа учетных записей: внешние учетные записи (EOA) и контракты. Право собственности на эфир устанавливается с помощью закрытых ключей, адресов Ethereum и цифровых подписей. Закрытые ключи находятся в центре всех пользовательских взаимодействий с Ethereum. На самом деле адреса учетных записей получаются непосредственно из закрытых ключей: они однозначно определяют единый адрес Ethereum, также известный как учетная запись.

Закрытые ключи

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

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

Генерация закрытого ключа из случайного числа

Первый и самый важный шаг в создании ключей — найти безопасный источник энтропии или случайности. Генерация закрытого ключа Ethereum включает выбор числа от 1 до 2²⁵⁶. Программное обеспечение Ethereum использует генератор случайных чисел операционной системы для генерации 256 случайных битов.

Закрытый ключ может быть любым ненулевым числом вплоть до большого числа чуть меньше 2²⁵⁶ — массивного 78-значного числа, примерно 1,158 * 10⁷⁷.

Чтобы сгенерировать закрытый ключ, важно сделать это в автономном режиме и не связываться с сетью Ethereum. Не рекомендуется использовать «простой» генератор случайных чисел, предлагаемый языком программирования, или писать собственный код для создания случайного числа. Это связано с тем, что такие методы могут не обеспечивать истинной случайности и потенциально могут быть использованы злоумышленниками. Лучше всего использовать безопасный метод, такой как генератор случайных чисел операционной системы, чтобы обеспечить случайность и безопасность закрытого ключа.

Открытые ключи

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

Чтобы сгенерировать открытый ключ, закрытый ключ используется в уравнении, включающем необратимое умножение на эллиптической кривой. Уравнение: K = k * G, где K — открытый ключ, k — закрытый ключ, а G — постоянная точка (точка генератора).

Умножение на эллиптических кривых отличается от обычного умножения. Это односторонняя функция, которую легко выполнить в одном направлении (умножение), но невозможно в обратном направлении (деление). Это делает его полезным инструментом для создания открытого ключа из закрытого ключа, поскольку он гарантирует, что закрытый ключ не может быть получен из открытого ключа. Криптография на основе эллиптических кривых.

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

Эфириум использует ту же эллиптическую кривую, secp256k1, что и Биткойн.

Ethereum использует определенную эллиптическую кривую и набор математических констант, определенных в стандарте под названием secp256k1. Кривая secp256k1 определяется следующей функцией, которая создает эллиптическую кривую:

y ² = ( x³ + 7 ) over ( 𝔽 p )
or:
y ² |p| = ( x³ + 7 ) |p|

mod p указывает, что эта кривая находится над конечным полем простого порядка p, где p = 2²⁵⁶–2³²–2⁹–2⁸–2⁷–2⁶–2⁴–1. Это очень большое простое число, что делает эту кривую очень надежной.

Форматы адресов Ethereum

Адреса Ethereum создаются путем взятия хэша открытого ключа Keccak-256 и представления его в виде шестнадцатеричного числа. Последние 20 байт хэша Keccak-256 используются для генерации адреса.

Генерация открытого ключа

Вы можете установить инструмент командной строки helpeth, используя npm для создания адресов ICAP.

npm install -g helpeth

Если у вас нет npm, возможно, вам придется установить его, следуя инструкциям на https://nodejs.org.

helpeth keyGenerate

Выход:

Address: 0xe16c1623c1aa7d919cd2241d8b36d9e79c1be2a2
Address (checksum): 0xe16C1623c1AA7D919cd2241d8b36d9E79C1Be2A2
ICAP: XE56 QBY1 TCEL SB4U 7BTR QQRC IOUY 8UNS DK2
Public key: 0xaa931f5ee58735270821b3722866d8882d1948909532cf8ac2b3ef144ae8043363d1d3728b49f10c7cd78c38289c8012477473879f3b53169f2a677b7fbed0c7
Private key: 0x227dbb8586117d55284e26620bc76534dfbd2394be34cf4a09cb775d593b6f2b

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

helpeth keyDetails \
  -p 0x227dbb8586117d55284e26620bc76534dfbd2394be34cf4a09cb775d593b6f2b

Выход:

Address: 0xe16c1623c1aa7d919cd2241d8b36d9e79c1be2a2
Address (checksum): 0xe16C1623c1AA7D919cd2241d8b36d9E79C1Be2A2
ICAP: XE56 QBY1 TCEL SB4U 7BTR QQRC IOUY 8UNS DK2
Public key: 0xaa931f5ee58735270821b3722866d8882d1948909532cf8ac2b3ef144ae8043363d1d3728b49f10c7cd78c38289c8012477473879f3b53169f2a677b7fbed0c7

«Протокол Interchange Client Address Protocol (ICAP) обеспечивает гибкую, совместимую с контрольной суммой систему кодирования адресов Ethereum. Адреса ICAP могут кодировать адреса Ethereum или общие имена, зарегистрированные в реестре имен Ethereum. Совместимость ICAP с кодировкой международного номера банковского счета (IBAN) делает его полезным инструментом для кодирования адресов Ethereum».

Ручной метод

Вычисление открытого ключа вручную из закрытого ключа с использованием алгоритма цифровой подписи на эллиптических кривых (ECDSA) и кривой secp256k1 — сложный процесс, который лучше оставить специализированным библиотекам или инструментам. Однако для тех, кто интересуется математическими подробностями, формула получения открытого ключа выглядит следующим образом:

Public Key = Private Key * G

Где G — фиксированная точка генератора на кривой secp256k1, а Private Key — 256-битный закрытый ключ в шестнадцатеричном формате.

Координаты этой точки указаны в стандарте и широко используются в большинстве реализаций. Координаты Gin secp256k1:

x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
y = 32670510020758816978083085130507043184471273380659243275938904335757337482424

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

Эта операция выполняется с использованием математических операций, определенных кривой secp256k1, таких как сложение точек и скалярное умножение. Обратите внимание, что приведенная выше формула является высокоуровневым представлением процесса, фактические вычисления намного сложнее и обычно выполняются специализированными библиотеками или инструментами.

Рекомендации

[1]: Освоение Ethereum: создание смарт-контрактов и DApp, Андреас М. Антонопулос, Гэвин Вуд.

Больше для вас