12 июля 2011, 3:12:57 PM   # 1
 
 
Сообщения: 1428
Цитировать по имени
цитировать ответ
по умолчанию Re: ECDSA в питона

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


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
Как я работаю на развитие моего питона бэкенда для клиента BTC, и найти его трудно найти достойную реализацию ECDSA в питоне, который был бы достаточно для моих целей. Я посмотрел на следующее:

M2Crypto - похоже, это лучшая реализация в целом, но я не могу получить бинарные строки ключей и подписей из него. Я могу только сохранить их в PEM файлов. 
питон-NSS - не выглядит как кросс-платформенный
PyCrypto - не ECDSA
питон-ECDSA (*) - временный победитель! - https://github.com/warner/python-ecdsa

Там очень много хорошей информации о криптографических пакетов, здесь:  http://mikeivanov.com/pc/python-crypto.pdf

M2Crypto был бы моим первым выбором, но, насколько я могу сказать, что нет никакого способа, чтобы получить бинарные ключи непосредственно из библиотеки. Вы можете сгенерировать ключ, создавать подписи, а также сохранять вещи PEM-файлы, но не имеет доступа к самим ключам. Я не люблю писать ключи на жесткий диск, а затем реверс-инжиниринг формат PEM файл, чтобы получить ключ из.  Может быть если вы могли бы записать его в файл RAM ... но все-таки кажется, как взломать. (Возможно, кто-то имеет опыт работы с этим?)

питон-ECDSA кажется лучшим выбором, поскольку он не содержит каких-либо ограничений, а также любые нестандартные зависимости за пределы его собственных файлов, и должны работать на любой платформе. Выглядит медленно, но я не уверен, что это проблема, если вы не собираетесь проверить весь блок-цепь.

Кто-нибудь знает любой другой библиотеки питона, или способ для получения питона сделать DSA подписи / проверки, необходимые для Bitcoin? 
etotheipi сейчас офлайн Пожаловаться на etotheipi   Ответить с цитированием Мультицитирование сообщения от etotheipi Быстрый ответ на сообщение etotheipi


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


12 июля 2011, 3:46:36 PM   # 2
 
 
Сообщения: 938
Цитировать по имени
цитировать ответ
по умолчанию Re: ECDSA в питона

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





http://forum.bitcoin.org/index.php?topic=23241.0

Узнайте некоторые русские или поговорить с Lis или прочитать код  

Также :
http://forum.bitcoin.org/index.php?topic=27179.0

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

12 июля 2011, 4:31:32 PM   # 3
 
 
Сообщения: 1428
Цитировать по имени
цитировать ответ
по умолчанию Re: ECDSA в питона

Ничего себе, это в точку то, что я искал! Все, что вам нужно в одном, зависимости менее файл питона! Я, конечно, пожертвовать Lis!

Постскриптум - Я сделал поиск по "питон ECDSA" в поисковой строке форума. Я получил только 3 хиты (вероятно, 4 теперь, с этой должности). Я думаю, мне нужно было копать немного глубже.

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

12 июля 2011, 5:10:35 PM   # 4
 
 
Сообщения: 938
Цитировать по имени
цитировать ответ
по умолчанию Re: ECDSA в питона

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

13 июля 2011, 12:38:02 AM   # 5
 
 
Сообщения: 1428
Цитировать по имени
цитировать ответ
по умолчанию Re: ECDSA в питона

Итак, библиотека ECDSA по Lis является фантастической, за исключением того, что я пропускаю один критический кусок головоломки - я не могу для своей жизни выяснить, как подписи закодированы. Подпись состоит из двух целых чисел, (R, S), ДЕР-кодированию. Я рыть через очень сухой документ кодирования DER, и я не могу понять это. Большинство людей используют библиотеку SSL для кодирования / декодирования DER, но я стараюсь не иметь такие зависимости в моем клиенте.

Кто-нибудь достаточно хорошо знаком с кодировкой МЭД, чтобы узнать, как развалится бинарной сигнатуры в два целых числа г и с?

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

13 июля 2011, 1:44:44 PM   # 6
 
 
Сообщения: 1428
Цитировать по имени
цитировать ответ
по умолчанию Re: ECDSA в питона

Обновление: После достаточно шестигранной-водолазных и спецификации документов, я понял, как они закодированы. Я уверен, что это было бы безответственно вслепую декодировать МЭД кусок без проверки байт-кодов / флагов, но я думаю, что это никогда не изменится в Bitcoin, поэтому я вышеизложенным правильную библиотеку МЭД.

Байт Листинг:
--------------
1: \ x30
2: длина 1-байт DER-кодированных (R, S) пара (предположим, 68)

3: \ x02
4: длина 1 байт т-значения (предположим 32)
5-36: целое число, значение г

37: \ x02
38: длина 1 байт втор-значения (предположим 32)
39-70: целое значение с

71: \ x01
--------------

Значения г и s не всегда 32 бит, так что вы все еще нужно, чтобы прочитать все байты длины. В \ x30 \ x02 и байты битовые строки флагов, относящихся к схеме кодирования DER.
etotheipi сейчас офлайн Пожаловаться на etotheipi   Ответить с цитированием Мультицитирование сообщения от etotheipi Быстрый ответ на сообщение etotheipi

13 июля 2011, 4:11:47 PM   # 7
 
 
Сообщения: 112
Цитировать по имени
цитировать ответ
по умолчанию Re: ECDSA в питона

Эта нить содержит некоторые примеры кода для M2Crypto и в более позднем посте кода образца о том, как работает кодирование DER.

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

13 июля 2011, 10:04:11 PM   # 8
 
 
Сообщений: 67
Цитировать по имени
цитировать ответ
по умолчанию Re: ECDSA в питона

Я потратить некоторое время, чтобы получить i2d_ECPrivateKey экспорт / i2o_ECPublicKey работает (см https://github.com/joric/pywallet)
Соответствующий код (он использует только ctypes):
Код:
# Если бы импортировать i2d_ECPrivateKey / i2o_ECPublicKey из динамической LIBS.
# Похоже модули / M2Crypto / pyOpenSSL PyCrypto не поддерживают их.

DLLs = список ()
если «выиграть» в sys.platform:
    для г в ( 'libeay32.dll', 'libssl32.dll', 'ssleay32.dll'):
        пытаться:
            dlls.append (cdll.LoadLibrary (д))
        Кроме:
            проходить
еще:
    dlls.append (cdll.LoadLibrary ( 'libssl.so'))
           
класс BIGNUM_Struct (структура):
    _fields_ = [("d", C_void_p), ("Вверх", C_int), ("Dmax", C_int), ("нег", C_int), ("флаги", C_int)]
               
класс BN_CTX_Struct (структура):
    _fields_ = [("_", C_byte)]

BIGNUM = POINTER (BIGNUM_Struct)
BN_CTX = POINTER (BN_CTX_Struct)

Защиту load_func (имя, арг, возвращается = c_int):
    д = sys.modules [__name__] .__ dict__
    Не F = None
   
    для библиотеки DLL в DLLs:
        пытаться:
            е = GetAttr (DLL, имя)
            f.argtypes = арг
            f.restype = возвращает
            д [имя] = F
            вернуть
        Кроме:
            проходить
    поднять ImportError ( «Невозможно загрузить требуемые функции из SSL библиотеки DLL»)
   
load_func ( 'BN_new', [], BIGNUM)
load_func ( 'BN_CTX_new', [], BN_CTX)
load_func (,, None 'BN_CTX_free' [BN_CTX])
load_func ( 'BN_num_bits', [BIGNUM], c_int)
load_func ( 'BN_bn2bin', [BIGNUM, c_char_p])
load_func ( 'BN_bin2bn', [c_char_p, c_int, BIGNUM], BIGNUM)
load_func ( 'EC_KEY_new_by_curve_name', [c_int], c_void_p)
load_func ( 'EC_KEY_get0_group', [c_void_p], c_void_p)
load_func ( 'EC_KEY_get0_private_key', [c_void_p], BIGNUM)
load_func ( 'EC_POINT_new', [c_void_p], c_void_p)
load_func ( 'EC_POINT_free', [c_void_p])
load_func ( 'EC_POINT_mul', [c_void_p, c_void_p, BIGNUM, c_void_p, BIGNUM, BN_CTX], c_int)
load_func ( 'EC_KEY_set_private_key', [c_void_p, BIGNUM], c_void_p)
load_func ( 'EC_KEY_set_public_key', [c_void_p, c_void_p], c_void_p)
load_func ( 'i2d_ECPrivateKey', [c_void_p, POINTER (УКАЗАТЕЛЬ (c_char))], c_int)
load_func ( 'i2o_ECPublicKey', [c_void_p, POINTER (УКАЗАТЕЛЬ (c_char))], c_int)

Защиту BN_num_bytes (а):
    возвращающие ((BN_num_bits (а) +7) / 8)

NID_secp256k1 = 714

PKey = 0

Защиту EC_KEY_regenerate_key (ЭКЕЙ, priv_key):
группа = EC_KEY_get0_group (ЭКЕЙ)
CTX = BN_CTX_new ()
pub_key = EC_POINT_new (группа)
EC_POINT_mul (группа, pub_key, priv_key, Ничего, Ничего, CTX)
EC_KEY_set_private_key (ЭКЕЙ, priv_key)
EC_KEY_set_public_key (ЭКЕЙ, pub_key)
EC_POINT_free (pub_key)
BN_CTX_free (CTX)

Защиту GetSecret (PKey):
млрд = EC_KEY_get0_private_key (PKey)
nРазмер: = BN_num_bytes (млрд)
б = create_string_buffer (nРазмер:)
BN_bn2bin (млрд, б)
вернуться b.raw

Защиту GetPrivKey (PKey):
nРазмер: = i2d_ECPrivateKey (PKey, отсутствует)
р = create_string_buffer (nРазмер:)
  i2d_ECPrivateKey (PKey, ByRef (литой (р, УКАЗАТЕЛЬ (c_char))))
возвращение p.raw

Защиту GetPubKey (PKey):
nРазмер: = i2o_ECPublicKey (PKey, отсутствует)
р = create_string_buffer (nРазмер:)
i2o_ECPublicKey (PKey, ByRef (литой (р, УКАЗАТЕЛЬ (c_char))))
возвращение p.raw

Защиту Hash (данные):
s1 = hashlib.sha256 ()
s1.update (данные)
h1 = s1.digest ()
с2 = hashlib.sha256 ()
s2.update (h1)
h2 = s2.digest ()
возвращение h2

Защиту EncodeBase58Check (vchIn):
хэш = Хеш (vchIn)
вернуть b58encode (vchIn + хэш [0: 4])

Защиту DecodeBase58Check (ПСЗ):
vchRet = b58decode (ПСЗ, отсутствует)
ключ = vchRet [0: -4]
CSUM = vchRet [-4:]
хэш = Hash (ключ)
cs32 = хеш [0: 4]
если cs32 = CSUM:
возвращения None
еще:
клавиша возврата

Защиту SecretToASecret (privkey):
vchSecret = privkey [9: 9 + 32]
# Добавить 1-байтовый номер версии
vchIn = "\ x80" + vchSecret
вернуться EncodeBase58Check (vchIn)

Защиту ASecretToSecret (ключ):
VCH = DecodeBase58Check (ключ)
если VCH:
возвращение VCH [1:]
еще:
вернуться Ложные

Защиту importprivkey (дБ, ключ):
vchSecret = ASecretToSecret (ключ)

если не vchSecret:
вернуться Ложные

PKey = EC_KEY_new_by_curve_name (NID_secp256k1)
Bn = BN_bin2bn (vchSecret, 32, BN_new ())
EC_KEY_regenerate_key (PKey, млрд)

секрет = GetSecret (PKey)
private_key = GetPrivKey (PKey)
public_key = GetPubKey (PKey)
адр = public_key_to_bc_address (public_key)

Распечатать "Адрес:% s" % адр
Распечатать "Privkey:% s" % SecretToASecret (private_key)

update_wallet (дб, 'ключ', { 'public_key': public_key 'private_key': private_key})
update_wallet (дб, 'имя', { 'хэш': адр, 'Имя': ''})

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

13 июля 2011, 10:25:59 PM   # 9
 
 
Сообщения: 1148
Цитировать по имени
цитировать ответ
по умолчанию Re: ECDSA в питона

Обновление: После достаточно шестигранной-водолазных и спецификации документов, я понял, как они закодированы. Я уверен, что это было бы безответственно вслепую декодировать МЭД кусок без проверки байт-кодов / флагов, но я думаю, что это никогда не изменится в Bitcoin, поэтому я вышеизложенным правильную библиотеку МЭД.

Байт Листинг:
--------------
1: \ x30
2: длина 1-байт DER-кодированных (R, S) пара (предположим, 68)

3: \ x02
4: длина 1 байт т-значения (предположим 32)
5-36: целое число, значение г

37: \ x02
38: длина 1 байт втор-значения (предположим 32)
39-70: целое значение с

71: \ x01
--------------

Значения г и s не всегда 32 бит, так что вы все еще нужно, чтобы прочитать все байты длины. В \ x30 \ x02 и байты битовые строки флагов, относящихся к схеме кодирования DER.

R и S 33 байт, если это вызовет отрицательное число.

02_20_8000 .....

представляет собой 32 байта целое с MSB = 1. Это является отрицательным, поэтому они изменяют его

02_21_008000 .....

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

24 июля 2011, 3:11:16 AM   # 10
 
 
Сообщений: 67
Цитировать по имени
цитировать ответ
по умолчанию Re: ECDSA в питона

Сделаны некоторые исследования о 279 байт ключа МЭД.

Существует встроенный МЭД кодер / декодер в библиотеке Python-ECDSA (https://github.com/warner/python-ecdsa).

Выход Пример i2d_ECPrivateKey (от http://bitcointools.appspot.com):

Адрес: 1AJ3vE2NNYW2Jzv3fLwyjKF1LYbZ65Ez64
Секретный ключ: 5JMhGPWc3pkdgPd9jqVZkRtEp3QB3Ze8ihv62TmmvzABmkNzBHw

i2d_ECPrivateKey:
Код:
30820113020101042047510706d76bc74a5d57bdcffc68c9bbbc2d496bef87c9
1de7f616129ac62b5fa081a53081a2020101302c06072a8648ce3d0101022100
fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f3006040100040107044104
79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817984
83ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b802
2100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101a
144034200046211d9b7836892c8eef49c4d0cad7797815eff95108e1d30745c0
3577596c9c00d2cb1ab27c7f95c28771278f89b7ff40da49fe9b4ee834a3f6a88
324db837d8

Javascript ASN1 декодер (http://lapo.it/asn1js/) Декодирует его:

Код:
ПОСЛЕДОВАТЕЛЬНОСТЬ (4 элем)
    ЦЕЛОЕ1
    Строка октетов (32 байт) A0DC65FFCA799873CBEA0AC274015B9526505DAA ..
    [0] (1)
        ПОСЛЕДОВАТЕЛЬНОСТЬ (6 эль)
            INTEGER 1
            ПОСЛЕДОВАТЕЛЬНОСТЬ (2 эль)
                ОБЪЕКТ IDENTIFIER 1.2.840.10045.1.1
                Integer (256 бит)
        ПОСЛЕДОВАТЕЛЬНОСТЬ (2 эль)
            Строка октетов (1 байт) 00
            Строка октетов (1 байт) 07
        Строка октетов (65 байт) 0479BE667EF9DCBBAC55A06295CE870B07029BFC ..
        Integer (256 бит)
        ЦЕЛОЕ1
    [1] (1)
    Битовая строка (520 бит)

Я написал Python-ECDSA метод SigningKey, который генерирует такой же вывод, как i2d_ECPrivateKey (279 байтов):

Код:
Защиту i2d (самостоятельно):

    _p = self.curve.curve.p ()
    _r = self.curve.generator.order () # self.curve.order
    _Gx = self.curve.generator.x ()
    _Gy = self.curve.generator.y ()

    oid2 = (1, 2, 840, 10045, 1, 1) # ECDSA-с-SHA1 + ID-прайм-поле
    encoded_oid2 = der.encode_oid (* oid2)

    encoded_gxgy = "\ x04" + ("% 64x" % _Gx) .decode ( 'шестигранной') + ("% 64x" % _Gy) .decode ( 'шестигранной')

    param_sequence = der.encode_sequence (
        der.encode_integer (1),
            der.encode_sequence (
            encoded_oid2,
            der.encode_integer (_p),
        ),
        der.encode_sequence (
            der.encode_octet_string ("\ x00"),
            der.encode_octet_string ("\ X07"),
        ),
        der.encode_octet_string (encoded_gxgy),
        der.encode_integer (_r),
        der.encode_integer (1),
    );

    encoded_vk = "\ X00 \ x04" + Self.get_verifying_key (). To_string ()

    вернуться der.encode_sequence (
        der.encode_integer (1),
        der.encode_octet_string (self.to_string ()),
        der.encode_constructed (0, param_sequence),
        der.encode_constructed (1, der.encode_bitstring (encoded_vk)),
    )

Также см https://github.com/joric/brutus (Ecdsa_pure.py и ecdsa_ssl.py, я обновил их в последнее время).
Joric сейчас офлайн Пожаловаться на Joric   Ответить с цитированием Мультицитирование сообщения от Joric Быстрый ответ на сообщение Joric



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

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

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

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW