Вернуться   Биткоин Форум > Разработка и Техническое Обсуждение
2 января 2016, 10:51:17 AM   # 1
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Имея проблемы с подписями МЭД

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


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
Это код, который я написал для создания подписей Bitcoin: https://github.com/ciyam/ciyam/blob/master/src/crypto_keys.cpp#L513 (Код был первоначально из самого Bitcoin и использует OpenSSL).

Он работал отлично (и я также добавил код, чтобы обеспечить низкие значения S), но теперь в то время как я пытаюсь проверить CLTV ОГО я всегда получаю следующее сообщение об ошибке при попытке отправить сделки:

Код:
ошибка: {"код": -26,"сообщение":"16: обязательный-скрипт-проверить-флаг не удалось (Неканоническая DER подпись)"}

Это образец МЭД кодируются подписи:

Код:
3045022100da3114f49f3135fa0e3723a2c05ec304f4d16ce3e3f11920e7caa296dd53a9e202206870c44c3681bb9339c1233895a86c6b2861e3d6e6fa562601accae47fc445b201

Я вижу в приведенном выше, что есть 00 после того, как длина 21 и мне интересно, если заполнение нулями проблема (комментарии, которые я прочитал в последнем коде Bitcoin, кажется, указывают, что ведущие нули не должны быть там, если значение не является отрицательным - хмм ... но это не то, что число отрицательно?).

Если это так, что я должен изменить в своем коде, чтобы убедиться, что DER подпись быть канонически построен (т.е. это даже можно сделать правильно с помощью OpenSSL или мне нужно писать код, чтобы избавиться от ведущих нулей себя)?
CIYAM сейчас офлайн Пожаловаться на CIYAM   Ответить с цитированием Мультицитирование сообщения от CIYAM Быстрый ответ на сообщение CIYAM


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


3 января 2016, 3:24:00 AM   # 2
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Имея проблемы с подписями МЭД

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





Вот еще один пример МЭД подписи, отвергается:

Код:
3044022069c288dd4f1995d6f95c6338842dd55934b7ac78c3bae65950ec64e7477cd5c902203fb73d7c329ec4f3da2f403eddc635215673cb13487f0e7e803969488678565001

Там нет ведущих нулей в этом один - так, что именно случилось с ним?
CIYAM сейчас офлайн Пожаловаться на CIYAM   Ответить с цитированием Мультицитирование сообщения от CIYAM Быстрый ответ на сообщение CIYAM

3 января 2016, 4:12:28 AM   # 3
 
 
Сообщения: 1862
Цитировать по имени
цитировать ответ
по умолчанию Re: Имея проблемы с подписями МЭД

Хм ... Я не думаю, что проблема с форматом DER я просто попытался это:

Код:
#включают <строка>
#включают <вектор>
#включают
#включают

используя патезрас;

BOOL статический IsValidSignatureEncoding (Const станд :: вектор<неподписанные символ> &сиг) {
    // Формат: 0x30 [всего длина] 0x02 [R-длина] [R] 0x02 [S длина] [S], [sighash]
    // * общая длина: длина 1 байт дескриптора все, что следует,
    // исключая sighash байт.
    // * Р-длина: длина 1 байт дескриптора значения R, который следует.
    // * R: произвольной длины большой обратный порядок байт значения кодируются R. Он должен использовать самый короткий
    // возможно кодирование в течение целых положительных чисел (что не означает нулевых байтов в
    // начало, за исключением одного, когда следующий байт имеет свой высокий набор бит).
    // * S-длина: длина 1 байт дескриптора значения S, который следует.
    // * S: произвольной длины большой обратный порядок байт закодированное значение S. Те же правила применяются.
    // * sighash: значение 1 байт указывает на то, что данные хешируется (не входит в DER
    // подпись)

соиЬ << "при 0 ..." << епсИ;
соиЬ << "sig.size () = " << sig.size () << епсИ;
    // Минимальные и максимальные ограничения размера.
    если (sig.size () < 9) возвращает ложь;
    если (sig.size () > 73) возвращает ложь;

соиЬ << "на 1 ..." << епсИ;
    // Сигнатура имеет тип 0x30 (соединения).
    если (! сиг [0] = 0x30) возвращает ложь;

соиЬ << "в 2 ..." << епсИ;
    // Убедитесь, что длина охватывает всю подпись.
    если (сиг [1] = sig.size () - 3!) вернуться ложным;

соиЬ << "в 3..." << епсИ;
    // Извлечение длины R элемента.
    беззнаковое INT LENR = сиг [3];

соиЬ << "в 4 ..." << епсИ;
    // Убедитесь, что длина S элемента остается внутри подписи.
    если (5 + LENR >= Sig.size ()) возвращает ложь;

соиЬ << "в 5..." << епсИ;
    // Извлечение длины элемента S.
    беззнаковое INT = Lens сиг [5 + LENR];

соиЬ << "LENR = " << LENR << епсИ;
соиЬ << "Lens = " << хрусталик << епсИ;
    // Убедитесь, что длина подписи соответствует сумме длины
    // элементов.
    если ((size_t) (LENR + Lens + 7) = sig.size (!)) вернуться ложным;
 
соиЬ << "в 6..." << епсИ;
    // Проверьте R является ли элемент целого числа.
    если (! сиг [2] = 0x02) возвращает ложь;

соиЬ << "в 7..." << епсИ;
    // нулевой длины целые числа, не допускаются к R.
    если (LENR == 0) возвращает ложь;

соиЬ << "в 8..." << епсИ;
    // Отрицательные числа не допускаются для R.
    если (Sig [4] & 0x80) возвращает ложь;

соиЬ << "в 9..." << епсИ;
    // нулевые байты в начале R не допускается, если R будет
    // в противном случае следует интерпретировать как отрицательное число.
    если (LENR > 1 && (Сиг [4] == 0x00) && ! (Сиг [5] & 0x80)) возвращает ложь;

соиЬ << "в 10..." << епсИ;
    // Проверяем элемент S, является ли целое число.
    если (! сиг [LENR + 4] = 0x02) возвращают ложь;

соиЬ << "в 11..." << епсИ;
    // нулевой длины целые числа, не допускаются к S.
    если (Lens == 0) возвращает ложь;

соиЬ << "в 12..." << епсИ;
    // Отрицательные числа не допускаются S.
    если (сиг [LENR + 6] & 0x80) возвращает ложь;

соиЬ << "в 13 ..." << епсИ;
    // нулевые байты в начале S не допускаются, если S не будет иначе
    // интерпретируется как отрицательное число.
    если (Lens > 1 && (Сиг [LENR + 6] == 0x00) && ! (Сиг [LENR + 7] & 0x80)) возвращает ложь;

соиЬ << "в 14 ..." << епсИ;
    возвращает истину;
}

ИНТ основной (интермедиат ARGC, символ * ARGV [])
{
   если (ARGC! = 2)
      соиЬ << "Использование: х " << епсИ;
   еще
   {
      Строка сиг (ARGV [1]);

      вектор< неподписанные символ > байт;
      для (size_t = 0; я < sig.size (); I + = 2)
      = 0x0a;
         иначе, если (сиг [+ 1] == 'B'

      соиЬ << IsValidSignatureEncoding (байт) << епсИ;
   }
}

А потом побежал это:
Код:
> х 3044022069c288dd4f1995d6f95c6338842dd55934b7ac78c3bae65950ec64e7477cd5c902203fb73d7c329ec4f3da2f403eddc635215673cb13487f0e7e803969488678565001

при 0 ...
sig.size () = 71
на 1 ...
в 2 ...
в 3...
в 4 ...
в 5...
LENR = 32
Lens = 32
в 6...
в 7...
в 8...
в 9...
в 10...
в 11...
в 12...
в 13 ...
в 14 ...
1

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



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

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

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

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW