Вернуться   Биткоин Форум > Разработка и Техническое Обсуждение
15 июня 2014, 6:47:20 PM   # 1
 
 
Сообщения: 1064
Цитировать по имени
цитировать ответ
по умолчанию Re: Вопрос о DER-кодирование пары сигнатуры (R, S)

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


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

Я понимаю, как (вручную) подписать сделку, чтобы определить пару сигнатуры (г, s), но я не понимаю, как я беру эти два 256-битных числа и упаковать их в правильном порядке и с правильной прокладкой для DER ,  

Например, вот два входа в сделке, что я думаю, что должен иметь сценарии подписи одинаковой длины, но они этого не делают. Разница обведены красным (есть 33 байта в первом компоненте подписи для входа 2 вместо 32).  




я нашел это отличная статья сырых сделки Bitcoin Кена Shirriff. Вот таблица, Кен сделал объяснить упаковку на уровне байтов:




Хотя это было очень полезно, я думаю, что некоторые вещи, которые не ясны. Например:

   -  Вы не может думать о подписи в качестве точки кривой (х, у), не так ли? Подпись представляет собой пару 256-битные числа (R, S), а не точка на secp256k1.  

   -  Разве я наценка изображения правильно (г предшествует с)?

   -  Если я знаю, г и с, как 256-битными целыми числами (большие числа), как в точку я DER кодировать их?  


В стороне: Кроме DER быть стандартным форматом OpenSSL, действительно ли есть какие-либо преимущества для кодирования DER? Мне кажется, мы могли бы просто упаковать г и с и имеют все подписи длинные ровно 64 байт.  

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


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


15 июня 2014, 7:04:35 PM   # 2
 
 
Сообщения: 1778
Цитировать по имени
цитировать ответ
по умолчанию Re: Вопрос о DER-кодирование пары сигнатуры (R, S)

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





Если старший бит самого старшего байта установлен, то вам нужно поставить 00 перед ним.

Вот почему фа получает 00 впереди, но 46, 6f, и 15 не

Она исходит из правила протокола, что старший бит числа означает, что он является отрицательным.
Это немного облажались там (потому что эти цифры никогда не отрицательные), но многие вещи в Bitcoin протокола зажмурили и еще как-то работает

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

15 июня 2014, 7:14:50 PM   # 3
 
 
Сообщения: 1064
Цитировать по имени
цитировать ответ
по умолчанию Re: Вопрос о DER-кодирование пары сигнатуры (R, S)

Потрясающие. Благодаря piotr_n. Я предполагаю, что я был прав, и что г предшествует й в паре подписи, тоже, верно?
Peter R сейчас офлайн Пожаловаться на Peter R   Ответить с цитированием Мультицитирование сообщения от Peter R Быстрый ответ на сообщение Peter R

15 июня 2014, 7:18:24 PM   # 4
 
 
Сообщения: 1778
Цитировать по имени
цитировать ответ
по умолчанию Re: Вопрос о DER-кодирование пары сигнатуры (R, S)

Потрясающие. Благодаря piotr_n. Я предполагаю, что я был прав, и что г предшествует й в паре подписи, тоже, верно?
Да, R идет перед S.

Также есть хэш типа байт в конце (SIGHASH_ALL в вашем случае)
Будьте осторожны с этим; если это случится, что там было больше, чем один дополнительный байт после S, хэш-типа всегда последний один из них (все, что вы игнорировать)
Есть транзакции внутри цепи с подписями резьбовых как это, и если вы не обрабатывать такие случаи должным образом, вы потеряете время на расследование его.
piotr_n сейчас офлайн Пожаловаться на piotr_n   Ответить с цитированием Мультицитирование сообщения от piotr_n Быстрый ответ на сообщение piotr_n

15 июня 2014, 9:30:22 PM   # 5
 
 
Сообщения: 1218
Цитировать по имени
цитировать ответ
по умолчанию Re: Вопрос о DER-кодирование пары сигнатуры (R, S)

Как piotr_n указал на Bitcoin ожидает, что старший бит равен нулю, так что если он не добавляется дополнительный нулевой байт. Это означает, что г & ы всегда будет 32 или 33 байта. Не цитируйте меня, но я считаю, что это ошибка в OpenSSL, который был скопирован и теперь каждый должен держать ошибку в коде, чтобы убедиться, что он остается совместимым.


котировка
Вы не можете думать о подписи в качестве точки кривой (х, у), не так ли? Подпись представляет собой пару 256-битные числа (R, S), а не точка на secp256k1.
Верный. Точка в вычислено в создании сигнатуры (к й G), но это не сама подпись. р & ы не являются х & у значения. 

котировка
Разве я наценка изображения правильно (г предшествует с)?
Да.

котировка
Если я знаю, г и с, как 256-битными целыми числами (большие числа), как именно я DER кодировать их?

Вы также должны знать sighash. Учитывая, R, S, и sighash они расположены в следующем порядке:
<Последовательность = 0x30><целое число = 0x02><целое число 0x02>

Все элементы являются 1 байт, за исключением г & с которого будет 32 или 33 байта. Кроме того, обязательно прочитать внимательно на sighash, потому что это "переехал" (По причинам, которые находятся вне меня). Другой Satoshi-изм, я думаю.

r_value = Преобразование г в небольшой массив байт обратного порядка байт. Если ведущий бит равен нулю, то не предварять нулевое значение байта с.
s_value = Преобразовать s в небольшой массив младших байт. Если ведущий бит равен нулю, то не предварять нулевое значение байта с.
r_len = число байтов для г (всегда 20 или 21)
s_len = число байтов для S (всегда 20 или 21)
Последовательность = всегда 0x30
целое число = 0x02 всегда
len_rs = r_len + s_len + 2 (два дополнительных байта для двух целых байтов)
len_sig = len_rs + 3 (три дополнительных байт для len_rs байта, байт последовательности и sighash байт

То, что следует дальше, все, что необходимо для завершения сценария, который загромождать выходы. Публичная затем следует при погашении Pay2PubKeyHash выходов, но не повсеместно присутствует в других типах выходных (т.е. Pay2PubKey).  


котировка
В стороне: Кроме DER быть стандартным форматом OpenSSL, действительно ли есть какие-либо преимущества для кодирования DER? Мне кажется, мы могли бы просто упаковать г и с и имеют все подписи длинные ровно 64 байт. 

Верный. Существует очень мало причин, чтобы использовать кодировку МЭД, кроме Satoshi сделал это таким образом. Новая версия формата ОГО может создана, который является более эффективным пространством. Основное преимущество кодирования DER является обмен информацией между несовместимыми системами. Это чрезмерно многословным, чтобы облегчить обмен данными. Ввод DER подпись внутри propreitary данных не имеет смысла. Зная МЭД не позволяете декодировать ТЕ Bitcoin, и если вы можете декодировать Bitcoin ТХ вы можете просто следовать четким правилам для декодирования R, S, sighash, pubkeys и т.д. так же, как вы должны следовать четким правилам для декодирования ОГО версия, количество входов, последовательность и т.д.



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

16 июня 2014, 7:31:51 AM   # 6
 
 
Сообщения: 1064
Цитировать по имени
цитировать ответ
по умолчанию Re: Вопрос о DER-кодирование пары сигнатуры (R, S)

Благодаря Gerald. Ваше объяснение было совершенно ясно. 

Я начинаю по-настоящему оценить совместный Bitcoin развития с открытым исходным кодом способствует (который является новым для меня). Вместо того, чтобы застрять и тратить день спиннинг мои колеса, я просто задать вопрос, перейти к чему-то еще, и я, когда я проверить назад часто проблема решена. Надеюсь, таятся прочитать эти сообщения и ответы на некоторые вопросы, тоже. 
Peter R сейчас офлайн Пожаловаться на Peter R   Ответить с цитированием Мультицитирование сообщения от Peter R Быстрый ответ на сообщение Peter R

16 июня 2014, 8:15:39 AM   # 7
 
 
Сообщения: 1260
Цитировать по имени
цитировать ответ
по умолчанию Re: Вопрос о DER-кодирование пары сигнатуры (R, S)

котировка
Как piotr_n указал на Bitcoin ожидает, что старший бит равен нулю, так что если он не добавляется дополнительный нулевой байт. Это означает, что г & ы всегда будет 32 или 33 байта.

Для того, чтобы быть правильным: R & S как правило 32 или 33 байта. Но может быть меньше.
Если старший бит 256-разрядное целое число устанавливается мы получили 33 байт (вероятность 1/2)
Если высокий байт больше 0 и меньше, чем 128 мы получили 32 байт (вероятность 127/256)
Если высокий байт 0 - мы должны взять R в 248-разрядное целое число и повторите эти шаги

Есть подписи в blockchain, где длина R или S составляет 29, 30, 31
amaclin сейчас офлайн Пожаловаться на amaclin   Ответить с цитированием Мультицитирование сообщения от amaclin Быстрый ответ на сообщение amaclin

18 июня 2014, 3:47:18 AM   # 8
 
 
Сообщения: 1512
Цитировать по имени
цитировать ответ
по умолчанию Re: Вопрос о DER-кодирование пары сигнатуры (R, S)

Данные подписи кодируется с использованием кодирования ASN.1 потока. Хотя реализации Bitcoin просто засунуть подписи байт, где они должны идти, было бы правильнее, чтобы реально использовать библиотеку ASN, чтобы сделать DER-закодированные подписи. Таким образом, не было бы тайна незарегистрированного битого набором данные, такие как идентификатор тега, которые не только произвольными байты, но определяют метод кодирования следующих байт.

Я документированы это немного раньше, ходить через каждый байт сделки с МЭД документы в руке (хотя я не сделал симпатичную таблицу):


Версия формата данных транзакций (uint32_t):
01000000

TXIN:
    Количество TX_IN (количество входов транзакций, Satoshi VarInt):
    01
    TXIN ДАННЫЕ:
    Предыдущий хэш txout:
    21eb234bbd61b7c3d31034762126a64ff046b074963bf359eaa0da0ab59203a0
    Предыдущий показатель txout:
    01000000
    Длина сценария:
   
        Подпись Длина: (48h = 72 байт)
        48
        ECDSA Подпись (X.690 DER-закодированы):
            ASN.1 Идентификатор тега (20h = построена + 10h = ПОСЛЕДОВАТЕЛЬНОСТЬ и последовательность):
            30
            Длина МЭД октет, определенная короткая форма (45ч = 69 байт) (подпись R + S длина)
            45
            ASN.1 [/ URL] Идентификатор тега (02 = Integer):
            02
             Подпись Длина г (МЭД длина октет):
             20
             Подпись г (без знака двоичного ИНТ, большой обратный порядок байт):
             263325fcbd579f5a3d0c49aa96538d9562ee41dc690d50dcc5a0af4ba2b9efcf
            ASN.1 [/ URL] Идентификатор тега (02 = Integer):
            02
             Signature S длина (длина МЭД октет):
             21
             Signature S (первый байт 00 колодки для защиты MSB 1 беззнаковое целое):
             00fd8d53c6be9b3f68c74eed559cca314e718df437b5c5c57668c5930e14140502
        Конец Подпись байт (SIGHASH_ALL):
        01

    Длина ключа:
    41
        Public Key Префикс:
        04
        Public Key часть х
        52eca3b9b42d8fac888f4e6a962197a386a8e1c423e852dfbc58466a8021110e
        Public Key часть у
        c5f1588cec8b4ebfc4be8a4d920812a39303727a90d53e82a70adcd3f3d15f09
    Последовательность чисел:
    FFFFFFFF

TXOUT:
    номер txout:
    01
    Значение в базовых единицах:
    a086010000000000
        Длина сценария (107 байт):
        6b

        Сценарий (если мы должны были запустить его):
        OP_PUSHDATA1 - Следующий байт содержит число байтов, которые будут в стек:
        4c
        Bytes (68 = 104 байт):
        68
        СТЕК DATA 104 байт:
        4c554b452d4a522049532041205045444f5048494c4521204f682c20616e6420
        676f642069736e2774207265616c2c207375636b612e2053746f7020706f6c6c
        7574696e672074686520626c6f636b636861696e207769746820796f7572206e
        6f6e73656e73652e

Блокировка времени (не могут быть включены до этого блока):
00000000

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



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

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

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

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW