Перейти к публикации
Agnostik000

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

Рекомендованные сообщения

Добрый день.

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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 а от байтовой строки

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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 перевести в байтовую строку и так каждый раз? Дело в том, что данная операция почему то ни где не описана

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
59 минут назад, 4_tochka сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, 4_tochka сказал:

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

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

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

Изменено пользователем Agnostik000
дополнение

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, Agnostik000 сказал:

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

 

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

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

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

 

Изменено пользователем Old Miner

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Old Miner сказал:

 

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

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

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

 

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

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

 

 

 
Изменено пользователем Agnostik000

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вы функцию 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
Изменено пользователем Old Miner

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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, но я не могу получить его выполняя каждую операцию самостоятельно. В результате первого же хеширования у меня получается иной результат.

Изменено пользователем Agnostik000

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, Agnostik000 сказал:

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

 

Вот вам сайт.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Agnostik000 сказал:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Agnostik000 сказал:

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

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

http://gobittest.appspot.com/PrivateKey

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 03.03.2018 в 00:04, Old Miner сказал:

 

Вот вам сайт.

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

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

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

 

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

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

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

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

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

Изменено пользователем Agnostik000

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 04.03.2018 в 20:12, Agnostik000 сказал:

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

 

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

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

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

 

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

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

 

Изменено пользователем Old Miner

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

    YoBit.Net
×