Перейти к содержанию

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


Agnostik000

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

Добрый день.

Пытаюсь создать приватный ключ для 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 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Similar Topics

×
×
  • Создать...