Pages:
Author

Topic: Casascius python как добавить сюда ещё и генерацию адрес& (Read 680 times)

newbie
Activity: 9
Merit: 0
И как получилось, какой результат?
newbie
Activity: 1
Merit: 0
Есть код у Casascius на python что генерирует мини-ключи
вот с wiki https://en.bitcoin.it/wiki/Mini_private_key_format
Code:
import random
import hashlib

BASE58 = '23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'

def Candidate():
    """
    Generate a random, well-formed mini private key.
    """
    return('%s%s' % ('S', ''.join(
        [BASE58[ random.randrange(0,len(BASE58)) ] for i in range(29)])))

def GenerateKeys(numKeys = 10):
    """
    Generate mini private keys and output the mini key as well as the full
    private key. numKeys is The number of keys to generate, and
    """
    keysGenerated = 0
    totalCandidates = 0
    while keysGenerated < numKeys:
        try:
            cand = Candidate()
            # Do typo check
            t = '%s?' % cand
            # Take one round of SHA256
            candHash = hashlib.sha256(t).digest()
            # Check if the first eight bits of the hash are 0
            if candHash[0] == '\x00':
                privateKey = GetPrivateKey(cand)
                print('\n%s\nSHA256( ): %s\nsha256(?): %s' %
                      (cand, privateKey, candHash.encode('hex_codec')))
                if CheckShortKey(cand):
                    print('Validated.')
                else:
                    print('Invalid!')
                keysGenerated += 1
            totalCandidates += 1
        except KeyboardInterrupt:
            break
    print('\n%s: %i\n%s: %i\n%s: %.1f' %
          ('Keys Generated', keysGenerated,
           'Total Candidates', totalCandidates,
           'Reject Percentage',
           100*(1.0-keysGenerated/float(totalCandidates))))

def GetPrivateKey(shortKey):
    """
    Returns the hexadecimal representation of the private key corresponding
    to the given short key.
    """
    if CheckShortKey(shortKey):
        return hashlib.sha256(shortKey).hexdigest()
    else:
        print('Typo detected in private key!')
        return None

def CheckShortKey(shortKey):
    """
    Checks for typos in the short key.
    """
    if len(shortKey) != 30:
        return False
    t = '%s?' % shortKey
    tHash = hashlib.sha256(t).digest()
    # Check to see that first byte is \x00
    if tHash[0] == '\x00':
        return True
    return False

Если его запустить мы получаем:
Quote
SKhHHQLDkHsAniFW2MRyVw9jwDDkKx
SHA256( ): ae172028e80ef37d3e01906ccd05441946c3efa9e4532ab20f5a6e25ce293840
sha256(?): 0057497a02482464d757500773d3d2c26badbcd94d5081d1cff9ea7c16fd2175
Validated.

Скажите как получить ещё и адресс при генерации

SKhHHQLDkHsAniFW2MRyVw9jwDDkKx
SHA256( ): ae172028e80ef37d3e01906ccd05441946c3efa9e4532ab20f5a6e25ce293840
sha256(?): 0057497a02482464d757500773d3d2c26badbcd94d5081d1cff9ea7c16fd2175
Address: 17bYqJpPz3huoXuz6Dx6iLejuAHA2k2q3H
Validated.

HuhHuhHuhHuhHuhHuhHuhHuhHuhHuhHuh ПОМОГИТЕ ПОЖАЛУЙСТА МУЖИКИ допилить скрипт что бы и адрес выдавал того приват ключа что оно сгенерировало


Доброго дня!
Я делаю тоже самое, только в Java+многопоточность!
Скорость приличная, зависит от количества ядер процессора...
Планирую покурить библиотеку JCuda, для использования вычислений видеокарты
member
Activity: 202
Merit: 27
Atom foundation
очевидно что вам надо threading
я бы в памяти держал 1млн ключей или распихал бы в 100 файлов по 10т ключей, и создал вы потоки, который каждый отдельно работал со свободным файлом.
member
Activity: 172
Merit: 11
Тогда можете помочь допустим я возьму тот скрипт что сгенерирует мне 1 миллион миникеев хороших за 4 минуты

положу в блокнот

как мне их шустро проверить на адрес что бы получить миникей = адрес
допустим натыкался я на brainwallet скрипты  (они конечно не брались с блокнота это я уже подключал сторонние программы + батник)  туда по сути могу пихать свои миникеи и получать желанное
Но опять же упираюсь во время 120 тыс проверяю за 1-2 часа




Тут очень много нужно переписывать вообще. Скрипты из интернета иногда пишут любители.

Начнем с того, что вы в консоль их выводите - это самое большое время занимает. Все операции IO это просто уйма тактов процессора.
После того как вы находите minikey нужный (в случае с генерацией адреса) происходят еще операции:
- вы повторно берете sha256 от найденного значения (в функции GetPrivateKey), таким образом находите приватный ключ.
- для нахождения публичного ключа вы используете небыструю библиотеку python'a ecdsa
- после нахождения пубкея вы опять делаете 2 хеширования sha256 и одно hash160.
- после этого результат преобразуется в формат base58check.

Все эти операции выполняются на питоне довольно долго (при вызове неоптимизированным кодом).

Так что либо прокачивать скилы питониста, либо использовать другие инструменты.
sr. member
Activity: 770
Merit: 305
Если будет время можете попробовать перетащить с одного скрипта в другой пожалуйста
Я могу приблизительно понимать что написано в программе на питоне.
Но я не программирую на питоне. И стараюсь бесплатно давать советы. А не делать чью-то работу.

newbie
Activity: 54
Merit: 0
Ну если тормозит генерация адреса - можно попробовать функции генерации
адреса перетащить из одного скрипта в другой. Там, похоже, разные
библиотеки используются.


Если будет время можете попробовать перетащить с одного скрипта в другой пожалуйста
sr. member
Activity: 770
Merit: 305
Ну если тормозит генерация адреса - можно попробовать функции генерации
адреса перетащить из одного скрипта в другой. Там, похоже, разные
библиотеки используются.
newbie
Activity: 54
Merit: 0
Тогда можете помочь допустим я возьму тот скрипт что сгенерирует мне 1 миллион миникеев хороших за 4 минуты

положу в блокнот

как мне их шустро проверить на адрес что бы получить миникей = адрес
допустим натыкался я на brainwallet скрипты  (они конечно не брались с блокнота это я уже подключал сторонние программы + батник)  туда по сути могу пихать свои миникеи и получать желанное
Но опять же упираюсь во время 120 тыс проверяю за 1-2 часа

newbie
Activity: 54
Merit: 0
Quote
вам мало? оставьте на ночь скрипт работать.

Объясняю 1 миллион за 4 минуты генерирует скрипт что я скинул вверху (без адреса)
Quote
SKhHHQLDkHsAniFW2MRyVw9jwDDkKx
SHA256( ): ae172028e80ef37d3e01906ccd05441946c3efa9e4532ab20f5a6e25ce293840
sha256(?): 0057497a02482464d757500773d3d2c26badbcd94d5081d1cff9ea7c16fd2175
Validated.


а мне требуется что бы и адрес генерировался.
Мне и скинули вариант (за что спасибо большое что потратили время на меня) но он медленно делает все тоже самое + адрес и выходит 100к около 3 часов ( это очень долго)
Quote
SKhHHQLDkHsAniFW2MRyVw9jwDDkKx
SHA256( ): ae172028e80ef37d3e01906ccd05441946c3efa9e4532ab20f5a6e25ce293840
sha256(?): 0057497a02482464d757500773d3d2c26badbcd94d5081d1cff9ea7c16fd2175
Address: 17bYqJpPz3huoXuz6Dx6iLejuAHA2k2q3H


по этому я нашел на github вариант https://github.com/samrushing/paper_key  который генерирует  (не приват hex (просто кажись не выводит в лог) но мне без разницы можно и wif)
Quote
private: L3rx4SDmX3kY4P8B1KngkzdS9qmWZbNoRS8u34dNkhZqeJsUPkE1
public: 1GvzcndBngkUo35GjQs5MVysVEVtP2t2X

по скорости генерации выходит так же за около 4 минут 1 миллион вариантов! но тут рандом не тот что в скрипте миникей он другой
( там правило из 30 символов где первая идет буква S  и в конце идет вопрос(?) получается хеш если в хеше идут первые два 00 тогда миникей удался и получается миникей

По этому и прошу можно ли изменить это скрипт https://github.com/samrushing/paper_key поменяв рандомную генерацию стандартную на генерацию миниключей
тогда возможно получится и скорость выше (раз оба скрипта по отдельности показываю высокую скорость)
sr. member
Activity: 770
Merit: 305
тогда чего если просто использовать это скрипт без генерации адреса выходит очень быстро?
а точнее за 11 минут 1 миллион вариантов
вам мало? оставьте на ночь скрипт работать.
вам уже задали вопросы: https://bitcointalksearch.org/topic/m.49868365
на которые вы не ответили.
newbie
Activity: 54
Merit: 0
можно, но скорость это не прибавляет
Я же объяснил вам, почему эта программа в 256+ раз медленнее работает, чем просто
печать случайных приватных ключей. Мало скорости? Возьмите компьютер помощнее
или несколько компьютеров.

Перебирать рандомом 5829 вариантов - это мощно задвинуто. Внушает.



тогда чего если просто использовать это скрипт без генерации адреса выходит очень быстро?
а точнее за 11 минут 1 миллион вариантов

Quote
SKhHHQLDkHsAniFW2MRyVw9jwDDkKx
SHA256( ): ae172028e80ef37d3e01906ccd05441946c3efa9e4532ab20f5a6e25ce293840
sha256(?): 0057497a02482464d757500773d3d2c26badbcd94d5081d1cff9ea7c16fd2175
Validated

Code:
import random
import hashlib

BASE58 = '23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'

def Candidate():
    """
    Generate a random, well-formed mini private key.
    """
    return('%s%s' % ('S', ''.join(
        [BASE58[ random.randrange(0,len(BASE58)) ] for i in range(29)])))

def GenerateKeys(numKeys = 10):
    """
    Generate mini private keys and output the mini key as well as the full
    private key. numKeys is The number of keys to generate, and
    """
    keysGenerated = 0
    totalCandidates = 0
    while keysGenerated < numKeys:
        try:
            cand = Candidate()
            # Do typo check
            t = '%s?' % cand
            # Take one round of SHA256
            candHash = hashlib.sha256(t).digest()
            # Check if the first eight bits of the hash are 0
            if candHash[0] == '\x00':
                privateKey = GetPrivateKey(cand)
                print('\n%s\nSHA256( ): %s\nsha256(?): %s' %
                      (cand, privateKey, candHash.encode('hex_codec')))
                if CheckShortKey(cand):
                    print('Validated.')
                else:
                    print('Invalid!')
                keysGenerated += 1
            totalCandidates += 1
        except KeyboardInterrupt:
            break
    print('\n%s: %i\n%s: %i\n%s: %.1f' %
          ('Keys Generated', keysGenerated,
           'Total Candidates', totalCandidates,
           'Reject Percentage',
           100*(1.0-keysGenerated/float(totalCandidates))))

def GetPrivateKey(shortKey):
    """
    Returns the hexadecimal representation of the private key corresponding
    to the given short key.
    """
    if CheckShortKey(shortKey):
        return hashlib.sha256(shortKey).hexdigest()
    else:
        print('Typo detected in private key!')
        return None

def CheckShortKey(shortKey):
    """
    Checks for typos in the short key.
    """
    if len(shortKey) != 30:
        return False
    t = '%s?' % shortKey
    tHash = hashlib.sha256(t).digest()
    # Check to see that first byte is \x00
    if tHash[0] == '\x00':
        return True
    return False
sr. member
Activity: 770
Merit: 305
можно, но скорость это не прибавляет
Я же объяснил вам, почему эта программа в 256+ раз медленнее работает, чем просто
печать случайных приватных ключей. Мало скорости? Возьмите компьютер помощнее
или несколько компьютеров.

Перебирать рандомом 5829 вариантов - это мощно задвинуто. Внушает.
newbie
Activity: 54
Merit: 0
зы. CheckShortKey можно выкинуть?
можно, но скорость это не прибавляет
sr. member
Activity: 770
Merit: 305
Ваш код что вы мне дали все прекрасно делает, просто по скорости генерации очень долго.
Ну дык, ускоряйте. Вам котлету разжевали и в рот положили, а вы уж и глотать не хотите.

Хотя, я подозреваю, что тут особо не ускоришь из-за условия if candHash[0] == '\x00':
В питоне я не особо силен и правила миникеев не изучал, но вроде бы понятно, что
не случайный набор может являться миникеем, а только один из 256 - вот такое ограничение.

А для чего вам скорость? Хотите перебрать все миникеи брутфорсом? Любопытная задумка,
а сколько там диапазон перебора?

зы. CheckShortKey можно выкинуть?
newbie
Activity: 54
Merit: 0
Ваш код что вы мне дали все прекрасно делает, просто по скорости генерации очень долго.

Можно ли изменить ваш код так что бы все так же генерировался кодом миникеем только в этом скрипте https://github.com/samrushing/paper_key
пускай даже я не увижу приват ключ hex но там же дается приват ключ wif + Address и очень быстро все это делает (подчеркиваю требуется на основе мини-ключа)



legendary
Activity: 2317
Merit: 2318
нужна скорость

Если требуется быстрый подбор приватных ключей для заранее известного списка адресов, тогда нужно привести вашу задачу к виду, пригодному для работы с BitCrack.

Если стоит какая-то другая задача, тогда возникают дополнительные вопросы:
Список мини-ключей у вас уже готовый в файле или вы его генерируете случайным образом на лету?
Что вы делаете с полученным списком адресов? Проверяете его на вхождение в какой-то другой список адресов?

Quote
есть одно но он генерирует рандомно а мне нужно от мини-кеев ( по правилу миникеев )

Но ведь мини-ключи в скрипте, который я редактировал, тоже генерируются случайным образом. Случайно сгенерированные мини-ключи в формате Base-58 преобразуются при помощи операции хеширования SHA-256 в 256-битное число, которое и является приватным ключом. Так не проще ли сразу перебирать 256-битное число?

Проблема в том, что вы показываете только середину вашей задачи, не показывая при этом её начало - исходные данные и конечную цель.
newbie
Activity: 54
Merit: 0
вот смотрите https://github.com/samrushing/paper_key
просто скрипт что я сейчас вам отправил выше делает все шустро не смотря на свои криптографические вычисления так же получает и приват ключ и адрес

обычный генератор на выходе получаем:
private: L3rx4SDmX3kY4P8B1KngkzdS9qmWZbNoRS8u34dNkhZqeJsUPkE1
public: 1GvzcndBngkUo35GjQs5MVysVEVtP2t2X

за 4 минуты на этом скрипте я получаю таких строк как выше 1 миллион
есть одно но он генерирует рандомно а мне нужно от мини-кеев ( по правилу миникеев )

Quote
SKhHHQLDkHsAniFW2MRyVw9jwDDkKx

если бы можно было как то добавить в этот скрипт что по ссылке генерацию мини-кеев и от них получать так

Quote
SKhHHQLDkHsAniFW2MRyVw9jwDDkKx
private: L3rx4SDmX3kY4P8B1KngkzdS9qmWZbNoRS8u34dNkhZqeJsUPkE1
public: 1GvzcndBngkUo35GjQs5MVysVEVtP2t2X

было бы то что я и пытаюсь получить (нужна скорость)

legendary
Activity: 2317
Merit: 2318
просто если запустить скрипт тот что я дал с википедии то выходит 1 миллион записей в 4 минуты а скрипт что вы дали выше за несколько часов только справится с 1 миллионом

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

Quote
Скажите есть ещё варианты генерации?

Если бы вы сформулировали задачу, а главное - цель, в более общем виде, варианты (может быть!) бы нашлись.
legendary
Activity: 2317
Merit: 2318
Уж не знаю, зачем вам эти мини-ключи понадобились, но держите:

Code:
import random
import hashlib
import codecs
import ecdsa

BASE58 = '23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'

def Candidate():
    """
    Generate a random, well-formed mini private key.
    """
    return('%s%s' % ('S', ''.join(
        [BASE58[ random.randrange(0,len(BASE58)) ] for i in range(29)])))

def GenerateKeys(numKeys = 10):
    """
    Generate mini private keys and output the mini key as well as the full
    private key. numKeys is The number of keys to generate, and
    """
    keysGenerated = 0
    totalCandidates = 0
    while keysGenerated < numKeys:
        try:
            cand = Candidate()
            # Do typo check
            t = '%s?' % cand
            # Take one round of SHA256
            candHash = hashlib.sha256(t).digest()
            # Check if the first eight bits of the hash are 0
            if candHash[0] == '\x00':
                privateKey = GetPrivateKey(cand)
                print('\n%s\nSHA256( ): %s\nsha256(?): %s\nUncompressed address: %s\nCompressed address: %s' %
                      (cand, privateKey, candHash.encode('hex_codec'), generate_address(privateKey), generate_compressed_address(privateKey)))
                if CheckShortKey(cand):
                    print('Validated.')
                else:
                    print('Invalid!')
                keysGenerated += 1
            totalCandidates += 1
        except KeyboardInterrupt:
            break
    print('\n%s: %i\n%s: %i\n%s: %.1f' %
          ('Keys Generated', keysGenerated,
           'Total Candidates', totalCandidates,
           'Reject Percentage',
           100*(1.0-keysGenerated/float(totalCandidates))))

def GetPrivateKey(shortKey):
    """
    Returns the hexadecimal representation of the private key corresponding
    to the given short key.
    """
    if CheckShortKey(shortKey):
        return hashlib.sha256(shortKey).hexdigest()
    else:
        print('Typo detected in private key!')
        return None

def CheckShortKey(shortKey):
    """
    Checks for typos in the short key.
    """
    if len(shortKey) != 30:
        return False
    t = '%s?' % shortKey
    tHash = hashlib.sha256(t).digest()
    # Check to see that first byte is \x00
    if tHash[0] == '\x00':
        return True
    return False

def generate_address(private_key):
    public_key = __private_to_public(private_key)
    address = __public_to_address(public_key)
    return address
       

def generate_compressed_address(private_key):       
public_key = __private_to_compressed_public(private_key)
address = __public_to_address(public_key)
return address
   

def __private_to_public(private_key):
    private_key_bytes = codecs.decode(private_key, 'hex')
    # Get ECDSA public key
    key = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1).verifying_key
    key_bytes = key.to_string()
    key_hex = codecs.encode(key_bytes, 'hex')
    # Add bitcoin byte
    bitcoin_byte = b'04'
    public_key = bitcoin_byte + key_hex
    return public_key
       
def __private_to_compressed_public(private_key):
    private_hex = codecs.decode(private_key, 'hex')
    # Get ECDSA public key
    key = ecdsa.SigningKey.from_string(private_hex, curve=ecdsa.SECP256k1).verifying_key
    key_bytes = key.to_string()
    key_hex = codecs.encode(key_bytes, 'hex')
    # Get X from the key (first half)
    key_string = key_hex.decode('utf-8')
    half_len = len(key_hex) // 2
    key_half = key_hex[:half_len]
    # Add bitcoin byte: 0x02 if the last digit is even, 0x03 if the last digit is odd
    last_byte = int(key_string[-1], 16)
    bitcoin_byte = b'02' if last_byte % 2 == 0 else b'03'
    public_key = bitcoin_byte + key_half
    return public_key
       
def __public_to_address(public_key):
    public_key_bytes = codecs.decode(public_key, 'hex')
    # Run SHA256 for the public key
    sha256_bpk = hashlib.sha256(public_key_bytes)
    sha256_bpk_digest = sha256_bpk.digest()
    # Run ripemd160 for the SHA256
    ripemd160_bpk = hashlib.new('ripemd160')
    ripemd160_bpk.update(sha256_bpk_digest)
    ripemd160_bpk_digest = ripemd160_bpk.digest()
    ripemd160_bpk_hex = codecs.encode(ripemd160_bpk_digest, 'hex')
    # Add network byte
    network_byte = b'00'
    network_bitcoin_public_key = network_byte + ripemd160_bpk_hex
    network_bitcoin_public_key_bytes = codecs.decode(network_bitcoin_public_key, 'hex')
    # Double SHA256 to get checksum
    sha256_nbpk = hashlib.sha256(network_bitcoin_public_key_bytes)
    sha256_nbpk_digest = sha256_nbpk.digest()
    sha256_2_nbpk = hashlib.sha256(sha256_nbpk_digest)
    sha256_2_nbpk_digest = sha256_2_nbpk.digest()
    sha256_2_hex = codecs.encode(sha256_2_nbpk_digest, 'hex')
    checksum = sha256_2_hex[:8]
    # Concatenate public key and checksum to get the address
    address_hex = (network_bitcoin_public_key + checksum).decode('utf-8')
    wallet = base58(address_hex)
    return wallet

def base58(address_hex):
    alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
    b58_string = ''
    # Get the number of leading zeros and convert hex to decimal
    leading_zeros = len(address_hex) - len(address_hex.lstrip('0'))
    # Convert hex to decimal
    address_int = int(address_hex, 16)
    # Append digits to the start of string
    while address_int > 0:
        digit = address_int % 58
        digit_char = alphabet[digit]
        b58_string = digit_char + b58_string
        address_int //= 58
    # Add '1' for each 2 leading zeros
    ones = leading_zeros // 2
    for one in range(ones):
        b58_string = '1' + b58_string
return b58_string


GenerateKeys()

Код взят отсюда.
Pages:
Jump to: