15 мая 2013, 6:32:24 AM   # 1
 
 
Сообщения: 2282
Цитировать по имени
цитировать ответ
по умолчанию Re: [RFC] c32d кодирования

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


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
Эта кодировка разработана таким образом, что он может заменить Base58Check новых данных, со следующими целями:
  • Невозможно (?), Чтобы работать без полного его изменений
  • Очевидно, идентифицируемый префикс, независимо от размера данных
  • Дешевле обрабатывать (проще и быстрее код, это радикс сила двоих детей)
  • Фиксированная длина строки для фиксированной длины данных
  • Более однозначный (удаление «isuvzSVZ» символов)
  • Совместимость с использованием семи сегментных дисплеев
  • Altcoin дружественных (16 битого пространства имен, которые могут быть считаны без декодирования)

Так как меньше цифры и более идентификации / подпись символы, адрес длиннее. Это должно быть меньше проблем, так как обычные пользователи, мы надеемся использовать адреса менее часто, как протокол оплаты становится все более популярным.

Пример кода на Python (включая тесты) находится в нижней части.
Я могу писать официальный BIP, если это представляется целесообразным.

Например:

160 битых данные, такие как текущие адреса:
  • 2nc111dhAPE2aUdYAOF88JhLn5jEjbULy4eFe9tyFYFE8
Обычный P2SH назначения, включая Грега "требуют хэш в середине изображения, которое будет передано" Концепция (256 бит данных):
  • 2bc511A95e74P13dPb6b5t7yrh12EhC363ayH98n1cFbr3rAHdA49nCcC1G3P71j
Же ключ в Namecoin:
  • 2nc5119ttL35HPhc3Hh6aHe2tOhF6rdFtAOE1ahFLt9Ecabhcn5FLea5Le71P56C
Пример "головоломка" Сценарий из вики (произвольный скриптовый):
  • 2bc311d126acCyAnHAjabeUtOHcr7F811j4UYE6ECtOcbcGGn4O9chAt7O7y2LU9ty9cnG4
Альтернатива для BIP32 расширенных открытых ключей (560 бит):
  • 2bc911AcchHheAGFnn9LC6FdF7bOc99APJtcEc46U655JheH6LCr3Y333eFEOtPJ9rj22rEcchHheAG Fnn9LC6FdF7bOc99APJtcEc46U655JheH6LCr3YJCtPYea
Альтернатива для BIP32 расширенных закрытых ключей (552 бит):
  • 2bcb11O77GHdP53FH7Jh44OdEh3rLd4eFr2h7c8rGeErELG18yCy9O7L9LednyHJa5hyeAP77GHdP53 FH7Jh44OdEh3rLd4eFr2h7c8rGeErELG18yCyGG5drPF1


c32.py
Код:
# Цифры выбираются так, чтобы быть наименее неоднозначным
# Все они имеют уникальные глифы семь-сегмента, и не может быть легко спутать людьми
цифры = '123456789abcdehjnrtyACEFGHJLOPUY'
Radix = Len (цифры)

Защита кодирования (v):
    если не LEN (v):
        вернуть ''
    п = 0
    бит = 0
    о = []
    коврик = (LEN (v) * 8)% 5
    если колодки:
        v = B '\ 0' + v
    v = ByteArray (v) # Для Python 2.7 совместимости
    для г в диапазоне (LEN (v) - 1, -1, -1):
        п | = v [я] << биты
        бит + 8 =
        в то время как биты >= 5:
            o.insert (0, цифры [п & 0x1F])
            N >>= 5
            биты - = 5
            если я == 0 и блокнот:
                ломать
    Возвращение '' .join (о)

Защита декодирование (ы):
    п = 0
    бит = 0
    о = ByteArray ()
    для г в диапазоне (LEN (ы) - 1, -1, -1):
        п | = digits.index (с [I]) << биты
        бит + 5 =
        в то время как биты >= 8:
            o.insert (0, п & 0xff)
            N >>= 8
            биты - = 8
    возвратные байт (о)

Тест четкости ():
    от математики импорта потолка
    утверждать «» == закодировать (б «»)
    для (I, Oc) в (
        (1, '8'),
        (2, '2'),
        (3, 'J'),
        (4, '4'),
        (5, 'Y'),
        (6, '8'),
        (7, '2'),
        (8, 'J'),
        (9, '4'),
    ):
        ол = INT (CEIL (я * 8/5))
        пытаться:
            inzero = Ъ '\ 0' * я
            Inone = Ъ '\ XFF' * я
            Ezero = закодировать (inzero)
            eone = закодировать (Inone)
            DZero = декодирования (Ezero)
            DONE = декодирования (eone)
           
            утверждают Ežero == «1» * ол
            утверждают eone == ос + ( 'Y' * (ол - 1))
            утверждать DZero == inzero
            утверждают, сделано == InOne
        кроме AssertionError:
            поднять AssertionError ( «Ввод неудачной проверки длины% S»% (я))
    пытаться:
        для с в диапазоне (1024):
            декодировать ( '111' + CHR (с))
    кроме ValueError:
        проходить
    еще:
        поднять AssertionError ( 'Неверный ввод декодированием (% 02X) не бросить ValueError' % (с))

если __name__ == '__main__':
    контрольная работа()
    Распечатать("Испытания прошли")


c32d.py
Код:
импорт c32
импорт hashlib
импорт структура

Защиту _checksum (v):
    вернуть hashlib.sha256 (hashlib.sha256 (v) .digest ()) дайджеста (). [- 4:]

«»»
Формат строки:
- C32 (Raw формат) в обратном порядке

Raw формат:
- 4 байта контрольной суммы
- N байт данных (Примечание: кодируются для предотвращения скрытых изменений)
- - для сценария:
- - - N байт: длина varint прообразом данные
- - - N байт: данные прообраза
- - - N байт: данные сценария
- - для BIP32 HD родительского ключа:
- - - 32 байта: цепь код
- - - 33 байта: родитель Публичных
- - для BIP32 сериализованного ключа:
- - - 1 байт: Глубина
- - - 4 байта: номер ребенка
- - - 32 байта: цепь код
- - - Один из:
- - - - 32 байта: частные данные ключа
- - - - 33 байт: данные открытых ключей
- 1 байт флага (игнорируется, если неизвестно)
- тип 1 байт
- - 01 скрипт (с данными прообраза)
- - 02 сценария хэш прообраз
- - 03 BIP32 HD родительский ключ
- - 04 BIP32 сериализованная открытый ключ
- 2 байта пространства имен (blockchain идентификатор)
- - 2d41 Bitcoin ( '2bc')
- - 2e01 Namecoin ( '2лс')
- - 2e37 Freicoin ( 'FRC')
«»»

Класс c32d:
    __slots__ = ( 'данные', 'нс', 'DTYPE', 'dflag')
   
    Защиту __init __ (я, данные, нс, DTYPE, dflag):
        self.data = данные
        self.ns = нс
        self.dtype = DTYPE
        self.dflag = dflag
   
    @classmethod
    Защита декодирования (ЦБС, с, сырой = False):
        если не сырье:
            полный = c32.decode (s [:: - 1])
        еще:
            полная = ы
       
        CSUM = ByteArray (полное [: 4])
        v = ByteArray (полное [4:])
       
        # Кодируйте байты конфигурации, чтобы упростить декодирование
        PV = 0xBF
        для я в диапазоне (LEN (v) - 1, LEN (v) - 5, -1):
            PV = v [г] ^ (CSUM [я% 4]) ^ ру
            v [I] = ру
       
        v.append (0xBF)
        для я в диапазоне (LEN (v) - 1):
            v [г] ^ = CSUM [% я 4] ^ v [I + 1]
        V.POP ()
       
        v = байт (v)
        если CSUM = _checksum (v):
            поднять ValueError ( 'c32d контрольной суммы неправильно')
       
        о = ЦБС (Ничего, Ничего, Ничего, Ничего)
        o.data = v [: - 4]
        o.dflag = v [-4]
        o.dtype = v [-3]
        o.ns = struct.unpack ( '! Н', V [-2:]) [0]
       
        вернуться о
   
    Защита закодировать (я, сырой = False):
        пытаться:
            v = self.data + struct.pack ( '! BBH', self.dflag, self.dtype, self.ns)
        кроме struct.error как е:
            поднять ValueError (е)
        CSUM = ByteArray (_checksum (v))
       
        v = ByteArray (v)
        PV = 0xBF
        для г в диапазоне (LEN (v) - 1, -1, -1):
            PV = v [г] ^ CSUM [я% 4] ^ ру
            Если я < LEN (v) - 4:
                v [I] = ру
        V = CSUM + байт (v)
       
        если сырье:
            возврат v
       
        вернуться c32.encode (v) [:: - 1]

расшифровывает = c32d.decode

Защита кодирования (* а, ** ка):
    вернуться c32d (* с ** ка) .encode ()

Тест четкости ():
    c32.test ()
    для (P, S, сырого) в (
        ((Б '', 0, 0, 0), '1111115Fd9acc', Ь '\ XB5 \ xa5 \ x0c \ xb9 \ x00 \ x00 \ x00 \ x00'),
        ((B'test», 4232, 142, 219), '955OGe8hOGc97hH4EJj1', Ь '? V \ \\ x1e д / \ x1cq \ XDB \ x8e \ x10 \ x88'),
        ((Ь '\ XFF' * 0x100, 0xFFFF, 0xff, 0xff), 'YYYYYYc327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGt9n2YYbeH63jda5GnYjCEO3r8E53dGYFbchrG4c327OYcC6F9Or6r14UYCJtc5UGb2cOdG3', Ь '\ XB0 \ xce, * \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x1 2 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ xc7 \ x88 \ xb9j \ XBF \ xf0 \ xc1 \ x12 \ XFF \ XFF \ XFF \ XFF '),
    ):
        (Кф, с) = ({}, р)
        для г в диапазоне (2):
            о = c32d (* р ** кп)
            утверждают o.data == р [0]
            утверждают o.ns == р [1]
            утверждают o.dtype == р [2]
            утверждают o.dflag == р [3]
            кп = {
                'Данные': р [0],
                'Нс': р [1],
                'DTYPE': р [2],
                'Dflag': р [3],
            }
            рр = ()
        утверждают o.encode () == s
        утверждают o.encode (сырые = True) == сырой
   
    Защиту ensureValueError (е):
        пытаться:
            F ()
        кроме ValueError:
            проходить
        еще:
            поднять AssertionError ( «Недопустимый ввод расшифровывает не бросаете ValueError»)
    ensureValueError (лямбда: кодирование (б '', -1, 0, 0))
    ensureValueError (лямбда: закодировать (б '', 0x10000, 0, 0))
    ensureValueError (лямбда: кодирование (б '', 0, -1, 0))
    ensureValueError (лямбда: закодировать (б '', 0, 0x100, 0))
    ensureValueError (лямбда: кодирование (б '', 0, 0, -1))
    ensureValueError (лямбда: закодировать (б '', 0, 0, 0х100))
   
    # Invalid c32d
    ensureValueError (лямбда: декодирования ( '1111115Fd9adc'))
    ensureValueError (лямбда: декодирования ( '11A1115Fd9acc'))
   
    # Invalid c32
    ensureValueError (лямбда: декодирования ( '111x115Fd9acc'))
    ensureValueError (лямбда: декодирования ( '1111115Fd9acx'))

если __name__ == '__main__':
    контрольная работа()
    Распечатать("Испытания прошли")
Люк-младший сейчас офлайн Пожаловаться на Luke-Jr   Ответить с цитированием Мультицитирование сообщения от Luke-Jr Быстрый ответ на сообщение Luke-Jr


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


15 мая 2013, 2:45:25 PM   # 2
 
 
Сообщения: 1372
Цитировать по имени
цитировать ответ
по умолчанию Re: [RFC] c32d кодирования

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





Это будет мой список пожеланий для нового альтернативного адреса кодирования:

1. Какой-то метка времени / окончания поля так, чтобы пользователи могли отмечать их адреса, так что клиенты будут подбрасывать предупреждения, если кто-то пытается обратить их в какой-то момент в будущем после точки, когда адрес, как ожидается, будет использоваться. Поле может быть необязательным и отсутствуют, чтобы сделать адрес действительными навсегда, и может иметь переменное разрешение (например временную часть, только если это действительно чувствительные с разрешением больше, чем на 1 день). Можно было бы еще заплатить просроченный адрес, они просто должны были бы пробираться через много протестов со своего клиента и, возможно, иметь его в расширенном режиме.

2. Контрольная сумма / исправление ошибок на основе кодов Рида-Соломон вместо SHA256, так что ошибки одного положения, до ограниченного числа, имеют 100% -ный вероятность того, чтобы быть корректируемыми и 0% вероятности быть исправлены к неправильной вещи.

3. Конечно, совместимость с протоколами оплаты.

В то же время, я хотел бы представить следующее:

4. На практике неоднозначность между символами, такими как "isuvzSVZ" это, по моему мнению, низкий интерес, учитывая широкое внимание копирования, вставку или сканирование Bitcoin адресов, а не вводить их. Несмотря на то, что я сделал это сам много раз с необычным способом я делаю биткоен, я никогда не видел единый потенциальный получатель платежа сказать "Здесь рука типа это Bitcoin адрес в ваш клиент Bitcoin."  Кроме того, при правильной коррекции ошибок Рида-Соломона, визуально похожие замены могут быть обычно надежно исправлены. (Тем не менее, есть также значение в десятичных мощностях из-два, и если выбросить некоторые символы помогают нам достичь этого, а потом ... это отличная идея)

5. Приставка (в данном случае "2") Должна быть полезной для пользователя, чтобы помочь им определить, какой тип объекта они смотрят. С точкой зрения юзабилити, это очень дорого дизайнерское решение использовать один и тот же префикс для адреса по сравнению с закрытым ключом и полагаться на пользователе различать два с помощью инструмента программного обеспечения или какого-то образом запоминания длины. Имея тот же префикс с отличием по длине и т.д. будет отличная идея для altcoin используется только нишу сообщества со специализированными навыками (подобного, кто бы узнать клингона и т.д.), но монеты означало общественности в большой, общественности, которые будут страдать от путаницы и ошибок в результате этого, это действительно необходимо не забывать.
casascius сейчас офлайн Пожаловаться на casascius   Ответить с цитированием Мультицитирование сообщения от casascius Быстрый ответ на сообщение casascius



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

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

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

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW