Вернуться   Биткоин Форум > Разработка и Техническое Обсуждение
13 сентября 2010, 12:38:24 PM   # 1
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome"
Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
подробнее...


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
Этот bitcoind адрес валидатор является подклассом класса Джанго forms.CharField, но может быть легко адаптирован к другим рамкам или быть автономным кодом.

Это делает "глубоко" проверки, проверки, что контрольная сумма, встроенная в каждый Bitcoin адрес совпадает с адресом. Она нуждается в библиотеке PyCrypto для функции SHA256.

Я передаю этот код в общественное достояние, делать с ним что угодно. И, пожалуйста, дайте мне знать, если вы обнаружите какие-либо ошибки в нем.

BCAddressField.py:
Код:
#
# Джанго типа поля для Bitcoin Адреса
#
импорт повторно
от Джанго импортных форм
от django.forms.util импорта ValidationError
от Crypto.Hash импорта SHA256

Класс BCAddressField (forms.CharField):
  default_error_messages = {
    'Недействителен': 'Invalid Bitcoin адрес.',
    }

  Защиту __init __ (самоповреждения, * Args, ** kwargs):
    супер (BCAddressField, самость) .__ INIT __ (* Args, ** kwargs)

  Защиту чистый (я, значение):
    значение = value.strip ()
    если re.match (г"[A-Za-Z1-9] {27,35} $", Значение) не None:
      поднять ValidationError (self.error_messages [ 'недействителен'])
    версия = get_bcaddress_version (значение)
    если версия не None:
      поднять ValidationError (self.error_messages [ 'недействителен'])
    возвращаемое значение

импорт математика

__b58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
__b58base = Len (__ b58chars)

Защиту b58encode (v):
  """ закодировать v, который является строка байтов, в base58.                                                                                                              
  """

  LONG_VALUE = 0L
  для (I, с) в Перечислим (V [:: - 1]):
    LONG_VALUE + = (256 ** я) * Ord (с)

  Результат = «»
  в то время как LONG_VALUE >= __b58base:
    ДИВ, мод = divmod (LONG_VALUE, __b58base)
    Результат = __b58chars [мод] + результат
    LONG_VALUE = DIV
  Результат = __b58chars [LONG_VALUE] + результат

  # Bitcoin делает немного опережените нулевое сжатие:                                                                                                                  
  # Ведущих 0-байты на входе становятся ведущим-1s                                                                                                                  
  NPAD = 0
  для с в V:
    если с == '\ 0': NPAD + = 1
    еще: разрыв

  возврата (__b58chars [0] * NPAD) + результат

Защиту b58decode (V, длина):
  """ расшифровывает v в строку LEN байтов                                                                                                                            
  """
  LONG_VALUE = 0L
  для (I, с) в Перечислим (V [:: - 1]):
    LONG_VALUE + = __b58chars.find (с) * (__b58base ** я)

  Результат = «»
  в то время как LONG_VALUE >= 256:
    DIV, MOD = divmod (LONG_VALUE, 256)
    Результат = CHR (моды) + результат
    LONG_VALUE = DIV
  Результат = CHR (LONG_VALUE) + результат

  NPAD = 0
  для с в V:
    если с == __b58chars [0]: NPAD + 1 =
    еще: разрыв

  Результат = CHR (0) * NPAD + результат
  если длина не является None и LEN (результат) = длина:
    возвращения None

  возвращаемый результат

Защиту get_bcaddress_version (strAddress):
  """ Возвращает None, если strAddress является недействительным. В противном случае возвращает целочисленную версию адреса. """
  адр = b58decode (strAddress, 25)
  если адрес не None: возвращение None
  версия = ADDR [0]
  Контрольная сумма = ADDR [-4]:
  vh160 = адр [: - 4] # Version плюс hash160 является то, что контрольная сумма                                                                                                    
  h3 = SHA256.new (SHA256.new (vh160) .digest ()). дайджеста ()
  если h3 [0: 4] == Контрольная сумма:
    Возвращение ог (версия)
  возвращения None
20 октября: Исправлена ​​ошибка с Bitcoin адреса с ведущими-1-х.
Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен


Как заработать Биткоины?
Без вложений. Не майнинг.


19 октября 2010, 10:55:32 PM   # 2
 
 
Сообщения: 1372
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

Получил 1806 Биткоинов
Реальная история.





Спасибо за код!

Вклад с переводом Руби (более конкретно Rails вставных валидатора)
требуют «переварить»

класс BitcoinAddressValidator < ActiveModel :: EachValidator
  Защита проверки (запись, поле, значение)
    если valid_bitcoin_address? (значение)
      record.errors [поле] << "Bitcoin адрес недействителен"
    конец
  конец

  частный

  B58Chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
  B58Base = B58Chars.length

  Защиту self.valid_bitcoin_address? (адрес)
    (Адрес = ~ / ^ [A-Za-Z1-9] {33,35} $ /) и версия (адрес)
  конец

  Защиту self.version (адрес)
    декодируют = b58_decode (адрес, 25)
   
    версия = декодируется [0, 1]
    контрольная сумма = декодируется [-4, decoded.length]
    vh160 = декодируется [0, decoded.length - 4]

    Хешированное = (Digest :: SHA2.new << (Digest :: SHA2.new << vh160) .digest) .digest

    хэшированная [0, 4] == контрольная сумма? версия [0]: ноль
  конец

  Защиту self.b58_decode (значение, длина)
    LONG_VALUE = 0
    Индекс = 0
    результат = ""

    value.reverse.each_char сделать | C |
      LONG_VALUE + = B58Chars.index (с) * (B58Base ** Индекс)
      Индекс + 1 =
    конец

    в то время как LONG_VALUE >= 256 сделать
      ДИВ, мод = long_value.divmod 256
      Результат = mod.chr + результат
      LONG_VALUE = DIV
    конец

    Результат = long_value.chr + результат

    если result.length < длина
      Результат = 0.chr * (длина - result.length) + результат
    конец

    результат
  конец
конец


Пропуска модульных тестов (см http://github.com/davout/bitcoin-bank)

Просто вопрос, что использование вашего метода b58_encode?
Дав сейчас офлайн Пожаловаться на Даву   Ответить с цитированием Мультицитирование сообщения от Дава Быстрый ответ на сообщение Дав

19 октября 2010, 11:40:42 PM   # 3
 
 
Сообщения: 416
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

 (Адрес = ~ / ^ [A-Za-Z1-9] {33,35} $ /) 

Вы должны иметь в виду тот факт, что 1111111111111111111114oLvT2 является действительным адресом Bitcoin. Он имеет 27 символов. 28,29,30 ... и т.д. адреса символов также существуют.

Я говорил об этом раньше в

ByteCoin
ByteCoin сейчас офлайн Пожаловаться на ByteCoin   Ответить с цитированием Мультицитирование сообщения от ByteCoin Быстрый ответ на сообщение ByteCoin

20 октября 2010, 12:43:36 AM   # 4
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

RE: какая польза от b58_encode? Он мертв код этого use-- bitcointools (где я впервые реализовал этот материал) использую его для перевода из двоичной hash160 к человеку-читаемым Bitcoin адресов.

RE: 27 символов Bitcoin адреса: Я озадачен. Там есть несоответствие между тем, как Bitcoin угощения ведущих нулей (ведущих 1-х, когда base58 закодирован) и путь мой питон код обрабатывает их.

ByteCoin: вы расчлененный код Bitcoin достаточно, чтобы объяснить, как он решает, сколько ведущих нулей добавить? По моему коду, «14oLvT2» и «11111111111111111111111111114oLvT2» являются одинаковым Bitcoin адрес (что соответствует открытому ключу с хэшем всех нулевых байт).

Но Bitcoin только любит 27-символьный версию «1111111111111111111114oLvT2».

Я должен смотреть на код еще немного завтра, когда я больше бодрствует.
Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен

20 октября 2010, 1:50:10 AM   # 5
 
 
Сообщения: 2870
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

Для каждого ведущего 0x00 байт, добавьте ведущий 1 (кодирование). Для каждого ведущего 1, добавьте 0x00 байт (декодирование). Для кодирования, не принимает входные данные, которые не имеют четное число битов (делящихся на восемь), так как это не имеет смысла. Для декодирования, подушечка ведущих нулей до тех пор, пока есть четное число бит.

Я просто проверить, что выход сразу после DecodeBase58 (в том числе ведущих нулей, контрольная сумма, VersionNumber) длиной 25 байт. Я думаю, что Bitcoin делает что-то похожее на это.

Я сделал некоторые веб-инструменты для работы с адресами:
http://theymos.ath.cx:64150/q/checkaddress
http://theymos.ath.cx:64150/q/addresstohash
http://theymos.ath.cx:64150/q/hashtoaddress
http://theymos.ath.cx:64150/q/hashpubkey
(Источник не является публичной пока.)
theymos сейчас офлайн Пожаловаться на theymos   Ответить с цитированием Мультицитирование сообщения от theymos Быстрый ответ на сообщение theymos

20 октября 2010, 3:18:17 PM   # 6
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

Благодарности theymos! Я полностью пропустил ведущие-нулевые байты становятся ведущими-'1'-символы один-к-одному.

Я установил код питона в первом сообщении этой темы.
Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен

25 октября 2010, 7:46:52 AM   # 7
 
 
Сообщения: 378
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

Вы работаете над проектом Bitcoin Django? Я очень заинтересован, думая об этом самом тоже.
ploum сейчас офлайн Пожаловаться на ploum   Ответить с цитированием Мультицитирование сообщения от ploum Быстрый ответ на сообщение ploum

15 ноября 2010, 7:01:46 PM   # 8
 
 
Сообщения: 608
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

Для тех, кто заинтересован, я переписал base58_encode / base58_decode в PHP, и добавил "decode_btc" Функция (которая возвращает массив, содержащий "версия" а также "гашиш" для данного адреса Bitcoin).

Этот код требует следующих расширений PHP:
  • ГМП (для значений bignum, мы могли бы использовать бв, или даже PHP-родную реализацию в груше, я просто слишком ленив, и я получил ГМП установлен на все мои серверах в любом случае)
  • хэш (или Mhash, кто-то может вставить PHP-родной реализации SHA256, чтобы Откат к)

Вот код, заимствовали из кода предыдущих авторов этой темы:
Код:
$ BTC знак равно decode_btc('1Eym7pyJcaambv8FG4ZoU8A4xsiL9us2zz');
var_dump($ BTC);
var_dump(encode_btc($ BTC));
$ BTC знак равно decode_btc('1111111111111111111114oLvT2');
var_dump($ BTC);
var_dump(encode_btc($ BTC));

функция 
hash_sha256($ строка) {
  если (
function_exists(«Хэш»)) вернуть гашиш('Sha256'$ строкаправда);
  если (
function_exists('Mhash')) вернуть Mhash(MHASH_SHA256$ строка);
  
// вставить родную реализацию PHP в SHA256 здесь
  
бросить новый исключение(«Лень Откат, когда парень, который настроен PHP был ленивым слишком»);
}

функция 
encode_btc($ BTC) {
  
$ BTC знак равно CHR($ BTC['версия']).пак('ЧАС*'$ BTC[«Хэш»]);
  если (
StrLen($ BTCзнак равно 21) вернуть ложный;
  
$ CKSUM знак равно зиЬзЬг(hash_sha256(hash_sha256($ BTC)), 04);
  вернуть 
base58_encode($ BTC.$ CKSUM);
}

функция 
decode_btc($ BTC) {
  
$ BTC знак равно base58_decode($ BTC);
  если (
StrLen($ BTCзнак равно 25) вернуть ложный// инвалид
  
$ версия знак равно ога($ BTC[0]);
  
$ CKSUM знак равно зиЬзЬг($ BTC, -4);
  
// Контрольная сумма двойной sha256 (взять 4 первые байты результата)
  
$ good_cksum знак равно зиЬзЬг(hash_sha256(hash_sha256(зиЬзЬг($ BTC0, -4))), 04);
  если (
$ CKSUM !знак равно $ good_cksum) вернуть ложный;
  вернуть массив (
'версия' знак равно> $ версия«Хэш» знак равно> bin2hex(зиЬзЬг($ BTC120)));
}

функция 
base58_encode($ строка) {
  
$ таблица знак равно '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';

  
$ LONG_VALUE знак равно gmp_init(bin2hex($ строка), 16);

  
$ результат знак равно «»;
  в то время как(
gmp_cmp($ LONG_VALUE58) > 0) {
    список(
$ LONG_VALUE$ модзнак равно gmp_div_qr($ LONG_VALUE58);
    
$ результат .знак равно $ таблица[gmp_intval($ мод)];
  }
  
$ результат .знак равно $ таблица[gmp_intval($ LONG_VALUE)];

  для(
$ NPAD знак равно 0$ строка[$ NPAD] == "\ 0"; ++$ NPAD);

  вернуть 
str_repeat($ таблица[0], $ NPAD).strrev($ результат);
}

функция 
base58_decode($ строка) {
  
$ таблица знак равно '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
  статический 
$ table_rev знак равно ноль;
  если (
нулевой($ table_rev)) {
    
$ table_rev = Массив ();
    для(
$ язнак равно0;$ я<58; ++$ я$ table_rev[$ таблица[$ язнак равно$ я;
  }

  
$ л знак равно StrLen($ строка);
  
$ LONG_VALUE знак равно gmp_init('0');
  для(
$ язнак равно0;$ я<$ л; ++$ я) {
    
$ сзнак равно$ строка[$ л-$ я-1];
    
$ LONG_VALUE знак равно gmp_add($ LONG_VALUEgmp_mul($ table_rev[$ с], gmp_pow(58$ я)));
  }

  
// PHP отсутствует двоичный выход для ГМП
  
$ Рез знак равно пак('ЧАС*'gmp_strval($ LONG_VALUE16));

  для(
$ NPAD знак равно 0$ строка[$ NPAD] == $ таблица[0]; ++$ NPAD);
  вернуть 
str_repeat("\ 0"$ NPAD).$ Рез;
}

Эти выходы:
котировка
Массив (2) {
  ["версия"знак равно>
  Int (0)
  ["гашиш"знак равно>
  Строка (40) "9955c1b44fa66688d27aaa06ba4ad02c6dd91088"
}
Строка (34) "1Eym7pyJcaambv8FG4ZoU8A4xsiL9us2zz"
Массив (2) {
  ["версия"знак равно>
  Int (0)
  ["гашиш"знак равно>
  Строка (40) "0000000000000000000000000000000000000000"
}
Строка (27) "1111111111111111111114oLvT2"

MagicalTux сейчас офлайн Пожаловаться на MagicalTux   Ответить с цитированием Мультицитирование сообщения от MagicalTux Быстрый ответ на сообщение MagicalTux

28 мая 2011, 10:44:52 PM   # 9
 
 
Сообщения: 266
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

  default_error_messages = {
    'Недействителен': 'Invalid Bitcoin адрес.',
    }

  Защиту __init __ (самоповреждения, * Args, ** kwargs):
    супер (BCAddressField, самость) .__ INIT __ (* Args, ** kwargs)

  Защиту чистый (я, значение):
    значение = value.strip ()
    если re.match (г"[A-Za-Z1-9] {27,35} $", Значение) не None:
      поднять ValidationError (self.error_messages [ 'недействителен'])

Gavin,
Я пытаюсь понять ваше использование default.error_messages (первая строка в фрагменте кода), по сравнению с self.error_messages (последняя строка в фрагменте кода выше), в вашем коде.
Есть ли Django каким-то образом связать эти два вместе? Или это ошибка в коде? (Я уверен, что этот код был протестирован много с октября!)

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

jerfelix сейчас офлайн Пожаловаться на jerfelix   Ответить с цитированием Мультицитирование сообщения от jerfelix Быстрый ответ на сообщение jerfelix

28 мая 2011, 11:05:22 PM   # 10
 
 
Сообщения: 1134
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса


Это своего рода разочарование, что никто, кажется, хочет использовать свои функции Баша проверить Bitcoin адрес.

Для этого требуется только базовые инструменты Unix, такие как XXD, постоянные и OpenSSL.

Код:
base58 = ({1..9} {} {A..H J..N} {P..Z} {a..k} {} m..z)
bitcoinregex ="^ [$ (Printf "% s" "$ {base58 [@]}")] {34} $"

decodeBase58 () {
    местные s = $ 1
    для я в {0..57}
    сделать S ="$ {S // $ {base58 [я]} / $ я}"
    сделанный
    Округ Колумбия <<< "16o0d $ {s // / + 58 *} + е"
}

контрольная сумма ()
    XXD -p -c 80

checkBitcoinAddress () {
    если [[ "$ 1" = ~ $ Bitcoinregex]]
    тогда
        ч = $ (decodeBase58 "$ 1")
        контрольная сумма "00 $ {ч :: $ {# ч} -8}" |
        Grep -qi "^ $ {Ч: -8} $"
    еще возвращение 2
    фи
}
grondilu сейчас офлайн Пожаловаться на grondilu   Ответить с цитированием Мультицитирование сообщения от grondilu Быстрый ответ на сообщение grondilu

29 мая 2011, 10:10:19 PM   # 11
 
 
Сообщения: 4
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса


Это своего рода разочарование, что никто, кажется, хочет использовать свои функции Баша проверить Bitcoin адрес.

Для этого требуется только базовые инструменты Unix, такие как XXD, постоянные и OpenSSL.

Это красивые и лаконичные сценарии оболочки. Хорошая работа.
Бэппа сейчас офлайн Пожаловаться на Бэппу   Ответить с цитированием Мультицитирование сообщения от Beppu Быстрый ответ на сообщение Бэппу

29 мая 2011, 11:09:01 PM   # 12
 
 
Сообщения: 1134
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса


Это своего рода разочарование, что никто, кажется, хочет использовать свои функции Баша проверить Bitcoin адрес.

Для этого требуется только базовые инструменты Unix, такие как XXD, постоянные и OpenSSL.

Это красивые и лаконичные сценарии оболочки. Хорошая работа.

Ах, наконец-то! Благодаря!   
grondilu сейчас офлайн Пожаловаться на grondilu   Ответить с цитированием Мультицитирование сообщения от grondilu Быстрый ответ на сообщение grondilu

15 ноября 2012, 2:38:58 PM   # 13
 
 
Сообщения: 314
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

.NET версии 4.0 Bitcoin адреса проверки, переведенный YogaFan:

Код:
Импорт System.Security.Cryptography
Импорт System.Numerics

Модуль ValidateBitCoinAddress

Функция isValidBitcoinAddress (s As String) As Boolean
    Dim regExPattern As String = "[A-Za-Z1-9] {27,35} $"
    Если MatchString (s, regExPattern) Тогда
        Если get_bcaddress_version (s) <> "" затем
            isValidBitcoinAddress = True
        еще
            isValidBitcoinAddress = False
        End If
    еще
        isValidBitcoinAddress = False
    End If
End Function


Функция MatchString (ByVal ул As String, ByVal regexstr As String) As Boolean
    ул = str.Trim ()
    Dim рисунок как новый System.Text.RegularExpressions.Regex (regexstr)
    Возвращение pattern.IsMatch (ул)
End Function

Функция get_bcaddress_version (strAddress) As String

    Дим адр As Byte ()
    Dim версия As Byte
    Дим контрольная сумма (3) As Byte
    Дим h3 (3) As Byte
    Dim х As Integer

    адр = b58decode (strAddress, 25)

    Если IsNothing (адрес), то
        'потерпеть неудачу
        get_bcaddress_version = ""
        Exit Function
    End If

    Тусклый lenAddr As Integer = addr.GetLength (0)
    Dim vh160 (lenAddr - 5) Байт
    Dim ша As New SHA256Managed ()

    версия = адр (0)
    контрольная сумма = {ADDR (lenAddr - 4), адр (lenAddr - 3), адр (lenAddr - 2), адр (lenAddr - 1)}

    При х = 0 Для vh160.GetLength (0) - 1
        vh160 (х) = ADDR (х)
    следующий

    Дим Хэш () As Byte = sha.ComputeHash (vh160)
    Тусклое SecondHash () As Byte = sha.ComputeHash (Хеш)

    h3 = {SecondHash (0), SecondHash (1), SecondHash (2), SecondHash (3)}

    Если h3 (0) = контрольная сумма (0) и Н3 (1) = контрольная сумма (1) и Н3 (2) = контрольная сумма (2) и Н3 (3) = контрольная сумма (3) Тогда
        get_bcaddress_version = version.ToString
    еще
        'потерпеть неудачу
        get_bcaddress_version = ""
    End If

End Function

Функция b58encode (б () As Byte) As String


    Dim b58chars As String = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
    Тусклое b58base Как BigInteger = 58
    Dim х As BigInteger
    Тусклое LONG_VALUE Как BigInteger = 0
    Тусклый результат As String = ""
    Тусклый УПЙ Как BigInteger = 0
    Тусклый IDIV Как BigInteger = 0
    Тусклое b256base В BigInteger = 256

    Dim C As Integer
    Dim лв As Integer

    LV = b.GetLength (0) - 1
    с = 0
    При х = 0 Л.В. К Шаг -1
        LONG_VALUE = LONG_VALUE + BigInteger.Pow (b256base, х) * Ь (с)
        с = с + 1
    следующий

    Do While LONG_VALUE >= b58base
        ИМ = LONG_VALUE моделирование b58base
        IDIV = LONG_VALUE / b58base

        Результат = b58chars (УПМ) & результат
        LONG_VALUE = IDIV
    петля
    Результат = b58chars (LONG_VALUE) & результат

    При х = 0 Л.В.
        Если Ь (х) = CByte (0) Тогда
            Результат = b58chars (0) & результат
        еще
            Выход для
        End If
    следующий

    Возвращаемый результат
    End Function

Функция InsertAt (б As Byte, Barr As Byte (), поз As Integer) As Byte ()

    Если IsNothing (Барр) Тогда
        «Пустой массив; возвращать одноклеточный массив
        Тусклое tmpsomeOtherBarr (0) As Byte
        tmpsomeOtherBarr (0) = Ь
        InsertAt = tmpsomeOtherBarr
        Exit Function
    End If

    Dim х As Integer
    Тусклое tmpbArr (bArr.GetLength (0)) As Byte

    Если позы = -1 Тогда
        «Вставить в конец массива
        При х = 0 Для bArr.GetLength (0) - 1
            tmpbArr (х) = Барра (х)
        следующий
        tmpbArr (bArr.GetLength (0)) = Ь

        Возвращение tmpbArr
    ElseIf поз = 0 Тогда
        «Вставить в начале
        tmpbArr (0) = Ь
        При х = 1 К bArr.GetLength (0)
            tmpbArr (х) = Барра (х - 1)
        следующий
        Возвращение tmpbArr
    еще
        «Вставить в середине
        При х = 0 в поз - 1
            tmpbArr (х) = Барра (х)
        следующий
        tmpbArr (позы) = Ь
        При х = поз + 1 bArr.GetLength (0)
            tmpbArr (х) = Барра (х)
        следующий
        Возвращение tmpbArr

    End If
End Function

Функция b58decode (v As String, л As Integer) As Byte ()

    Dim b58chars As String = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
    Тусклое b58base Как BigInteger = 58
    Тусклое LONG_VALUE Как BigInteger = 0
    Dim лв As Integer
    Dim C As Integer
    Dim х As BigInteger
    Dim biPos Как BigInteger = 0
    Тусклый УПЙ Как BigInteger = 0
    Тусклый IDIV Как BigInteger = 0
    Дим результат (а) As Byte

    LV = LEN (v) - 1

    При х = 0 Л.В. К Шаг -1
        с = с + 1
        biPos = b58chars.IndexOf (середина (V, C, 1))
        LONG_VALUE = LONG_VALUE + BigInteger.Pow (b58base, х) * biPos
    следующий

    Do While LONG_VALUE >= 256
        ИМ = LONG_VALUE моделирование 256
        IDIV = LONG_VALUE / 256
        Результат = InsertAt (CByte (УПМ), результат, 0)
        LONG_VALUE = IDIV
    петля
    Результат = InsertAt (CByte (LONG_VALUE), результат, 0)

    При х = 1 Для Len (v)
        Если Середина (v, х, 1) = b58chars (0) Тогда
            Результат = InsertAt (CByte (0), результат, 0)
        еще
            Выход для
        End If
    следующий

    Если л > 0 И result.GetLength (0) <> л Тогда
        не возвращают ничего
    еще
        Возвращаемый результат
    End If

End Function

End Module


Yogafan00000 сейчас офлайн Пожаловаться на Yogafan00000   Ответить с цитированием Мультицитирование сообщения от Yogafan00000 Быстрый ответ на сообщение Yogafan00000

17 ноября 2012, 10:03:13 AM   # 14
 
 
Сообщения: 980
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

У меня тоже есть PHP а также Ява код для проверки и генерации Bitcoin адреса, которые были протестированы и известные работы.

PHP Пример Ссылка: https://github.com/Xenland/Bitcoin-Pseudocode-Client/blob/gh-pages/examples/php/verify_bitcoin_address.php

Java Пример Источник Ссылка: https://github.com/Xenland/Bitcoin-Pseudocode-Client/blob/gh-pages/examples/java/Commandline%20Generate%20Bitcoin%20Address/src/commandline/CommandLine.java

У меня также есть английское объяснение того, как проверить Bitcoin адреса (часть проекта клиента Bitcoin псевдокода)
http://xenland.github.com/Bitcoin-Pseudocode-Client/verifyaddress.html
Xenland сейчас офлайн Пожаловаться на Xenland   Ответить с цитированием Мультицитирование сообщения от Xenland Быстрый ответ на сообщение Xenland

27 ноября 2012, 5:18:21 PM   # 15
 
 
Сообщений: 47
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

Для тех, кто заинтересован, я переписал base58_encode / base58_decode в PHP, и добавил "decode_btc" Функция (которая возвращает массив, содержащий "версия" а также "гашиш" для данного адреса Bitcoin).

Этот код требует следующих расширений PHP:
  • ГМП (для значений bignum, мы могли бы использовать бв, или даже PHP-родную реализацию в груше, я просто слишком ленив, и я получил ГМП установлен на все мои серверах в любом случае)
  • хэш (или Mhash, кто-то может вставить PHP-родной реализации SHA256, чтобы Откат к)

Вот код, заимствовали из кода предыдущих авторов этой темы:
Код:
$ BTC знак равно decode_btc('1Eym7pyJcaambv8FG4ZoU8A4xsiL9us2zz');
var_dump($ BTC);
var_dump(encode_btc($ BTC));
$ BTC знак равно decode_btc('1111111111111111111114oLvT2');
var_dump($ BTC);
var_dump(encode_btc($ BTC));

функция 
hash_sha256($ строка) {
  если (
function_exists(«Хэш»)) вернуть гашиш('Sha256'$ строкаправда);
  если (
function_exists('Mhash')) вернуть Mhash(MHASH_SHA256$ строка);
  
// вставить родную реализацию PHP в SHA256 здесь
  
бросить новый исключение(«Лень Откат, когда парень, который настроен PHP был ленивым слишком»);
}

функция 
encode_btc($ BTC) {
  
$ BTC знак равно CHR($ BTC['версия']).пак('ЧАС*'$ BTC[«Хэш»]);
  если (
StrLen($ BTCзнак равно 21) вернуть ложный;
  
$ CKSUM знак равно зиЬзЬг(hash_sha256(hash_sha256($ BTC)), 04);
  вернуть 
base58_encode($ BTC.$ CKSUM);
}

функция 
decode_btc($ BTC) {
  
$ BTC знак равно base58_decode($ BTC);
  если (
StrLen($ BTCзнак равно 25) вернуть ложный// инвалид
  
$ версия знак равно ога($ BTC[0]);
  
$ CKSUM знак равно зиЬзЬг($ BTC, -4);
  
// Контрольная сумма двойной sha256 (взять 4 первые байты результата)
  
$ good_cksum знак равно зиЬзЬг(hash_sha256(hash_sha256(зиЬзЬг($ BTC0, -4))), 04);
  если (
$ CKSUM !знак равно $ good_cksum) вернуть ложный;
  вернуть массив (
'версия' знак равно> $ версия«Хэш» знак равно> bin2hex(зиЬзЬг($ BTC120)));
}

функция 
base58_encode($ строка) {
  
$ таблица знак равно '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';

  
$ LONG_VALUE знак равно gmp_init(bin2hex($ строка), 16);

  
$ результат знак равно «»;
  в то время как(
gmp_cmp($ LONG_VALUE58) > 0) {
    список(
$ LONG_VALUE$ модзнак равно gmp_div_qr($ LONG_VALUE58);
    
$ результат .знак равно $ таблица[gmp_intval($ мод)];
  }
  
$ результат .знак равно $ таблица[gmp_intval($ LONG_VALUE)];

  для(
$ NPAD знак равно 0$ строка[$ NPAD] == "\ 0"; ++$ NPAD);

  вернуть 
str_repeat($ таблица[0], $ NPAD).strrev($ результат);
}

функция 
base58_decode($ строка) {
  
$ таблица знак равно '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
  статический 
$ table_rev знак равно ноль;
  если (
нулевой($ table_rev)) {
    
$ table_rev = Массив ();
    для(
$ язнак равно0;$ я<58; ++$ я$ table_rev[$ таблица[$ язнак равно$ я;
  }

  
$ л знак равно StrLen($ строка);
  
$ LONG_VALUE знак равно gmp_init('0');
  для(
$ язнак равно0;$ я<$ л; ++$ я) {
    
$ сзнак равно$ строка[$ л-$ я-1];
    
$ LONG_VALUE знак равно gmp_add($ LONG_VALUEgmp_mul($ table_rev[$ с], gmp_pow(58$ я)));
  }

  
// PHP отсутствует двоичный выход для ГМП
  
$ Рез знак равно пак('ЧАС*'gmp_strval($ LONG_VALUE16));

  для(
$ NPAD знак равно 0$ строка[$ NPAD] == $ таблица[0]; ++$ NPAD);
  вернуть 
str_repeat("\ 0"$ NPAD).$ Рез;
}

Эти выходы:
котировка
Массив (2) {
  ["версия"знак равно>
  Int (0)
  ["гашиш"знак равно>
  Строка (40) "9955c1b44fa66688d27aaa06ba4ad02c6dd91088"
}
Строка (34) "1Eym7pyJcaambv8FG4ZoU8A4xsiL9us2zz"
Массив (2) {
  ["версия"знак равно>
  Int (0)
  ["гашиш"знак равно>
  Строка (40) "0000000000000000000000000000000000000000"
}
Строка (27) "1111111111111111111114oLvT2"



Спасибо за разделение этого источника! Я использовал реализацию, но я заметил, некоторые адреса не проверяют. Например: 12HzMcHURwmAxAkfWgtktYsF3vRTkBz4F3 Любые мысли о том, почему?
matmar10 сейчас офлайн Пожаловаться на matmar10   Ответить с цитированием Мультицитирование сообщения от matmar10 Быстрый ответ на сообщение matmar10

27 ноября 2012, 7:23:50 PM   # 16
 
 
Сообщения: 1134
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса


Кто-нибудь написал тест-набор для генерации ключа-проверки?

Я имею в виду, текст / JSON / любой файл, в котором вы бы пару адресов / закрытых ключей пары?

И во всех возможных форматах (тестовой сети, сжатых / несжатый и так далее ...).

Это было бы полезно.
grondilu сейчас офлайн Пожаловаться на grondilu   Ответить с цитированием Мультицитирование сообщения от grondilu Быстрый ответ на сообщение grondilu

27 ноября 2012, 8:00:11 PM   # 17
 
 
Сообщения: 1484
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса


Кто-нибудь написал тест-набор для генерации ключа-проверки?

Я имею в виду, текст / JSON / любой файл, в котором вы бы пару адресов / закрытых ключей пары?

И во всех возможных форматах (тестовой сети, сжатых / несжатый и так далее ...).

Это было бы полезно.

Существует несколько тестовых данных в формате JSON в https://github.com/bitcoin/bitcoin/tree/master/src/test/data

Я использую это для C-основы "libccoin" Bitcoin библиотеки тестирования https://github.com/jgarzik/picocoin/

jgarzik сейчас офлайн Пожаловаться на jgarzik   Ответить с цитированием Мультицитирование сообщения от jgarzik Быстрый ответ на сообщение jgarzik

27 ноября 2012, 11:59:25 PM   # 18
 
 
Сообщения: 1134
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

Кстати, я создал Розеттский код проект задачи для проверки адреса Bitcoin:

http://rosettacode.org/wiki/Bitcoin/address_validation

Не стесняйтесь ставить свое решение на вашем языке.   Но, пожалуйста, сделать его коротким.
grondilu сейчас офлайн Пожаловаться на grondilu   Ответить с цитированием Мультицитирование сообщения от grondilu Быстрый ответ на сообщение grondilu

28 ноября 2012, 1:05:54 AM   # 19
 
 
Сообщения: 1134
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

Существует несколько тестовых данных в формате JSON в https://github.com/bitcoin/bitcoin/tree/master/src/test/data

Благодаря!
grondilu сейчас офлайн Пожаловаться на grondilu   Ответить с цитированием Мультицитирование сообщения от grondilu Быстрый ответ на сообщение grondilu

28 ноября 2012, 9:02:58 AM   # 20
 
 
Сообщений: 47
Цитировать по имени
цитировать ответ
по умолчанию Re: код Python для проверки Bitcoin адреса

У меня тоже есть PHP а также Ява код для проверки и генерации Bitcoin адреса, которые были протестированы и известные работы.

PHP Пример Ссылка: https://github.com/Xenland/Bitcoin-Pseudocode-Client/blob/gh-pages/examples/php/verify_bitcoin_address.php

Java Пример Источник Ссылка: https://github.com/Xenland/Bitcoin-Pseudocode-Client/blob/gh-pages/examples/java/Commandline%20Generate%20Bitcoin%20Address/src/commandline/CommandLine.java

У меня также есть английское объяснение того, как проверить Bitcoin адреса (часть проекта клиента Bitcoin псевдокода)
http://xenland.github.com/Bitcoin-Pseudocode-Client/verifyaddress.html


Спасибо за этот вклад! Я побежал тест светильники для действительных и недействительных открытых ключей, перечисленных ниже, с некоторыми из моих известных ключей добавили; Я получил следующий результат:

Был один сбой:

1) Lmh \ BitcoinTransferBundle \ Тесты \ BitcoinAddressValidatorTest :: testInvalid
Проверьте недопустимый открытый ключ возвращается «37qgekLpCCHrQuSjvX3fs496FWTGsHFHizjJAs6NPcR47aefnnCWECAhHV6E3g4YN7u7Yuwod5Y» 1 ошибка.
Не удалось утверждать, что 0 матчей ожидается 1.

/Users/matmar10/Projects/bitcoinbymobile/src/Lmh/BitcoinTransferBundle/Tests/BitcoinAddressValidatorTest.php:69

ОТКАЗЫ!
Тесты: 2, 22: Утверждения, Отказы: 1.

Кстати, ваш PHP код был неопределенные переменным метанием ошибки, а также неиспользованные переменной; Я пришлю вам запрос мерзавец нажимной.
matmar10 сейчас офлайн Пожаловаться на matmar10   Ответить с цитированием Мультицитирование сообщения от matmar10 Быстрый ответ на сообщение matmar10



Как заработать Биткоины?

Bitcoin Wallet * Portefeuille Bitcoin * Monedero Bitcoin * Carteira Bitcoin * Portafoglio Bitcoin * Bitcoin Cüzdan * 比特币钱包

bitcoin-zarabotat.ru
Почта для связи: bitcoin-zarabotat.ru@yandex.ru

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW