Bitcoin Forum

Local => Кодеры => Topic started by: rez1vr on August 03, 2017, 11:21:03 AM



Title: Вопрос. Изменение приватного ключа.
Post by: rez1vr on August 03, 2017, 11:21:03 AM
Ситуация такая. Был сохранен приватный ключ к кошельку биткоинт. Для большей надежности изменил несколько символов в ключе. И благополучно забыл про этот кошелек. Сейчас нашел этот прив. ключ но проблема в том, что уже не помню какие символы и на что изменял. Все о кошельке можно забыть? Или есть какой либо способ подобрать? Ключ стандартный 52 символ формат WIF Compressed как понимаю.


Title: Re: Вопрос. Изменение приватного ключа.
Post by: kzv on August 03, 2017, 12:00:29 PM
Ну если только пару-тройку символов поперебирать - думаю есть шансы. Много биткоинTов-то хоть было?


Title: Re: Вопрос. Изменение приватного ключа.
Post by: rez1vr on August 03, 2017, 12:20:21 PM
Ну если только пару-тройку символов поперебирать - думаю есть шансы. Много биткоинTов-то хоть было?
Нет не много. Но за подсказку в решении проблемы готов отблагодарить.  Вопрос в том возможно ли восстановить доступ зная 90% при ключа.


Title: Re: Вопрос. Изменение приватного ключа.
Post by: BurningInside on August 03, 2017, 12:37:20 PM
Ну если только пару-тройку символов поперебирать - думаю есть шансы. Много биткоинTов-то хоть было?

Это если знать, какую именно пару-тройку символов перебирать.


Title: Re: Вопрос. Изменение приватного ключа.
Post by: kzv on August 03, 2017, 01:15:49 PM
Ну если только пару-тройку символов поперебирать - думаю есть шансы. Много биткоинTов-то хоть было?

Это если знать, какую именно пару-тройку символов перебирать.

Перебрать один символ 58*52 = 3016 вариантов
Перебрать два символа 58*58*51 = 171 564 вариантов
Перебрать три символа 58*58*58*50 = 9 755 600 вариантов

Средненький комп переберет секунды за три я думаю.


Title: Re: Вопрос. Изменение приватного ключа.
Post by: algo1024 on August 03, 2017, 02:24:38 PM
Ну если только пару-тройку символов поперебирать - думаю есть шансы. Много биткоинTов-то хоть было?

Это если знать, какую именно пару-тройку символов перебирать.

Перебрать один символ 58*52 = 3016 вариантов
Перебрать два символа 58*58*51 = 171 564 вариантов
Перебрать три символа 58*58*58*50 = 9 755 600 вариантов

Средненький комп переберет секунды за три я думаю.

Ну если найти способ проверки валидости или быстрого импортирования приватного ключа с ресканом - тогда да. Или все 9 755 600 сразу импортировать, правда не знаю, сколько такой рескан будет идти.


Title: Re: Вопрос. Изменение приватного ключа.
Post by: A-Bolt on August 03, 2017, 05:01:02 PM
Ну если найти способ проверки валидости

Ключи и адреса принято записывать в формате Base58Check (https://en.bitcoin.it/wiki/Base58Check_encoding).
Это формат с контрольной суммой - он сам себя контролирует на предмет целостности. Для валидации необходимо нарыть подходящую либу или самому реализовать алгоритм проверки. 


Title: Re: Вопрос. Изменение приватного ключа.
Post by: Vadi2323 on August 03, 2017, 05:54:53 PM
Ну если найти способ проверки валидости

Ключи и адреса принято записывать в формате Base58Check (https://en.bitcoin.it/wiki/Base58Check_encoding).
Это формат с контрольной суммой - он сам себя контролирует на предмет целостности. Для валидации необходимо нарыть подходящую либу или самому реализовать алгоритм проверки. 

Ну вот как раз всё, что на этом приватном ключе есть, а именно:

не много. Но за подсказку в решении проблемы готов отблагодарить

и пойдёт на благодарность программисту. Хотя есть энтузиасты, которые любят бесплатно работать, но их мало (быстро умнеют). А вообще странный вопрос. Я бы не советовал таким способом защищать ключи.


Title: Re: Вопрос. Изменение приватного ключа.
Post by: aleksey on August 03, 2017, 07:10:36 PM
за 0.03 BTC готов написать скрипт для подбора, там к томуже бткоин кеш с этого адреса можно получить


Title: Re: Вопрос. Изменение приватного ключа.
Post by: aleksey on August 04, 2017, 05:27:55 PM
Скрипт для подбора написал, может кому еще пригодится

Code:
import base58

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("key", help="base58 key, for example LtVAmzT7NwqNHxVDpVkhE94oYwQ4ZmEc6s2HkbmCfj59tpzfgBpu")
parser.add_argument("count", help="count symbols for change 2", type=int)
args = parser.parse_args()

print("Params:")
print(args.key)
print(args.count)

bad_key = args.key
bad_symbols_count = args.count

key_len = 52

if len(bad_key) != key_len:
    print("Key length is wrong!!")
    exit()

for i in range(key_len):
    if bad_key[i] not in base58.alphabet:
        print("Warrning! Symbol", bad_key[i], 'pos', i, 'not base58' )
   
def check(key, start, level):
    for i in range(start, key_len):
        if level != 0:
            print('  ' * (5 - level), i, '/', key_len, '--', level + 1)
        for l in base58.alphabet:
            test = key[:i] + l + key[i+1:]
            if level == 0:
                try:
                    base58.b58decode_check(test)
                except ValueError:
                    continue
                print('Found: ' + test)
                return True
            elif check(test, i + 1, level - 1):
                return True

if not check(bad_key, 1, bad_symbols_count - 1):
    print('NOT found')


Title: Re: Вопрос. Изменение приватного ключа.
Post by: kzv on August 04, 2017, 07:18:13 PM
Скрипт для подбора написал, может кому еще пригодится

Code:
import base58

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("key", help="base58 key, for example LtVAmzT7NwqNHxVDpVkhE94oYwQ4ZmEc6s2HkbmCfj59tpzfgBpu")
parser.add_argument("count", help="count symbols for change 2", type=int)
args = parser.parse_args()

print("Params:")
print(args.key)
print(args.count)

bad_key = args.key
bad_symbols_count = args.count

key_len = 52

if len(bad_key) != key_len:
    print("Key length is wrong!!")
    exit()

for i in range(key_len):
    if bad_key[i] not in base58.alphabet:
        print("Warrning! Symbol", bad_key[i], 'pos', i, 'not base58' )
   
def check(key, start, level):
    for i in range(start, key_len):
        if level != 0:
            print('  ' * (5 - level), i, '/', key_len, '--', level + 1)
        for l in base58.alphabet:
            test = key[:i] + l + key[i+1:]
            if level == 0:
                try:
                    base58.b58decode_check(test)
                except ValueError:
                    continue
                print('Found: ' + test)
                return True
            elif check(test, i + 1, level - 1):
                return True

if not check(bad_key, 1, bad_symbols_count - 1):
    print('NOT found')

Хороший скрипт. Рабочий.
Нужно добавить, что для работы надо сделать
sudo pip install base58

 :)

Ну и полный перебор трех символов по моим оценкам займет примерно 100 часов. Перебор четырех символов - практически нереально... Хотя если написать многопоточный аналог на с++, то можно замутить пул и компов 10 найдут ключ в приемлемое время ))