Алгоритм деления точки эллиптической кривой Secp256k1 на число(скаляр)

Рейтинг: 0Ответов: 2Опубликовано: 05.08.2023

Как реализовать алгоритм деления на число Z (скаляр) точки, лежащей на эллиптической кривой?

Кривая вида: y^2 = x^3 + A * x + B

A, B и число Z известны.

Точка произвольная, лежащая на кривой. Операции выполняются в кольце вычетов. Более детально:

В случае рассмотрения ЭК над конечном полем, алгоритм деления точки на 2 можно реализовать следующим образом:

ЭК – y^2=x^3+ax+b над полем GF(P),

n – количество точек (включая точку на бесконечности),

P и n – простые числа,

Q – точка на эллиптической кривой, которую необходимо поделить на 2,

W – точка на эллиптической кривой, которую получится в результате, деления Q на 2.

Алгоритм:

Q/2 = W --> W ≡ Q * (2^(-1))(mod n) то есть надо умножать Q на мультипликативно обратное число (inverse) по модулю.

Для 2 inverse (2^(-1)) (mod n) – это тоже самое, что ((n-1)/2)+1.

W ≡ Q * (((n-1)/2)+1)(mod n)

Для любого другого числа r:

W ≡ Q * (r^(-1) mod n)

написал код на python, но вместо деления на 2 точка умножается Результат деления точки на 2:

x=0xe493dbf1c10d80f3581e4904930b1404cc6c13900ee0758474fa94abe8c4cd13 y=0x51ed993ea0d455b75642e2098ea51448d967ae33bfbdfe40cfe97bdc47739922 а должно получится
x=0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 y=0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8

помогите добиться что-бы скрипт делил точку, а не умножал, совсем запутался уже.

# Координаты точки на кривой Secp256k1
x = 0xc6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5
y = 0x1ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a

# Коэффициенты кривой Secp256k1
# n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
a = 0x0000000000000000000000000000000000000000000000000000000000000000
b = 0x0000000000000000000000000000000000000000000000000000000000000007

# Функция для деления точки на 2
def divide_point_by_2(x, y, p, a, b):
    # Вычисление модулярного обратного элемента
    def mod_inverse(n, p):
        return pow(n, p-2, p)

    # Вычисление коэффициента наклона
    s = (3 * pow(x, 2) + a) * mod_inverse(2 * y, p) % p

    # Вычисление новых координат точки
    xr = (pow(s, 2) - 2 * x) % p
    yr = (s * (x - xr) - y) % p

    return xr, yr

# Деление точки на 2
xr, yr = divide_point_by_2(x, y, p, a, b)

# Вывод результатов
print("Результат деления точки на 2:")
print("x =", hex(xr))
print("y =", hex(yr))

Ответы

▲ 0
  1. Точка корректно делится на число через умножение только тогда, когда её приватный ключ нацело делится на это число.
  2. Общая формула вычисления множителей в роли делителей очень простая только для чисел, на которые N-1 делится нацело. Множитель в роли делителя рассчитывается как N - ((N-1)/d), где d - любой из делителей N-1. Все делители N-1:

1 2 3 4 6 8 12 16 24 32 48 64 96 149 192 298 447 596 631 894

1262 1788 1893 2384 2524 3576 3786 4768 5048 7152 7572 9536 10096    14304 15144 20192 28608 30288 40384 60576 94019 121152 188038 282057    376076 564114 752152 1128228 1504304 2256456 3008608 4512912 6017216    9025824 18051648 107361793816595537 214723587633191074    322085381449786611 429447175266382148 644170762899573222    858894350532764296 1288341525799146444 1717788701065528592    2576683051598292888 3435577402131057184 5153366103196585776    6871154804262114368 10306732206393171552 15996907278672735013    20613464412786343104 31993814557345470026 47990721836018205039    63987629114690940052 67745291898271783847 95981443672036410078    127975258229381880104 135490583796543567694 174723607534414371449    191962887344072820156 203235875694815351541 255950516458763760208    270981167593087135388 349447215068828742898 383925774688145640312    406471751389630703082 511901032917527520416 524170822603243114347    541962335186174270776 698894430137657485796 767851549376291280624    812943502779261406164 1023802065835055040832 1048341645206486228694    1083924670372348541552 1397788860275314971592 1535703098752582561248    1625887005558522812328 2096683290412972457388 2167849340744697083104    2795577720550629943184 3071406197505165122496 3251774011117045624656    4193366580825944914776 4335698681489394166208 5591155441101259886368    6503548022234091249312 8386733161651889829552 10094048492842495793203    11182310882202519772736 13007096044468182498624    16773466323303779659104 20188096985684991586406    26033817522627741345901 30282145478527487379609    33546932646607559318208 40376193971369983172812    52067635045255482691802 60564290957054974759218    78101452567883224037703 80752387942739966345624    104135270090510965383604 110250596354215468384319    121128581914109949518436 156202905135766448075406    161504775885479932691248 208270540181021930767208    220501192708430936768638 242257163828219899036872    312405810271532896150812 323009551770959865382496    330751789062646405152957 416541080362043861534416    441002385416861873537276 484514327656439798073744    624811620543065792301624 646019103541919730764992    661503578125292810305914 833082160724087723068832    882004770833723747074552 969028655312879596147488    1249623241086131584603248 1323007156250585620611828    1666164321448175446137664 1764009541667447494149104    1938057310625759192294976 2499246482172263169206496    2646014312501171241223656 3528019083334894988298208    4998492964344526338412992 5292028625002342482447312    7056038166669789976596416 10584057250004684964894624    16427338856778104789263531 21168114500009369929789248    32854677713556209578527062 49282016570334314367790593    65709355427112419157054124 98564033140668628735581186    131418710854224838314108248 197128066281337257471162372    262837421708449676628216496 394256132562674514942324744    525674843416899353256432992 788512265125349029884649488    1051349686833798706512865984 1577024530250698059769298976    3154049060501396119538597952 341948486974166000522343609283189    683896973948332001044687218566378 1025845460922498001567030827849567    1367793947896664002089374437132756 2051690921844996003134061655699134    2735587895793328004178748874265512 4103381843689992006268123311398268    5471175791586656008357497748531024 8206763687379984012536246622796536    10942351583173312016714995497062048    16413527374759968025072493245593072    21884703166346624033429990994124096    32827054749519936050144986491186144    50950324559150734077829197783195161    65654109499039872100289972982372288    101900649118301468155658395566390322    152850973677452202233487593349585483    203801298236602936311316791132780644    215769495280698746329598817457692259    305701947354904404466975186699170966    407602596473205872622633582265561288    431538990561397492659197634915384518    611403894709808808933950373398341932    647308485842096238988796452373076777    815205192946411745245267164531122576    863077981122794985318395269830769036    1222807789419617617867900746796683864    1294616971684192477977592904746153554    1630410385892823490490534329062245152    1726155962245589970636790539661538072    2445615578839235235735801493593367728    2589233943368384955955185809492307108    3260820771785646980981068658124490304    3452311924491179941273581079323076144    4891231157678470471471602987186735456    5178467886736769911910371618984614216    6904623848982359882547162158646152288    9782462315356940942943205974373470912    10356935773473539823820743237969228432    13809247697964719765094324317292304576    18758639927001554244874997690913623113    20713871546947079647641486475938456864    32149654796824113203110223801196146591    37517279854003108489749995381827246226    41427743093894159295282972951876913728    56275919781004662734624993072740869339    64299309593648226406220447602392293182    75034559708006216979499990763654492452    96448964390472339609330671403588439773    112551839562009325469249986145481738678    128598619187296452812440895204784586364    150069119416012433958999981527308984904    192897928780944679218661342807176879546    225103679124018650938499972290963477356    257197238374592905624881790409569172728    300138238832024867917999963054617969808    385795857561889358437322685614353759092    450207358248037301876999944581926954712    514394476749185811249763580819138345456    600276477664049735835999926109235939616    771591715123778716874645371228707518184    900414716496074603753999889163853909424    1028788953498371622499527161638276690912    1200552955328099471671999852218471879232    1543183430247557433749290742457415036368    1800829432992149207507999778327707818848    2057577906996743244999054323276553381824    2795037349123231582486374655946129843837    3086366860495114867498581484914830072736    3601658865984298415015999556655415637696    5590074698246463164972749311892259687674    6172733720990229734997162969829660145472    8385112047369694747459123967838389531511    11180149396492926329945498623784519375348    11836701793937980728516123542966496184303    16770224094739389494918247935676779063022    22360298792985852659890997247569038750696    23673403587875961457032247085932992368606    33540448189478778989836495871353558126044    35510105381813942185548370628899488552909    44720597585971705319781994495138077501392    47346807175751922914064494171865984737212    67080896378957557979672991742707116252088    71020210763627884371096741257798977105818    89441195171943410639563988990276155002784    94693614351503845828128988343731969474424    134161792757915115959345983485414232504176    142040421527255768742193482515597954211636    178882390343886821279127977980552310005568    189387228703007691656257976687463938948848    268323585515830231918691966970828465008352    284080843054511537484386965031195908423272    378774457406015383312515953374927877897696    536647171031660463837383933941656930016704    568161686109023074968773930062391816846544    757548914812030766625031906749855755795392    1136323372218046149937547860124783633693088    1763668567296759128548902407902007931461147    2272646744436092299875095720249567267386176    3527337134593518257097804815804015862922294    5291005701890277385646707223706023794383441    7054674269187036514195609631608031725844588    10582011403780554771293414447412047588766882    14109348538374073028391219263216063451689176    21164022807561109542586828894824095177533764    28218697076748146056782438526432126903378352    42328045615122219085173657789648190355067528    56437394153496292113564877052864253806756704    84656091230244438170347315579296380710135056    112874788306992584227129754105728507613513408    169312182460488876340694631158592761420270112    338624364920977752681389262317185522840540224    36712202954417214842724336778420075919000906527493    73424405908834429685448673556840151838001813054986    110136608863251644528173010335260227757002719582479    146848811817668859370897347113680303676003626109972    220273217726503289056346020670520455514005439164958    293697623635337718741794694227360607352007252219944    440546435453006578112692041341040911028010878329916    587395247270675437483589388454721214704014504439888    881092870906013156225384082682081822056021756659832    1174790494541350874967178776909442429408029008879776    1762185741812026312450768165364163644112043513319664    2349580989082701749934357553818884858816058017759552    3524371483624052624901536330728327288224087026639328    5470118240208165011565926179984591311931135072596457    7048742967248105249803072661456654576448174053278656    10940236480416330023131852359969182623862270145192914    16410354720624495034697778539953773935793405217789371    21880472960832660046263704719938365247724540290385828    23165400064237262565759056507183067904889572018848083    32820709441248990069395557079907547871586810435578742    43760945921665320092527409439876730495449080580771656    46330800128474525131518113014366135809779144037696166    59746473235060985162263246577491932178200490877270861    65641418882497980138791114159815095743173620871157484    69496200192711787697277169521549203714668716056544249    87521891843330640185054818879753460990898161161543312    92661600256949050263036226028732271619558288075392332    119492946470121970324526493154983864356400981754541722    131282837764995960277582228319630191486347241742314968    138992400385423575394554339043098407429337432113088498    175043783686661280370109637759506921981796322323086624    179239419705182955486789739732475796534601472631812583    185323200513898100526072452057464543239116576150784664    238985892940243940649052986309967728712801963509083444    262565675529991920555164456639260382972694483484629936    277984800770847150789108678086196814858674864226176996    350087567373322560740219275519013843963592644646173248    358478839410365910973579479464951593069202945263625166    370646401027796201052144904114929086478233152301569328    477971785880487881298105972619935457425603927018166888    525131351059983841110328913278520765945388966969259872    555969601541694301578217356172393629717349728452353992    716957678820731821947158958929903186138405890527250332    741292802055592402104289808229858172956466304603138656    955943571760975762596211945239870914851207854036333776    1050262702119967682220657826557041531890777933938519744    1111939203083388603156434712344787259434699456904707984    1433915357641463643894317917859806372276811781054500664    1482585604111184804208579616459716345912932609206277312    1911887143521951525192423890479741829702415708072667552    2223878406166777206312869424689574518869398913809415968    2867830715282927287788635835719612744553623562109001328    3451644609571352122298099419570277117828546230808364367    3823774287043903050384847780959483659404831416145335104    4447756812333554412625738849379149037738797827618831936    5735661430565854575577271671439225489107247124218002656    6903289219142704244596198839140554235657092461616728734    8902224512024086789177223740046297894551873140713358289    10354933828714056366894298258710831353485638692425093101    11471322861131709151154543342878450978214494248436005312    13806578438285408489192397678281108471314184923233457468    17804449024048173578354447480092595789103746281426716578    20709867657428112733788596517421662706971277384850186202    26706673536072260367531671220138893683655619422140074867    27613156876570816978384795356562216942628369846466914936    35608898048096347156708894960185191578207492562853433156    37700024611323481637388108590397409204444509743557913291    41419735314856225467577193034843325413942554769700372404    53413347072144520735063342440277787367311238844280149734    55226313753141633956769590713124433885256739692933829872    71217796096192694313417789920370383156414985125706866312    75400049222646963274776217180794818408889019487115826582    82839470629712450935154386069686650827885109539400744808    106826694144289041470126684880555574734622477688560299468    110452627506283267913539181426248867770513479385867659744    113100073833970444912164325771192227613333529230673739873    142435592192385388626835579840740766312829970251413732624    150800098445293926549552434361589636817778038974231653164    165678941259424901870308772139373301655770219078801489616    213653388288578082940253369761111149469244955377120598936    220905255012566535827078362852497735541026958771735319488    226200147667940889824328651542384455226667058461347479746    284871184384770777253671159681481532625659940502827465248    301600196890587853099104868723179273635556077948463306328    331357882518849803740617544278746603311540438157602979232    427306776577156165880506739522222298938489910754241197872    452400295335881779648657303084768910453334116922694959492    569742368769541554507342319362963065251319881005654930496    603200393781175706198209737446358547271112155896926612656    662715765037699607481235088557493206623080876315205958464    854613553154312331761013479044444597876979821508482395744    904800590671763559297314606169537820906668233845389918984    1206400787562351412396419474892717094542224311793853225312    1709227106308624663522026958088889195753959643016964791488    1809601181343527118594629212339075641813336467690779837968    2412801575124702824792838949785434189084448623587706450624    3619202362687054237189258424678151283626672935381559675936    5617303667087198763970828179969213971462231951790129080359    7238404725374108474378516849356302567253345870763119351872    11234607334174397527941656359938427942924463903580258160718    16851911001261596291912484539907641914386695855370387241077    22469214668348795055883312719876855885848927807160516321436    33703822002523192583824969079815283828773391710740774482154    44938429336697590111766625439753711771697855614321032642872    67407644005046385167649938159630567657546783421481548964308    89876858673395180223533250879507423543395711228642065285744    134815288010092770335299876319261135315093566842963097928616    179753717346790360447066501759014847086791422457284130571488    269630576020185540670599752638522270630187133685926195857232    359507434693580720894133003518029694173582844914568261142976    539261152040371081341199505277044541260374267371852391714464    1078522304080742162682399010554089082520748534743704783428928    6414488540731361226607730496888035255996436684289152125202372832747357    12828977081462722453215460993776070511992873368578304250404745665494714    19243465622194083679823191490664105767989310052867456375607118498242071    25657954162925444906430921987552141023985746737156608500809491330989428    38486931244388167359646382981328211535978620105734912751214236996484142    51315908325850889812861843975104282047971493474313217001618982661978856    76973862488776334719292765962656423071957240211469825502428473992968284    102631816651701779625723687950208564095942986948626434003237965323957712    153947724977552669438585531925312846143914480422939651004856947985936568    205263633303403559251447375900417128191885973897252868006475930647915424    307895449955105338877171063850625692287828960845879302009713895971873136    410527266606807118502894751800834256383771947794505736012951861295830848    615790899910210677754342127701251384575657921691758604019427791943746272    955758792568972822764551844036317253143469065959083666655153552079356193    1231581799820421355508684255402502769151315843383517208038855583887492544    1911517585137945645529103688072634506286938131918167333310307104158712386    2867276377706918468293655532108951759430407197877250999965460656238068579    3823035170275891291058207376145269012573876263836334666620614208317424772    4047542269201488933989477943536350246533751547786454991002697257463582267    5734552755413836936587311064217903518860814395754501999930921312476137158    7646070340551782582116414752290538025147752527672669333241228416634849544    8095084538402977867978955887072700493067503095572909982005394514927164534    11469105510827673873174622128435807037721628791509003999861842624952274316    12142626807604466801968433830609050739601254643359364973008091772390746801    15292140681103565164232829504581076050295505055345338666482456833269699088    16190169076805955735957911774145400986135006191145819964010789029854329068    22938211021655347746349244256871614075443257583018007999723685249904548632    24285253615208933603936867661218101479202509286718729946016183544781493602    30584281362207130328465659009162152100591010110690677332964913666539398176    32380338153611911471915823548290801972270012382291639928021578059708658136    45876422043310695492698488513743228150886515166036015999447370499809097264    48570507230417867207873735322436202958405018573437459892032367089562987204    61168562724414260656931318018324304201182020221381354665929827333078796352    64760676307223822943831647096581603944540024764583279856043156119417316272    91752844086621390985396977027486456301773030332072031998894740999618194528    97141014460835734415747470644872405916810037146874919784064734179125974408    129521352614447645887663294193163207889080049529166559712086312238834632544    183505688173242781970793954054972912603546060664144063997789481999236389056    194282028921671468831494941289744811833620074293749839568129468358251948816    259042705228895291775326588386326415778160099058333119424172624477669265088    388564057843342937662989882579489623667240148587499679136258936716503897632    603083798111021851164432213586916186733528980620181793659401891362073757783    777128115686685875325979765158979247334480297174999358272517873433007795264    1206167596222043702328864427173832373467057961240363587318803782724147515566    1809251394333065553493296640760748560200586941860545380978205674086221273349    2412335192444087404657728854347664746934115922480727174637607565448295031132    3618502788666131106986593281521497120401173883721090761956411348172442546698    4824670384888174809315457708695329493868231844961454349275215130896590062264    7237005577332262213973186563042994240802347767442181523912822696344885093396    9649340769776349618630915417390658987736463689922908698550430261793180124528    14474011154664524427946373126085988481604695534884363047825645392689770186792    19298681539552699237261830834781317975472927379845817397100860523586360249056    28948022309329048855892746252171976963209391069768726095651290785379540373584    38597363079105398474523661669562635950945854759691634794201721047172720498112    57896044618658097711785492504343953926418782139537452191302581570759080747168    

1192115792089237316195423570985008687907852837564279074904382605163141518161494336

  1. Формула для вычисления множителей-делителей для точек, кратных числу, на которое N-1 не делится нацело мне неизвестна. Если кто рассчитает, будет интересно посмотреть. Например для точек, приватный ключ которых кратен пяти, множитель-делитель:

46316835694926478169428394003475163141135025711629961753042065256607264597735

▲ 0
from ecdsa import SECP256k1

G = SECP256k1.generator
n = SECP256k1.order

#set P = 3G
P = 3 * G
print(f'Px={hex(P.x())[2:]}')
print(f'Py={hex(P.y())[2:]}')

#div Q = P/2
i2 = pow(2, -1, n)
Q = i2 * P
print(f'i2={hex(i2)[2:]}')
print(f'Qx={hex(Q.x())[2:]}')
print(f'Qy={hex(Q.y())[2:]}')

#check P = 2Q
checkP = 2 * Q
print('check')
print(f'Px={hex(checkP.x())[2:]}')
print(f'Py={hex(checkP.y())[2:]}')