Bitcoin Forum
August 01, 2025, 03:18:07 AM *
News: Latest Bitcoin Core release: 29.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Iceland secp256k1 сложение точек на кривой  (Read 300 times)
GilderIn (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
May 23, 2025, 12:32:32 AM
 #1

Как реализовано сложение точек в python? Если берем (d+x)×G , то выдает одну точку, которая начинает "гулять" по полю, а если d×G +x×G, то уже другая точка по модулю.

Вопрос: как достичь , чтоб d×G + x×G тоже "гулял " по полю как и (d+x)×G? 

Ctrl_A
Jr. Member
*
Offline Offline

Activity: 42
Merit: 27


View Profile
May 24, 2025, 07:10:41 AM
 #2

Как реализовано сложение точек в python? Если берем (d+x)×G , то выдает одну точку, которая начинает "гулять" по полю, а если d×G +x×G, то уже другая точка по модулю.

Вопрос: как достичь , чтоб d×G + x×G тоже "гулял " по полю как и (d+x)×G? 

Возьмём, к примеру, пару точек a = 10 и b = 15.

1. Библиотечная функция выдаёт

для a*G = 10*G:
x_10 = 72488970228380509287422715226575535698893157273063074627791787432852706183111
y_10 = 62070622898698443831883535403436258712770888294397026493185421712108624767191

для b*G = 15*G:
x_15 = 97505755694356382817881959832717013755620551362654128955029190924747025549326
y_15 = 39856815248295663243990443767776362321337592747889787217974905533720651000664

для (a + b)*G = 25*G:
x_25 = 66165162229742397718677620062386824252848999675912518712054484685772795754260
y_25 = 52018513869565587577673992057861898728543589604141463438466108080111932355586

2. Теперь сложим вручную точки a*G и b*G:

p = 2**256 - 2**32 - 977 = 115792089237316195423570985008687907853269984665640564039457584007908834671663

dd = (y_15 - y_10) * pow(x_15 - x_10, -1, p)
x_new = (dd**2 - x_10 - x_15) % p
y_new = (dd * (x_10 - x_new) - y_10) % p

Численные вычисления показывают, что x_new = x_25 и y_new = y_25, это одна и та же точка, т.е. (a + b)*G = a*G + b*G.

Что означает "гулять" по полю?
GilderIn (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
May 25, 2025, 07:22:10 AM
Last edit: May 25, 2025, 09:58:20 AM by xandry
 #3

Iceland выдает точки, которые аналогичны по модулю, но другие , но при операциях сложения и тд: те же точки. Не закручивает в модуль N.А гуляет по полю p. Типа коллизия! Это те же точки, но с другим x,y.
Вот надо достичь , чтоб и при сложении точек отдельно тоже: выходило за N.



Попробуй взять например : N+N-10, то эта точка будет аналогична ( N-10), но другая по x,y. А если складывать N×G + (N-10)×G , то выдаст (N-10)×G
Ctrl_A
Jr. Member
*
Offline Offline

Activity: 42
Merit: 27


View Profile
May 25, 2025, 11:52:25 AM
 #4

Iceland выдает точки, которые аналогичны по модулю, но другие , но при операциях сложения и тд: те же точки. Не закручивает в модуль N.А гуляет по полю p. Типа коллизия! Это те же точки, но с другим x,y.
Вот надо достичь , чтоб и при сложении точек отдельно тоже: выходило за N.



Попробуй взять например : N+N-10, то эта точка будет аналогична ( N-10), но другая по x,y. А если складывать N×G + (N-10)×G , то выдаст (N-10)×G

Если взять точки N+N-10 и ( N-10) для любых N, не равных 5, 10 или 115792089237316195423570985008687907852837564279074904382605163141518161494337. Не будет никакой аналогии.
Вычислить N×G + (N-10)×G - получится (2N - 10)xG.

Мои предыдущие выкладки совсем ничего не прояснили?

Можете на примере с конкретными числами показать, что это за точки, аналогичные по модулю, но другие; что значит закручивать в модуль N; и опять же, что означает "гуляние" по полю p? У вас модуль N или p?

Пожалуйста, приведите конкретный пример. Разберёмся.
GilderIn (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
May 26, 2025, 05:36:15 PM
 #5

a=N-10
b=57896044618658097711785492504343953926418782139537452191302581570759080747168

a+b =173688133855974293135356477513031861779256346418612356573907744712277242241495
P=ice.scalar_multiplication(a+b)
P.hex()=0426efa00470ad62bb5b07ea02bcfa40ab6c2d52fcaf913f1bcb0d3f3ce645951ba1b4dc557ef4c11e6baa975c098520fabe3f99732e74d6e2a7d930b368b1676e

TockaA=ice.scalar_multiplication(a)
TockaB=ice.scalar_multiplication(b)

AB = ice.point_addition(TockaA, TockaB)
AB.hex()= 041fb527e94e9c70e8657de7458b81ef9ee3c2b4e0128a675bf7e28980e18b201ebab00a0911454 07e693d53537818bd3049e1f3640757d22858b8aac5416e3e78

Точка AB : это та же точка, как и P , но свернулось в модуль N

x и y :  разные!
То есть мы сначала взяли сумму и единовременно умножили на G , получилась точка P

НО, когда из a сделали точку, а потом из b, а затем сложили: вышла другая точка AB

Вот точка P "ушла гулять в поле", а AB свернулось в модуль, Математически: эти точки одинаковы!
A-Bolt
Legendary
*
Offline Offline

Activity: 2357
Merit: 2475


View Profile
May 26, 2025, 07:15:50 PM
Merited by xandry (10)
 #6

a+b =173688133855974293135356477513031861779256346418612356573907744712277242241495
Неправильно вы складываете.
Правильно: (a + b) mod n
GilderIn (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
May 26, 2025, 08:25:02 PM
 #7

В том и дело, что мне надо найти способ, чтоб выпрыгивало за модуль, как это сделано в ice, при одновременном сложении без модуля.Но, чтоб это работало при сложении отдельных точек типа ice.scalar.addition
Ctrl_A
Jr. Member
*
Offline Offline

Activity: 42
Merit: 27


View Profile
May 27, 2025, 05:42:25 PM
Merited by xandry (2)
 #8

a=N-10
b=57896044618658097711785492504343953926418782139537452191302581570759080747168

a+b =173688133855974293135356477513031861779256346418612356573907744712277242241495
P=ice.scalar_multiplication(a+b)
P.hex()=0426efa00470ad62bb5b07ea02bcfa40ab6c2d52fcaf913f1bcb0d3f3ce645951ba1b4dc557ef4c11e6baa975c098520fabe3f99732e74d6e2a7d930b368b1676e

TockaA=ice.scalar_multiplication(a)
TockaB=ice.scalar_multiplication(b)

AB = ice.point_addition(TockaA, TockaB)
AB.hex()= 041fb527e94e9c70e8657de7458b81ef9ee3c2b4e0128a675bf7e28980e18b201ebab00a0911454 07e693d53537818bd3049e1f3640757d22858b8aac5416e3e78

Точка AB : это та же точка, как и P , но свернулось в модуль N

x и y :  разные!
То есть мы сначала взяли сумму и единовременно умножили на G , получилась точка P

НО, когда из a сделали точку, а потом из b, а затем сложили: вышла другая точка AB

Вот точка P "ушла гулять в поле", а AB свернулось в модуль, Математически: эти точки одинаковы!
Модульная арифметика, она на то и модульная арифметика, что всё в ней считается по модулю. Если хотите чтобы ваше число M "выпрыгивало" за модуль и "гуляло" по полю, можно прибавлять к нему сколько угодно раз сам модуль. Т.е. M + (k * N), где модуль N = 115792089237316195423570985008687907852837564279074904382605163141518161494337, k - любое целое число.
Но должен Вас разочаровать, в результате таких добавлений конечный результат не изменится.
Для данных из Вашего примера (a = N-10, b = (N-1)/2):
P(a) = 04a0434d9e47f3c86235477c7b1ae6ae5d3442d49b1943c2b752a68e2a47e247c776c545bdabe64 3d85c4938196c5db3969086b3d127885ea6c3411ac3fc8c9358
P(b) = 0400000000000000000000003b78ce563f89a0ed9414f5aa28ad0d96d6795f9c633f3979bf72ae8 202983dc989aec7f2ff2ed91bdd69ce02fc0700ca100e59ddf3
P(a) + P(b) = 041fb527e94e9c70e8657de7458b81ef9ee3c2b4e0128a675bf7e28980e18b201ebab00a0911454 07e693d53537818bd3049e1f3640757d22858b8aac5416e3e78
P(a+b) = 041fb527e94e9c70e8657de7458b81ef9ee3c2b4e0128a675bf7e28980e18b201ebab00a0911454 07e693d53537818bd3049e1f3640757d22858b8aac5416e3e78
P(a+b + 1000000*N) = 041fb527e94e9c70e8657de7458b81ef9ee3c2b4e0128a675bf7e28980e18b201ebab00a0911454 07e693d53537818bd3049e1f3640757d22858b8aac5416e3e78

У последних трёх ключей координаты x и y одинаковые!

Ищите ошибку в функции ice.scalar_multiplication, тем более, что в инете есть информация, что эта функция считает с ошибками. Никогда с ней не работал (за ненадобностью), но есть подозрение, что она выдаёт неправильный результат для чисел > N.
GilderIn (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
May 27, 2025, 06:38:15 PM
 #9

Вот именно, что у вас итоги в модуле. Но в ice это не баг, а прыжок за пределы N.хотя точки математически верны. Поэтому и вопрос такой: как реализовано сложение, что оно "убегает" за модуль.И как достичь этого при сложении готовых точек a и b.
Ctrl_A
Jr. Member
*
Offline Offline

Activity: 42
Merit: 27


View Profile
May 27, 2025, 07:11:01 PM
 #10

Вот именно, что у вас итоги в модуле. Но в ice это не баг, а прыжок за пределы N.хотя точки математически верны. Поэтому и вопрос такой: как реализовано сложение, что оно "убегает" за модуль.И как достичь этого при сложении готовых точек a и b.

Так называемый "прыжок за пределы N" - совершенно неверный результат вычисления ключа суммы двух точек, если модуль N равен вышеприведённому значению.
И как достичь этого при сложении готовых точек a и b? Никак.
GilderIn (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
May 27, 2025, 08:24:31 PM
 #11

Но при ice.scalar.multiplication : получается же. Значит должен быть способ и при сложении точек. Раскопать бы как-то это "неверное" сложение: как оно реализовано.
A-Bolt
Legendary
*
Offline Offline

Activity: 2357
Merit: 2475


View Profile
May 27, 2025, 09:39:57 PM
Merited by xandry (10)
 #12

Но при ice.scalar.multiplication : получается же.
Что именно получается?

Вот ваша сумма без модуля:
a+b = 173688133855974293135356477513031861779256346418612356573907744712277242241495

Эта же сумма в 16-ричном представлении:
a+b = 17FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE18064B5A06ECF0599FBB8DD3385161D7

ice.scalar.multiplication() вместо того, чтобы перед умножением взять это число по модулю n, тупо отбрасывает старший бит, то есть, на вход умножителя на G подаётся число 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE18064B5A06ECF0599FBB8DD3385161D7

Это неправильное поведение библиотечной функции, которое приводит к неверному результату вычисления. Какую пользу вы хотите извлечь из этого бага совершенно непонятно. 
GilderIn (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
May 27, 2025, 11:21:02 PM
 #13

Этот баг дает нереальный эффект. Теперь надо подумать, как сделать этот же эффект при сложении точек или хотя б при умножении точки на число.
Ctrl_A
Jr. Member
*
Offline Offline

Activity: 42
Merit: 27


View Profile
June 06, 2025, 06:35:27 PM
Last edit: June 06, 2025, 08:04:54 PM by Ctrl_A
 #14

Этот баг дает нереальный эффект. Теперь надо подумать, как сделать этот же эффект при сложении точек или хотя б при умножении точки на число.
Вот Вам простая программка на Python-е для сложения двух точек, дающая "нереальный эффект", повторяя баг ice.scalar_multiplication. Учтите, что "правильный" баг получите только в случае, если складываемые приват. ключи имеют сумму > N.
Пользуйтесь на здоровье! Не забудьте включить в соавторы после получения признания величайшего открытия.

def Wonder_func():
    print('Два варианта сложения пуб. ключей: простой (корректный) и усложнённый (с нереальным эффектом)')
    p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
    P = input('Пуб. ключ №1 : ')
    Q = input('Пуб. ключ №2 : ')
    px = int(P[2:66], 16)
    py = int(P[66:], 16)
    qx = int(Q[2:66], 16)
    qy = int(Q[66:], 16)
    if (px == qx) and (py == qy):
        py2 = 2 * py
        dydx = (3 * px**2) * pow(py2, -1, p)
    else:
        qpx = qx - px
        dydx = (qy - py) * pow(qpx, -1, p)
    x = (dydx**2 - px - qx) % p
    y = (dydx * (px - x) - py) % p
    R = '04' + hex(x)[2:].zfill(64) + hex(y)[2:].zfill(64)
    print('\nПравильный суммарный пуб. ключ :')
    print(R)
    x0 = 100056811408208733275829432225571761443897154861420255832015183193056831248263
    y0 = 60566526027762671372996215584771165169296852327468804800455915050077397931708
    qpx = x0 - x
    dydx = (y0 - y) * pow(qpx, -1, p)
    x1 = (dydx**2 - x - x0) % p
    y1 = (dydx * (x - x1) - y) % p
    F = '04' + hex(x1)[2:].zfill(64) + hex(y1)[2:].zfill(64)
    print('\nПуб. ключ с "нереальным эффектом" :')
    print(F)


P.S.
Такое ощущение, будто кого-то обманул...
GilderIn (OP)
Newbie
*
Offline Offline

Activity: 8
Merit: 0


View Profile
June 07, 2025, 04:50:30 PM
 #15

Спасибо огроменное. Лечу проверять))
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!