Jump to content
Agnostik000

Не могу создать private key самостоятельно

Recommended Posts

Добрый день.

Пытаюсь создать приватный ключ для bitcoin из хэша числа и не получается. Пользуюсь алгоритмом описанным в https://en.bitcoin.it/wiki/Wallet_import_format

Однако при хэшировании hex числа описанного в примере у меня получается другой результат.

В чем может быть причина?

Share this post


Link to post
Share on other sites
def priv2WIF(h, compressed = False, testnet = False):
    #uncompressed: 0x80 + [32-byte secret] + [4 bytes of Hash() of previous 33 bytes], base58 encoded
    #compressed: 0x80 + [32-byte secret] + 0x01 + [4 bytes of Hash() previous 34 bytes], base58 encoded
    prefix = b'\x80'
    if testnet:
        prefix = b'\xef'
    h = prefix + h
    if compressed: h += b'\x01'
    h += hashlib.sha256(hashlib.sha256(h).digest()).digest()[:4]
    return encode_base58(h)

https://github.com/bitaps-com/pybtc/blob/master/pybtc/tools.py#L140

Хеш надо брать не от HEX а от байтовой строки

Share this post


Link to post
Share on other sites
22 минуты назад, 4_tochka сказал:
def priv2WIF(h, compressed = False, testnet = False):
    #uncompressed: 0x80 + [32-byte secret] + [4 bytes of Hash() of previous 33 bytes], base58 encoded
    #compressed: 0x80 + [32-byte secret] + 0x01 + [4 bytes of Hash() previous 34 bytes], base58 encoded
    prefix = b'\x80'
    if testnet:
        prefix = b'\xef'
    h = prefix + h
    if compressed: h += b'\x01'
    h += hashlib.sha256(hashlib.sha256(h).digest()).digest()[:4]
    return encode_base58(h)

https://github.com/bitaps-com/pybtc/blob/master/pybtc/tools.py#L140

Хеш надо брать не от HEX а от байтовой строки

 

Я правильно понял, что прежде чем начать первое хэширование, необходимо hex перевести в байтовую строку и так каждый раз? Дело в том, что данная операция почему то ни где не описана

Share this post


Link to post
Share on other sites

Все операции производятся над байтовыми строками. HEX это всего лишь способ как отобразить промежуточный результат в читабельном виде. Если у вас приватный ключ в HEX то его следует привести к байтовой строке перед дальнейшими операциями.

Share this post


Link to post
Share on other sites
59 минут назад, 4_tochka сказал:

Все операции производятся над байтовыми строками. HEX это всего лишь способ как отобразить промежуточный результат в читабельном виде. Если у вас приватный ключ в HEX то его следует привести к байтовой строке перед дальнейшими операциями.

Я, возможно, задам дурацкий вопрос, но для каких целей это реализовано таким образом? т.е. работа происходит со строками байтов, на не с готовым числом? Ведь проверка контрольной суммы происходит с использованием hex чисел

Share this post


Link to post
Share on other sites
4 часа назад, 4_tochka сказал:

Все операции производятся над байтовыми строками. HEX это всего лишь способ как отобразить промежуточный результат в читабельном виде. Если у вас приватный ключ в HEX то его следует привести к байтовой строке перед дальнейшими операциями.

Хочу дополнить вопрос:

в какой кодировке создавать байтовую строку? Base58Check?

Edited by Agnostik000
дополнение

Share this post


Link to post
Share on other sites
4 часа назад, Agnostik000 сказал:

в какой кодировке создавать байтовую строку?

 

Вас, возможно, вводит в заблуждение слово "строка".

На вход криптографических функций подаются массивы типа байт.

В Base58Check кодируется приватный ключ на самой последней стадии.

 

Edited by Old Miner

Share this post


Link to post
Share on other sites
1 час назад, Old Miner сказал:

 

Вас, возможно, вводит в заблуждение слово "строка".

На вход криптографических функций подаются массивы типа байт.

В Base58Check кодируется адрес на самой последней стадии.

 

Может быть вы сможете объяснить, каким образом из строки 800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D (первые два символа - префикс 0х80) на входе хеш функции sha 256 получить строку 8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592 на выходе? к какому виду и как нужно привести входящую строку?

Все говорят теорию, но ни кто не может показать как это делается практически.

 

 

 
Edited by Agnostik000

Share this post


Link to post
Share on other sites

Вы функцию sha256 при помощи чего выполняете?  Вручную на бумажке? Или на компе?

Чем конкретно вы пользуетесь?

 

Вот тут есть раздел Private key to wallet import format. Если вы там в 1 - Private key вставите 

0C28FCA386C7A227600B2FE50B7CAE_SAMPLE_PRIVATE_KEY_DO_NOT_IMPORT_11EC86D3BF1FBE471BE89827E19D72AA1D

то получите приватный ключ в формате WIF:

5HueCGU8rMjxEXxiPuD5BDk_SAMPLE_PRIVATE_KEY_DO_NOT_IMPORT_u4MkFqeZyd4dZ1jvhTVqvbTLvyTJ
Edited by Old Miner

Share this post


Link to post
Share on other sites
5 минут назад, Old Miner сказал:

Вы функцию sha256 при помощи чего выполняете?  Вручную на бумажке? Или на компе?

Чем конкретно вы пользуетесь?

 

Вот тут есть раздел Private key to wallet import format. Если вы там в 1 - Private key вставите 

0C28FCA386C7A227600B2FE50B7CAE_SAMPLE_PRIVATE_KEY_DO_NOT_IMPORT_11EC86D3BF1FBE471BE89827E19D72AA1D

то получите адрес

5HueCGU8rMjxEXxiPuD5BDk_SAMPLE_PRIVATE_KEY_DO_NOT_IMPORT_u4MkFqeZyd4dZ1jvhTVqvbTLvyTJ

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

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

Edited by Agnostik000

Share this post


Link to post
Share on other sites
1 минуту назад, Agnostik000 сказал:

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

 

Вот вам сайт.

Там тоже будет не совпадать с примером?

Share this post


Link to post
Share on other sites
1 час назад, Agnostik000 сказал:

Может быть вы сможете объяснить, каким образом из строки 800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D (первые два символа - префикс 0х80) на входе хеш функции sha 256 получить строку 8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592 на выходе? к какому виду и как нужно привести входящую строку?

Все говорят теорию, но ни кто не может показать как это делается практически.

Вот пример на ноде. https://repl.it/repls/AbleSoftBits

Обработка приватного ключа

Share this post


Link to post
Share on other sites
1 час назад, Agnostik000 сказал:

как нужно привести входящую строку?

Все говорят теорию, но ни кто не может показать как это делается практически.

http://gobittest.appspot.com/PrivateKey

Share this post


Link to post
Share on other sites

@Agnostik000 , а ты какую цель преследуешь? Зачем тебе это? Проверить алго хеширования или что-то другое?

Если ты хочешь создать пары "адрес - приватный ключ" самостоятельно, думая, что это самый безопасный вариант и 100% защита от хакеров, я бы усомнился.

Share this post


Link to post
Share on other sites
В 03.03.2018 в 00:04, Old Miner сказал:

 

Вот вам сайт.

Там тоже будет не совпадать с примером?

На указанном вами сайте результат совпадает с эталоном.

Выходит, что большинство онлайн сервисов неверно рассчитывают хеш функцию? Либо проблема в чем то еще.

 

P.S. Судя по всему "Ваш" калькулятор предварительно преобразует строку hex каким то образом и получается нужный результат.

А вот каким образом и во что он преобразует строку по прежнему осталось под вопросом...

P.S.2 Преобразуется в некую кодировку, безразличную к регистру буквенных символов.

Если сможете подсказать ответ и на этот вопрос, то буду вдвойне благодарен )

Но все равно спасибо вам за помощь!

Edited by Agnostik000

Share this post


Link to post
Share on other sites
В 04.03.2018 в 20:12, Agnostik000 сказал:

А вот каким образом и во что он преобразует строку по прежнему осталось под вопросом...

 

Приватный ключ из примера начинается на 0С.

Если считать, что 0С - это 1 байт в шестнадцатеричной кодировке, то получаем из него 1 байт, в котором хранится значение 0С (или 12 в десятичном представлении).

Если считать, что 0С - это массив однобайтовых чисел, то получаем 2 байта со значениями 30 и 43 (или 48 и 67 в десятичном представлении).

 

Вы пользовались сайтами, где входные данные интерпретируются по второму варианту, что неверно.

Если непонятно, как из 0 получилось 30, смотрите таблицу символов ASCII.

 

Edited by Old Miner

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...