Как общедоступны & личные ключи в созданном адресе?

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

28 голосов | спросил DeathAndTaxes 7 +04002011-10-07T01:28:41+04:00312011bEurope/MoscowFri, 07 Oct 2011 01:28:41 +0400 2011, 01:28:41

5 ответов


10

Открытые и закрытые ключи в адресе Bitcoin являются обычной парой ключей ECDSA . Я не пробивал этот конкретный бит собственного кода Биткойна, но в продуктах выработки, с которыми я имел возможность работать, обычно используют Bouncy Castle криптографическая библиотека. Bouncy Castle также имеет отличное введение /учебник о том, как использовать свою библиотеку. Их примеры написаны на Java, но они довольно просты и должны быть легко перенесены на другие языки.

Существует также отличная предварительно написанная библиотека для генерации ключа JavaScript, доступная от Tom Wu под лицензией BSD.

ответил David Perry 7 +04002011-10-07T03:20:13+04:00312011bEurope/MoscowFri, 07 Oct 2011 03:20:13 +0400 2011, 03:20:13
26

Как правило, при использовании шифрования с использованием эллиптической кривой частный ключ является просто случайным числом. В случае secp256k1, эллиптическая кривая, используемая биткойном, она должна быть числом от 1 до 1157920892373161954235703756427907490438260516279074904382605163141518161494336 (или в шестнадцатеричном формате, между 0x1 и 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364140

Этот закрытый ключ преобразуется в открытый ключ, выполняя умножение EC-точки с базовой точкой кривой. Результатом является координатная пара (x,y), которая представляет собой открытый ключ.

Наконец, RIPEMD160(SHA256(pubkey)), где pubkey - это сериализация этих координат, вычисляется и кодируется в базе58 вместе с контрольной суммой. Это станет адресом.

ответил Pieter Wuille 24 +04002011-10-24T15:41:51+04:00312011bEurope/MoscowMon, 24 Oct 2011 15:41:51 +0400 2011, 15:41:51
9

Частные ключи биткойны чаще всего отображаются в формате импорта бумажника (WIF), также известном как base58check (число, выраженное в базе 58 с контрольной суммой в конце и байт версии в начале).

Чтобы создать закрытый ключ WIF, вам необходимо:

  1. Создайте секретный показатель ECDSA (закрытый ключ) с использованием кривой SECP256k1.
  2. Преобразовать секретный указатель /закрытый ключ в формат base58check.

Вот два простых способа генерации секретного показателя:

  1. Выберите случайное число в диапазоне [1, curve_order].
  2. Создайте случайную 64-символьную шестнадцатеричную строку (шестнадцатеричное строковое представление 256-битного номера) и проверьте, чтобы номер находился в диапазоне [1, curve_order]. При необходимости повторите.

Для SECP256k1 порядок кривой равен 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140 (или 115792089237316195423570985008687907852837564279074904382605163141518161494336L).

Это число очень близко к самому большому 256-битовому числу (0xFFF ... FFF в шестнадцатеричном формате), поэтому вы можете ожидать, что никогда не превысите порядок кривой, если вы создадите случайное 256-битное число.

Как упоминал Питер Уйль, открытые ключи производятся путем выполнения умножения точек с базовой точкой кривой и секретным показателем /закрытым ключом. Результирующая (x, y) координата является открытым ключом.

Адрес биткойна, как и закрытый ключ, также отображается в формате base58check. Чтобы получить адрес, мы делаем следующее:

  1. Вычислить hash160: ripemd160 (sha256 (public_key)).
  2. Преобразовать формат hash160 в base58check.

Чтобы преобразовать число в base58check, просто выполните следующие шаги:

  1. преобразование значения в массив байтов и добавление байта версии в начало
  2. вычислить первые 4 байта SHA256 (SHA256 (результат шага 1)) и называть его контрольной суммой
  3. добавить контрольную сумму в конец результата шага 1
  4. переместите результат шага 3 в пространство ключей «123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz»
  5. проверьте, сколько начальных нулей имеет исходное двоичное значение и добавьте их в начало результата шага 4

Вот более подробные инструкции .

Теперь, если вы не хотите беспокоиться об этом, я бы посмотрел библиотеку python Coinkit ( https: //github .com /halfmoonlabs /coinkit или «pip install coinkit»).

Вы можете выполнять простые операции, подобные этим:

>>> from coinkit.keypair import BitcoinKeypair
>>> hex_private_key = '91149ee24f1ee9a6f42c3dd64c2287781c8c57a6e8e929c80976e586d5322a3d'
>>> k = BitcoinKeypair(hex_private_key)
>>> k.private_key()
'91149ee24f1ee9a6f42c3dd64c2287781c8c57a6e8e929c80976e586d5322a3d'
>>> k.public_key()
'042c6b7e6da7633c8f226891cc7fa8e5ec84f8eacc792a46786efc869a408d29539a5e6f8de3f71c0014e8ea71691c7b41f45c083a074fef7ab5c321753ba2b3fe'
>>> k.wif_pk()
'5JvBUBPzU42Y7BHD7thTnySXQXMk8XEJGGQGcyBw7CCkw8RAH7m'
>>> k.address()
'13mtgVARiB1HiRyCHnKTi6rEwyje5TYKBW'

Вы также можете создавать случайные клавиши:

>>> k = BitcoinKeypair()

И клавиатуры головного кошелька:

>>> passphrase = 'shepherd mais pack rate enamel horace diva filesize maximum really roar mall'
>>> k = BitcoinKeypair().from_passphrase(passphrase)
>>> k.passphrase()
'shepherd mais pack rate enamel horace diva filesize maximum really roar mall'

Раскрытие информации: Я являюсь одним из создателей Coinkit.

ответил Ryan 4 Jam1000000amSat, 04 Jan 2014 00:59:18 +040014 2014, 00:59:18
4

Код Javascript из http://www.bitaddress.org может дать вам хороший пример этого также.

ответил Stephen Gornick 7 +04002011-10-07T03:18:15+04:00312011bEurope/MoscowFri, 07 Oct 2011 03:18:15 +0400 2011, 03:18:15
1

Как они созданы полностью документированы на wiki : https://en.bitcoin.it/wiki/Technical_background_of_Bitcoin_addresses

В Java

  1. Включить банку библиотеки bitcoinj Java в свой путь к классам
  2. Код:

    import com.google.bitcoin.core.*;
    
    NetworkParameters params = new MainNetParams();
    
    String publicAddress = new DumpedPrivateKey(params,
            "KzzuoFPzrPhD55icpAi7idW7z7tH8xSYo3xqTcZm3fHk3AzVxpoP").getKey()
            .toAddress(params).toString();
    
  3. Результат: 17vFi4XjRibQPCktoMcGhZ3DmnG85r1VHE.

В JavaScript

Использование bitaddress.org javascript library:

var key = new Bitcoin.ECKey('KzzuoFPzrPhD55icpAi7idW7z7tH8xSYo3xqTcZm3fHk3AzVxpoP');
console.log(key.getBitcoinAddress());

В результате получается 17vFi4XjRibQPCktoMcGhZ3DmnG85r1VHE.


Примечание 1: До этого я получил bitcoin-cli getnewaddress и bitcoin-cli dumpprivkey <pubkey>, чтобы получить пару ключей.

Примечание 2: Чтобы сделать вещи еще более легкими, в вашем каталоге https: //github.com/pointbiz/bitaddress.org/tree/master/src :

cat array.map.js cryptojs.js cryptojs.sha256.js cryptojs.pbkdf2.js cryptojs.hmac.js cryptojs.aes.js cryptojs.blockmodes.js cryptojs.ripemd160.js securerandom.js ellipticcurve.js secrets.js biginteger.js qrcode.js bitcoinjs-lib.js bitcoinjs-lib.base58.js bitcoinjs-lib.address.js bitcoinjs-lib.ecdsa.js bitcoinjs-lib.eckey.js bitcoinjs-lib.util.js crypto-scrypt.js > all.js

и вы получите файл размером 174kb, который вам нужен.

Примечание 3: Если вы хотите получить этот файл (от commit f6c6bbe53df28c1bf51a6216f02ad1467b36c9f7), посмотрите здесь: http: //pastebin.com/raw.php?i=rH8V2j9H


Полный функциональный пример

<!DOCTYPE HTML>
<html>

<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="http://pastebin.com/raw.php?i=rH8V2j9H"></script>
</head>

<body>
    <form onsubmit="alert(new Bitcoin.ECKey(document.getElementById('pkey').value).getBitcoinAddress());">
        <label>
            Private key:
            <input id="pkey" type="text">
        </label>
    </form>
</body>
</html>
ответил Felipe 31 J000000Thursday14 2014, 23:54:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132