Я хочу, чтобы вычислить открытый ключ от секретного ключа.
Я могу добавить точки на эллиптической кривой с малым р, но
У меня есть проблема, когда я хочу использовать большое количество.
Вот описание проблемы:
|
24 марта 2015, 7:24:42 PM | # 1 |
Сообщений: 65
цитировать ответ |
Re: Добавление точек на эллиптической кривой
Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome" Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e подробнее... Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru Я хочу, чтобы вычислить открытый ключ от секретного ключа.
Я могу добавить точки на эллиптической кривой с малым р, но У меня есть проблема, когда я хочу использовать большое количество. Вот описание проблемы: |
24 марта 2015, 8:53:41 PM | # 2 |
Сообщения: 1148
цитировать ответ |
Re: Добавление точек на эллиптической кривой
Получил 1806 Биткоинов
Реальная история. Вам нужно умножить обе части на обратной х3.
Какой язык вы используете? Существует, вероятно, функция для вычисления модульного обратного. Нормальный алгоритм используется расширенная алгоритм Евклида. Если у вас есть только способ обработки больших чисел, можно использовать следующую формулу: x_inv по модулю р = хр-2 тойр Погляди "модульное возведение в степень", |
25 марта 2015, 1:38:30 PM | # 3 |
Сообщений: 65
цитировать ответ |
Re: Добавление точек на эллиптической кривой
Я использую C ++ с ГМПОМ для больших чисел.
У меня есть все инструменты в настоящее время. благодаря 🙂 |
27 марта 2015, 3:34:48 AM | # 4 |
Сообщений: 65
цитировать ответ |
Re: Добавление точек на эллиптической кривой
Я реализовал решение с использованием расширенного алгоритма Euclidien,
У меня есть правильные результаты с небольшими числами, но не с большим числом Вот мое решение: Я могу добавить любые пункты whitout проблемы, но с большим числом, с помощью http://www.royalforkblog.com/2014/09/04/ecc/, я получил Код: НЕПРАВИЛЬНО Результаты на веб-странице:privKeyDec: 23695310554196047209792918797392416191148132060917476866274911959533140016553 privKeyHex: 3463120c802f8bd7972aa996083fec011f387a61e55b7b507b9c68d2bc9f7da9 открытый ключ = privKeyDec * G: pubKeyDec_x = 60306455975408622297239001036599486600287350729488590738949419698511411824492 pubKeyDec_y = 105340305216767447115881521734850141742815850841650003460985843120741726629417 pubKeyHex_x = 85543e964d2c63bb7caf42b8dedfa6b3e5a0d99bce28509472654c696a6a476c pubKeyHex_y = e8e47ff840d46305bb1dc2ff173c14cefa0f7dc6a0d26fb10de264c243a52e29 Код: ОК (?) У меня также есть неправильный результат с (Antonopoulos)pubKeyDec_x = 39874617776630327813190058413816560767734954098998567043224950074533143699292 pubKeyDec_y = 83115399533222200534442050051826386603242609920409430626876080623730665355556 или гекса: pubKeyHex_x = 58283bdf22456fffaa0b5f56abd7ad271815d31e44272c0460398540758cdf5c pubKeyHex_y = b7c1a627a79a9000235382c650f23b6a7ebcd18529667dd674185d295e367924 http://chimera.labs.oreilly.com/books/1234000001802/ch04.html#public_key_derivation Вы можете увидеть проблему в моем коде (ниже) или, по крайней мере, кто-то может дать мне в результате добавления 2 балла: 1 * G + 1 * G с параметрами Bitcoin, то я смогу чтобы отслеживать свой код, потому что теперь у меня есть результат очень большое количество дополнений. Код: // G ++ ellipticCurve.cpp -lgmpxx -lgmp -std = C ++ 11 #включают #включают #включают #включают #включают #включают <кортеж> #включают используя патезрас; ЬурейаЯ пара ЬурейаЯ пара Фракция computeSlope (точка, точка); точка addPoints (точка, точка); Строка formatPoint (точка); Строка char2bin (строка); точка doubledPoints (точка); кортеж mpz_class frac2int (точка); Строка bigNumber2strHex (mpz_class); mpz_class hexa2BigNum (Const строка); // раскомментируйте один из этих 2-х групп по 4 параметрам // параметры для Bitcoin mpz_class baseEC ("115792089237316195423570985008687907852837564279074904382605163141518161494337"); mpz_class G_x ("55066263022277343669578718895168534326250603453777594175500187360389116729240"); mpz_class G_y ("32670510020758816978083085130507043184471273380659243275938904335757337482424"); INT = 0; // ЕС: у ^ 2 = х ^ 3 + 7 // параметры для http://www.royalforkblog.com/2014/09/04/ecc/ // mpz_class baseEC ("29"); // изменяет privKeyHex < 29 (0x1D) // mpz_class G_x ("0"); // mpz_class G_y ("2"); // Int А = -3; // ЕС: у ^ 2 = х ^ 3 -3 х + 4 Точка pointG (G_x, G_y); Точка pointP (0, 0); главный () { // раскомментируйте одну из этих 3-х групп 2 параметров // из: http://chimera.labs.oreilly.com/books/1234000001802/ch04.html#public_key_derivation (Antonopoulos) // Строка privKeyHex = "1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD"; // mpz_class privKeyDec = hexa2BigNum (privKeyHex); // из: http://www.royalforkblog.com/2014/09/04/ecc/ (большие цифры) mpz_class privKeyDec ("23695310554196047209792918797392416191148132060917476866274911959533140016553"); Строка privKeyHex = bigNumber2strHex (privKeyDec); // из: http://www.royalforkblog.com/2014/09/04/ecc/ (небольшое количество) // mpz_class privKeyDec ("26"); // Строка privKeyHex = bigNumber2strHex (privKeyDec); знак равно "1A" // добавить и двойной алгоритм: privKey = Публичные * G mpz_class totG = 0; // следить за "x2" а также "+1" операции для (size_t = 0; я < privKeyHex.size (); я ++) { Строка theCharBin = char2bin (privKeyHex.substr (я, 1)); для (size_t J = 0; J <= 3; j ++) { totG + = totG; // дважды (х2) pointP = doubledPoints (pointP); если (theCharBin [J] == '1') { totG + = 1; // добавить (+1) pointP = addPoints (pointG, pointP); } } } соиЬ << епсИ; // соиЬ << "totG должен быть = privKeyDec:" << епсИ ;; // соиЬ << "totG = " << totG << епсИ; соиЬ << "privKeyDec: " << privKeyDec << епсИ; соиЬ << "privKeyHex: " << privKeyHex << епсИ; соиЬ << епсИ << "открытый ключ = privKeyDec * G:" << епсИ; соиЬ << "pubKeyDec_x = " << pointP.first << епсИ; соиЬ << "pubKeyDec_y = " << pointP.second << епсИ << епсИ; соиЬ << "pubKeyHex_x = " << bigNumber2strHex (pointP.first) << епсИ; соиЬ << "pubKeyHex_y = " << bigNumber2strHex (pointP.second) << епсИ << епсИ; } точка (точка addPoints Point1, точка point2) { Точка point3, x3_frac, y3_frac; если (point1.first == 0 && point1.second == 0) { вернуться point2; } если (point2.first == 0 && point2.second == 0) { вернуться point1; } Фракция наклон = computeSlope (point1, point2); x3_frac.second = slope.second * slope.second; x3_frac.first = slope.first * slope.first - ((point1.first + point2.first) * x3_frac.second); x3_frac.first = x3_frac.first% baseEC; x3_frac.first = (x3_frac.first < 0)? x3_frac.first + baseEC: x3_frac.first; point3.first = frac2int (x3_frac); y3_frac.first = slope.first * (point1.first - point3.first) - point1.second * slope.second; y3_frac.second = slope.second; y3_frac.first = y3_frac.first% baseEC; y3_frac.first = (y3_frac.first < 0)? y3_frac.first + baseEC: y3_frac.first; point3.second = frac2int (y3_frac); вернуться point3; } mpz_class frac2int (точка theFrac) { mpz_class и; галстука (игнорировать, и, игнорировать) = ExtGCD (theFrac.second, baseEC); = (и < 0)? и + baseEC: и; возврат (и *) theFrac.first% baseEC; } точка (точка doubledPoints Point1) { вернуть addPoints (point1, Point1); } Фракция computeSlope (точка точка А, точка pointB) { // ЕС: у ^ 2 = х ^ 3 + 7 // Bitcoin // ЕС: у ^ 2 = х ^ 3 -3x + 4 // royalforkblog.com Фракция склон; если (== pointB точке А) { slope.first = 3 * pointA.first * pointA.first + а; slope.second = 2 * pointA.second; } еще { slope.first = pointB.second - pointA.second; // дельта у slope.second = pointB.first - pointA.first; // дельта х } вернуться склон; } Строка formatPoint (точка ThePoint) { ostringstream выходы; выходы << "(" << thePoint.first << ", " << thePoint.second << ")"; вернуть outs.str (); } Строка char2bin (строка theChar) { INT значение; istringstream ОСТ (theChar); ост >> наговор >> стоимость; BitSet<4> биты (значения); Строка binaryString (bits.to_string ()); вернуться binaryString; } кортеж если (а == 0) вернуть make_tuple (B, 0, 1); mpz_class г, у, х; галстук (г, у, х) = ExtGCD (б% а, а); вернуть make_tuple (г, x- (б / с) * у, у); } Строка bigNumber2strHex (mpz_class theBigNumber) { ostringstream поток; поток << наговор << theBigNumber; вернуть stream.str (); } mpz_class hexa2BigNum (Const строки туЗЬптд) { mpz_class х; stringstream поток; поток << наговор << MyString; поток >> Икс; вернуться х; } |
27 марта 2015, 10:41:59 AM | # 5 |
Сообщения: 2366
цитировать ответ |
Re: Добавление точек на эллиптической кривой
Я вижу, по крайней мере, одна ошибка в вашей реализации сложения (я могу указать на это, если вы действительно хотите, но я думаю, что если ваша цель состоит в том, чтобы узнать, вы узнаете больше, если я не, если ваша цель состоит в том, чтобы получить что-то работает I предложить переосмысления своей цели) ... Что вы пытаетесь достичь? Если вы хотите, чтобы сделать реализацию на самом деле использовать свой подход (kludging вместе результат от полу-тек популярных пресс-книг, а не отступая и понимания первых принципов) будет ужасающе медленно и, вероятно, в конечном итоге сломанные или небезопасным.
Если вы просто пытаетесь узнать, вероятно, вы должны сделать шаг назад и работать на каждый компонент по одному за раз, так что вы точно знаете, где ваша ошибка, и поэтому вы можете получить некоторое представление. Например. писать тесты для ваших полевых размножается, поле добавляет, написать тест для вашего модульного обратного (попробовать множество чисел, инвертировать и размножаться сам по себе, чтобы проверить идентичность). Вы не обязательно должны иметь ответы, чтобы проверить на ... проверить алгебраические тождества. например, для точек: A = G + G, B = A + G, С = В + С D = C + G, В == D + -A D == В + А A == С + -A А + С == В + В Бесконечность = С + -С. А + D + -A == -D + D + D, ... и так далее. Хотя это вполне возможно построить корректную реализацию без каких-либо известных векторов значений; если вы действительно хотите их, я хотел бы предложить, я предлагаю устанавливать (или получить веб-доступ) Мудрец (sagemath), так как она имеет прекрасную реализацию эллиптических кривых на конечных полях и может быть легко использован в качестве «карманного калькулятора», чтобы проверить свои результаты : например, шалфея: F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) шалфея: С = EllipticCurve ([Р (0), Р (7)]) шалфея: G = C.lift_x (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798) Мудрец: G (55066263022277343669578718895168534326250603453777594175500187360389116729240: 32670510020758816978083085130507043184471273380659243275938904335757337482424: 1) Мудрец: G + G (89565891926547004231252920425935692360644145829622209833684329913297188986597: 12158399299693830322967808612713398636155367887041628176798871954788371653930: 1) Мудрец: G + G + G (112711660439710606056748659173929673102114977341539408544630613555209775888121: 25583027980570883691656905877401976406448868254816295069919888960541586679410: 1) Мудрец: 8675309 * G (66641067246008511739397675128206923493293851901978595085468284019495272794983: 22882405661336615738255795181502754819791112635438119114432507482219105379189: 1) Мудрец: 8675309 * G * 0x5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72 (102906664656524967437285391368203362606397786797828404077808951036579554576623: 22882405661336615738255795181502754819791112635438119114432507482219105379189: 1) Мудрец: 8675309 * G * 0x5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72 ^ 2 (62036446572098911670458903520965529606848330631474128915637932959742841971720: 22882405661336615738255795181502754819791112635438119114432507482219105379189: 1) Мудрец: 8675309 * G * 0x5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72 ^ 3 (66641067246008511739397675128206923493293851901978595085468284019495272794983: 22882405661336615738255795181502754819791112635438119114432507482219105379189: 1) Хотя есть и другие варианты реализации сортовых secp256k1 в C, ... так как вы, кажется, удобно использовать производный язык C, то почему бы не просто использовать другую реализацию, чтобы получить ваши тестовые случаи? |
29 марта 2015, 1:55:11 AM | # 6 |
Сообщений: 65
цитировать ответ |
Re: Добавление точек на эллиптической кривой
Моя цель состоит в том, чтобы понять основные принципы.
После того, как я буду иметь возможность воспроизвести результаты, я больше не будет необходимости использовать мой код, но вместо этого я буду использовать код, реализованный в Bitcoin. Как физик, я использую много математики (непрерывные функции) но я не математик. Так что я не хочу, чтобы стать криптограф, но вопрос в том, как далеко я должен сделать шаг назад? В ближайшие дни, я буду писать тесты для расширенного алгоритма Евклида, добавление точек на ЕС и моей складывать и умножать алгоритм, чтобы выяснить, где моя ошибка. Sage работает отлично 🙂 |
1 апреля 2015, 2:41:27 AM | # 7 |
Сообщений: 65
цитировать ответ |
Re: Добавление точек на эллиптической кривой
Хорошо, я, наконец, нашел 2 ошибки:
1) В моем коде я не могу иметь отрицательное значение для знаменателя склона. Я просто умножить числитель и знаменатель на -1 2) я использую в качестве р величина задается royalforkblog.com и это не величина р но вместо этого порядок кривой (число точек на кривой). Правильное значение задается gmaxwell в предыдущем посте. Сейчас он работает! Последний (по желанию) вопрос: для elliptique кривой, порядка кривой и простого числа р должна быть такой же, только если р мод 4 = 3 Стараюсь 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F мод 4 = 115792089237316195423570985008687907853269984665640564039457584007908834671663 мод 4 и оно равно 3! Таким образом, они должны быть одинаковыми? |