Автор(ы): Тимур Бадретдинов
Дата подачи заявки.


В криптокошельках закрытый ключ дает пользователю доступ к кошельку. Человек с закрытым ключом имеет полный контроль над монетами в этом кошельке. Вот почему вы должны держать его в секрете — вы не можете использовать его для доступа к своему кошельку. И если вы действительно хотите создать свой собственный ключ, имеет смысл создать его безопасным.
Этот раздел содержит введение в закрытые ключи и показывает, как создавать собственные ключи, используя различные криптографические функции. Приведены алгоритмы на языке Python и описание кода.
Нужно ли мне создавать закрытый ключ?
В большинстве случаев нет. Например, если вы используете онлайн-кошелек, такой как Coinbase или BlockChain.info, вы создаете и управляете своим закрытым ключом. То же самое относится и к биржам.
Мобильные и настольные кошельки обычно создают секретный ключ для вас, но вы можете создать кошелек из своего собственного ключа.
Так зачем его создавать? Вот причины, которые у меня есть
- Вы хотите убедиться, что никто не знает ваш ключ
- Вы просто хотите узнать больше о шифровании и производстве случайных чисел (RNG)
Что такое закрытый ключ?
Технически, закрытый ключ биткоина (и многих других криптовалют) представляет собой серию из 32 байт. В настоящее время существует множество способов записи этих байтов. Это может быть строка из 256 и нулей (32 *) или 100 игральных костей. Это может быть двоичная строка, base64, WIF-ключ, монофраза или, наконец, шестнадцатеричная строка. Для наших целей мы будем использовать 64-символьную шестнадцатеричную строку.
Почему именно 32 байта? Отличный вопрос! Для создания открытого ключа на основе закрытого ключа Bitcoin использует алгоритм цифровой подписи ECDSA или алгоритм эллиптической кривой. Более конкретно, он использует специальную кривую, называемую SECP256K1 отрицание
В настоящее время эта кривая имеет класс 256 бит, принимает 256 бит в качестве входа и экспортирует 256-битные числа. 256 бит — это ровно 32 байта. Поэтому в противном случае для обеспечения этого алгоритма кривой требуется 32 байта данных.
Существуют дополнительные требования к секретным ключам. Для использования ECDSA ключ должен быть положительным и меньшим, чем класс кривой. Класс ECP256K1 — ffffffffffffffffffffffeeedce6af48a03bbfdd25e8cd0364141.
Деревенский способ
Как же создать целое число 32 байта? Первое, что приходит на ум, это использовать библиотеку RNG в выбранном вами языке. Python предоставляет хороший способ для создания некоторых битов.
Это выглядит хорошо, но на практике это не так. Как вы знаете, обычные библиотеки RNG не предназначены для шифрования, поскольку они не очень безопасны. Они создают числа на основе семян, а семя по умолчанию — это точное время. Поэтому, если вы почти знаете, когда я создал вышеупомянутое произведение, все, что вам нужно сделать, это применить почти несколько вариантов.
Когда вы создаете закрытый ключ, вы хотите, чтобы он был очень безопасным. Помните, что если вы узнаете ваш закрытый ключ, вы можете легко украсть все монеты из соответствующего кошелька и не иметь шансов получить их обратно.
Теперь давайте сделаем его более безопасным.
Криптографически сильные РНГ.
В дополнение к стандартным методам ГПСЧ языки программирования обычно предоставляют ГПСЧ, специально разработанные для криптографических операций. Этот метод обычно гораздо более безопасен, поскольку энтропия берется непосредственно из операционной системы. Результаты таких ГПСЧ гораздо сложнее воспроизвести. Поскольку нет семени, невозможно узнать, когда оно было создано, или иметь семя. По крайней мере, пользователь не вводит семя. Скорее, семя генерируется программой.
В Python криптографически сильный ГПСЧ реализован в модуле Secrets. Измените приведенный выше код, чтобы обезопасить генерацию секретных ключей!
Это замечательно, поскольку позволяет генерировать секретный ключ для вашего компьютера. Вы не должны быть в состоянии воспроизвести это, если у вас есть доступ к компьютеру. Но можете ли вы копнуть глубже?
Специализированные веб-сайты
Существуют сайты, которые генерируют случайные числа. Здесь мы рассмотрим только два. Один из них — Random.org, известный генератор случайных чисел. Другой — Bitaddress.org, который специально создан для генерации ключей Биткойна.
Может ли Random.org помочь в генерации ключей? Безусловно, поскольку существуют сервисы, генерирующие случайные байты. Однако здесь есть две проблемы. Random.org утверждает, что является настоящим генератором случайных чисел, но можно ли ему доверять? Как вы можете быть уверены, что это действительно случайность? Можете ли вы быть уверены, что владелец не регистрирует все сгенерированные результаты, особенно те, которые выглядят как секретные ключи? Ответ зависит от вас. О, и вы не можете запустить его локально. Это дополнительная проблема. Этот метод не является на 100% стабильным.
В настоящее время Bitaddress.org — это совершенно другая история. Он имеет открытый исходный код, поэтому вы можете увидеть, что находится под капотом. Будучи клиентским, он может быть загружен и запущен локально, даже без подключения к Интернету.
Как это работает? Она использует вас — да, вас — в качестве источника энтропии. Вам предлагается переместить мышь или нажать произвольную клавишу. Делайте это до тех пор, пока не станет невозможно воспроизвести результат.
Вам интересно, как работает Bitaddress.org? В учебных целях мы посмотрим на ваш код и попытаемся воспроизвести его в Python.
Адресные биты: подробности
Bitaddress генерирует энтропию в двух формах: движения мыши и нажатия клавиш. Мы обсудим оба варианта, но поскольку отслеживание мыши сложно реализовать в Python Lib, мы сосредоточимся на нажатиях клавиш. Пока энтропия достаточна, он ждет, пока конечный пользователь введет кнопку, прежде чем генерировать ключ.


Битадрес делает три вещи Он инициализирует массив байтов, который пытается получить как можно больше энтропии от компьютера, заполняет массив данными пользователя, а затем генерирует секретный ключ.
Bitaddress использует 256-байтовый массив для хранения энтропии. Этот массив переписывается в цикле, поэтому при первом заполнении массива указатель обнуляется, и процесс заполнения начинается заново.
Программа инициализирует массив 256 байтами из window.crypto Failure. Затем он записывает временную метку и получает дополнительные 4 байта энтропии. Наконец, он извлекает такие данные, как размер экрана, часовой пояс, информация о плагинах браузера и язык. Это дает дополнительные 6 байт.
После инициализации программа постоянно ожидает ввода пользователя для замены первого байта. Когда пользователь перемещает курсор, программа записывает положение курсора. Если пользователь нажимает кнопку, программа записывает CHAR-код нажатой кнопки.
Наконец, Bitaddress использует сохраненную энтропию для генерации секретного ключа. При этом генерируется 32 байта. Bitaddress использует для этой задачи алгоритм RNG под названием ARC4. Программа инициализирует ARC4 текущим временем и собранной энтропией и получает 32 байта один за другим.
Все это упрощенная версия того, как работает программа, но мы надеемся, что вы сможете ее понять. Вы можете узнать больше об алгоритме на Github Disclaimer
Сделайте это сами.
Для этого создайте простую версию BitAddress. Во-первых, он не собирает данные о машине и местоположении пользователя. Во-вторых, вводите энтропию только текстом, так как очень сложно всегда получать положение мыши с помощью скрипта Python (проверьте Pyautogui, если вы хотите сделать это).
Это определяет стандартную спецификацию библиотеки генераторов. Сначала инициализируйте массив байтов зашифрованным RNG, затем введите метку времени и, наконец, строку, созданную пользователем. Как только пул семян в библиотеке заполнен, разработчики могут генерировать ключи. Фактически, они могут генерировать столько закрытых ключей, сколько им нужно, фиксируясь собранной энтропией.
Инициализация резервуара.
В этом разделе задаются байты и время от RNG шифрования. __seed_int и __seed_byte — это два помощника, которые вставляют энтропию в таблицу пула. Обратите внимание, что Секретный отказ используется для
Приточный посев.
Здесь сначала вводится метка времени, а затем строка ввода, по одному символу за раз.
Генерация секретного ключа.
Эта часть выглядит сложной, но на самом деле она очень проста.
Сначала необходимо создать 32-байтовое число с помощью пула. К сожалению, вы не можете создать свой собственный случайный объект и просто использовать его для генерации ключа. Вместо этого существует общий объект, который используется всем кодом, выполняющимся в одном и том же сценарии.
Что это значит для нас? Это означает, что в любой момент, в любом месте кода, мы можем уничтожить всю энтропию, собранную простым Random.seed (0). Мы не хотим, чтобы это произошло. К счастью, Python предоставляет методы Guthrite и SetState. Поэтому каждый раз, когда мы создаем ключ, мы запоминаем прерванное состояние, чтобы сохранить энтропию, и устанавливаем его при следующем создании ключа.
Затем убедитесь, что ключ находится в диапазоне (1, Curve_order ). Это требование для всех закрытых ключей ECDSA. Curve_Order — порядок кривой TECP256K1, FFFFFFFFFFFFFFFFFFFFFFFFEBAEEDCE6AF48A03BBFD25E8CD0364141
Наконец, для удобства преобразуйте в Hex и разделите часть ‘0x’.
Деятельность.
библиотека. На самом деле это довольно просто: с помощью трех строк кода вы можете сгенерировать закрытый ключ.
Вы можете убедиться сами: ключ является случайным. Ключи случайны и абсолютно действительны. Более того, каждый раз, когда вы запускаете этот код, вы получаете разный результат.
Заключение.
Как вы видите, существуют различные способы генерации закрытого ключа. Они различаются по простоте и безопасности.
Генерация закрытого ключа — это только первый шаг. Следующий шаг — извлечение открытого ключа и адреса кошелька, который может быть использован для получения платежей. Процесс создания кошелька отличается в Bitcoin и Ethereum, и мы напишем еще две статьи на эту тему.
Если вы хотите поиграть с кодом, я разместил его в этом репозитории Github Disclaimer
Мы проводим курсы по криптовалютам здесь, в FreeCodeCamp News. Затем первая часть — подробное объяснение блокчейна.
Я также буду публиковать случайные мысли на Crypto On Twitter, так что заглядывайте туда.

