Puncte:1

Câteva întrebări despre funcționalitățile curbelor eliptice

drapel tv

Am învățat despre curbele eliptice și cum funcționează ele și despre utilizarea lor în criptografie și încerc să îmi dau seama cum să le folosesc folosind Go.

  1. Unde este parametrul „a” din ecuația mea ECC y^2 = x^3 + a*x + b, în ​​această structură CurveParams? https://golang.org/pkg/crypto/elliptic/#CurveParams Pentru a verifica dacă am înțeles bine, corectați-mă dacă greșesc:
  • Parametrul „P” reprezintă ordinea câmpului finit
  • „N” este numărul prim minim astfel încât rezultatul N*G este punctul infinit
  • „B” este constanta „b” în ecuația mea ECC
  • „Gx”, „Gy” reprezintă punctul de bază (care, de exemplu, este folosit pentru calcularea cheilor publice folosind cheia privată aleasă și înmulțirea acesteia cu G, sau în exemplul de mai sus în care N*G este folosit pentru a calcula punctul infinit)
  • „BitSize” aici nu sunt sigur ce reprezintă de fapt.Înțeleg că în curba P256 (secp256k1 BTC) aceasta este egală cu 256 și deci reprezintă lungimea cheii private. Ceea ce nu înțeleg este de unde în matematică apare de fapt acest număr? Sau este de fapt doar lungimea binară a lui „P”?
  • Cea mai mare întrebare aici este unde este parametrul „a” din ecuația curbei eliptice? Cum pot fi definite de fapt curbele eliptice dacă nu decid acest parametru?
  1. Ce se întâmplă dacă utilizați funcția Double() folosind un punct care nu se află pe curbă sau folosind punctul infinit? Am încercat să caut un punct care nu se găsește pe curbă pentru a apela funcția cu el, dar nu am găsit niciunul (pentru curba P256, am căutat pe google) https://golang.org/pkg/crypto/elliptic/#CurveParams.Double

  2. Ce se întâmplă dacă utilizați funcția Add() folosind puncte care nu sunt pe curbă sau folosind punctul infinit + pe punctul curbei sau punctul infinit + nu pe punctul curbei? https://golang.org/pkg/crypto/elliptic/#CurveParams.Add

  3. De ce sunt returnate cheile private în tipuri de octeți? Care este treaba cu tipul de octet? Văd că este folosit în multe locuri. De ce nu folosim tipul big int? Văd că sunt folosite în GenerateKey(), Marshal(), MarshalCompressed(), UnmarshalCompressed(), ScalarBaseMult(), ScalarMult().

Pentru toate intrebarile de mai sus ma intereseaza si din punct de vedere matematic si programare, dar mai ales programare. Dacă nu aveți răspunsurile pentru toate, vă rugăm să furnizați orice răspuns la orice întrebare la care aveți răspuns/e.

EDITAȚI | ×:

  • la întrebarea 1 răspuns parțial. BitSize încă mai trebuie explicat
Ievgeni avatar
drapel cn
Din câte am înțeles, [] octeții pot reprezenta un întreg de mărime arbitrară. Alegerea aici pare să nu limiteze dimensiunea întregului în ScalarMult, deoarece este bine definită pentru orice număr întreg pozitiv. Și teoretic, pentru unele curbe specifice; ordinea grupului poate fi mai mare decât ordinea câmpului de bază, atunci este posibil ca big_int să nu fie suficient de mare pentru a reprezenta cheia privată.
thebalkandude avatar
drapel tv
@levegni ok, are sens.
President James K. Polk avatar
drapel sh
nu, tipul big.Int poate reprezenta, de asemenea, un număr întreg de dimensiuni arbitrare. Motivul utilizării octeților pentru a reprezenta valori este clar în documentația pentru Marshall etc. Există formate standard pentru interschimb care sunt definite în termeni de octeți, deoarece octeții (de fapt „octeții” sunt mai precis) sunt unitatea standard de stocare și transmisie prin rețea. În ceea ce privește motivul pentru care ScalarMult și similare folosesc forma []byte, ar trebui să întrebați programatorul, dar probabil că au crezut că ar fi mai convenabil. Tipul big.Int are metode de conversie la și de la []byte, așa că în practică nu este o problemă.
kelalaka avatar
drapel in
Se pare că vă temeți de [atacul punctual invalid](https://crypto.stackexchange.com/q/87709/18298). Validarea este necesară. Cheia privată este un întreg mare care este stocat ca obiect octet.Nu vă faceți griji, biblioteca se ocupă de asta pentru dvs. și [conversia este ușoară](https://stackoverflow.com/questions/24757814/golang-convert-byte-array-to-big-int).
Puncte:1
drapel cn

Pentru că cunoașteți un punct al curbei (punctul de bază). poti calcula $a$ :

$$a = \frac{(Gy)^2 -(Gx)^3 -b}{Gx} \mod p$$

Observați că acest calcul necesită $Gx \neq 0 \mod p$.

Despre punctul infinit: Se presupune că punctul infinit este elementul neutru, apoi prin definiția elementului neutru: $(x,y)+\mathcal{O}=\mathcal{O}+(x,y) = (x,y)$, implică astfel că $2\mathcal{O}=\mathcal{O}$

Și astfel, dublu($\mathcal{O}$) vă va returna același punct $\mathcal{O}$. Și din același motiv, Adaugă$(\mathcal{O}, \cdot)$, Adăuga$(\cdot, \mathcal{O})$ sunt ambele funcția de identitate pentru mulțimea punctelor curbei.

Nu ar trebui să utilizați funcțiile pe puncte care nu sunt în curbă, așa că presupun că ar trebui să returneze o eroare, dacă faceți asta (altfel ar trebui).

thebalkandude avatar
drapel tv
ok, așa că asta răspunde parțial la primele mele 3 întrebări
poncho avatar
drapel my
„Nu ar trebui să utilizați funcțiile pe puncte care nu sunt în curbă, așa că presupun că ar trebui să returneze o eroare” - rutinele ECC, în general, nu o fac. Da, ei *ar putea* verifica; cu toate acestea, timpul care ar dura ar fi o fracțiune semnificativă din timpul de adăugare a punctelor, prin urmare, în general, nu se deranjează pentru rezultate intermediare. Chiar ar trebui să verifice când importați inițial valorile (și când știu că valorile inițiale sunt pe curbă, vor fi și toate cele intermediare); din experiența mea, chiar și asta nu este universal

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.