Из последнего поста частного к общественному вопросу. Пройдя через веб-страницы, которые говорят о эллиптической математике, есть еще вопрос реализации. Единственное место, где я нашел это в pybitcointools. Я по электронной почте автору нет ответа. Ниже приведен код. Вы заметите функцию INV. Это интересно, поскольку он заменяет водораздел. Я не видел это сделано раньше.
Может кто-нибудь расшифровать это простую математическую функцию. Из-за INV высокий / низкий и закрытый ключ четное / нечетное выглядит как система падает на четыре состояния функциональности. Не зная питона достаточно, чтобы распутать вложенные функции это проблема Розеттский для меня. Некоторые вещи, как Public X = (длинная нормальная функция) * личного ключ Mod P или тому подобные. Похоже, с двумя тестов будут заводиться с четырьмя возможными нормальными функциями. В базе десять было бы хорошо, как и тогда все преобразования откладываются.
Р = 2 ** 256-2 ** 32-2 ** 9-2 ** 8-2 ** 7-2 ** ** 6-2 4-1
N = 115792089237316195423570985008687907852837564279074904382605163141518161494337
А = 0
Gx = 55066263022277343669578718895168534326250603453777594175500187360389116729240
Г = 32670510020758816978083085130507043184471273380659243275938904335757337482424
G = (Gx, Gy)
Защиту INV (а, п):
лм, гм = 1,0
низкий, высокий = а% п, п
в то время как низкий > 1:
г = высокий / низкий
нм, новое = гм-лм * г, высокий-низкий * г
лм, низкий, гм, высокий = нм, новый, лм, низкая
вернуться лм% п
### Эллиптические функции Curve
Защиту isinf (р): возвращение р [0] == 0 и р [1] == 0
Защиту base10_add (а, б):
если isinf (а): возвращение Ь [0], B [1]
если isinf (б): возвращать [0], а [1]
если [0] == B [0]:
если [1] == B [1]: вернуть base10_double (а [0], а [1])
иначе: возврат (0,0)
т = ((Ь [1] -a [1]) * INV (б [0] -a [0], Р))% Р
х = (м * м-а [0] -b [0])% Р
у = (м * (а [0] -x) -a [1])% Р
Возвращение (х, у)
Защиту base10_double (а):
если isinf (а): возврат (0,0)
т = ((3 * а [0] * а [0] + А) * INV (2 * а [1], Р))% Р
х = (м * м-2 * а [0])% Р
у = (м * (а [0] -x) -a [1])% Р
Возвращение (х, у)
Защиту base10_multiply (а, п):
если isinf (а) или п == 0: возврат (0,0)
если п == 1: возвращать
если п < 0 или п >= N: возвращение base10_multiply (а, п% N),
если (п% 2) == 0: возвращение base10_double (base10_multiply (а, п / 2))
если (п% 2) == 1: вернуть base10_add (base10_double (base10_multiply (а, п / 2)), а)
Защиту privkey_to_pubkey (privkey):
если isinstance (privkey, (интермедиат, длинные)):
вернуться base10_multiply (G, privkey)
если Len (privkey) == 64:
Возвращение point_to_hex (base10_multiply (G, расшифровывает (privkey, 16)))
Элиф Len (privkey) == 66:
Возвращение компресс (base10_multiply (G, расшифровывает (privkey [: - 2], 16)), 'шестигранной')
Элиф Len (privkey) == 32:
Возвращение point_to_hex (base10_multiply (G, расшифровывает (privkey, 16)))
Элиф Len (privkey) == 33:
Возвращение компресс (base10_multiply (G, расшифровывает (privkey [: - 1], 16)), 'бин')
еще:
вернуться privkey_to_pubkey (b58check_to_hex (privkey))
privtopub = privkey_to_pubkey