Author

Topic: curve ellittiche e algoritmo ECDSA (Read 25483 times)

legendary
Activity: 2506
Merit: 1120
March 29, 2020, 02:09:02 PM
#85

Prova nei form google se funziona il codice:
...

Ma dove dovrei mettere questo codice? Nelle google form si possono inserire il link di una immagine o di un video, dove lo metto del codice?
Dove scrivi il testo della domanda?
NB: dubito che google possa permettere di inserire codice html ma tentar non nuoce.
Prova anche a vedere se https://www.sinapsi.org/wordpress/2015/02/13/come-inserire-espressioni-matematiche-nei-documenti-google/ funziona anche dove servono a te le formule.
Io non ho provato.
legendary
Activity: 1914
Merit: 2071
March 29, 2020, 01:46:39 PM
#84

Prova nei form google se funziona il codice:
...

Ma dove dovrei mettere questo codice? Nelle google form si possono inserire il link di una immagine o di un video, dove lo metto del codice?
legendary
Activity: 2506
Merit: 1120
March 29, 2020, 01:35:10 PM
#83
...
Ma rimane il problema: come introdurre queste formule in situazioni 'chiuse' ?
Certo che il modo più elegante sarebbe scrivere un documento in LaTeX, fare un pdf e poi diffonderlo.
Ma molto spesso mi serve solo la possibilità di inserire alcune formule in ambienti nei quali non ho molta libertà di manovra. Non è che posso scrivere un file pdf ogni volta che voglio comunicare 2 formule su un post di bitcointalk  Smiley
Prova nei form google se funziona il codice:
Code:

  x
  =
 
   
     
       
        b
        ±
       
         
            b
            2
         

         
          4
          a
          c
       

     

     
        2
        a
     

   

 

  .

Lo ottieni con mouse di destra sulla formula (dal browser).
Qui' non funziona!
legendary
Activity: 1914
Merit: 2071
March 29, 2020, 01:12:16 PM
#82
Devo segnalarti che il trasformare codice ascii in immagine è una pratica non proprio adeguata alla diffusione di informazioni.
Io lo sconsiglio. Capisco che sia piu' semplce per te ma non la trovo una soluzione.


Non ho detto che è una soluzione.

Semplicemente il problema è come far apparire delle formule leggibili in contesti "sfavorevoli" come questo forum o i moduli di google. In questi casi non ho trovato altro che convertire latex in immagini.


Con il codice che tu mi hai linkato

Code:



MathJax TeX Test Page




When \(a \ne 0\), there are two solutions to \(ax^2 + bx + c = 0\) and they are
$$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$



ho fatto una pagina html che viene letta perfettamente dal mio browser.

Ma rimane il problema: come introdurre queste formule in situazioni 'chiuse' ?
Certo che il modo più elegante sarebbe scrivere un documento in LaTeX, fare un pdf e poi diffonderlo.
Ma molto spesso mi serve solo la possibilità di inserire alcune formule in ambienti nei quali non ho molta libertà di manovra. Non è che posso scrivere un file pdf ogni volta che voglio comunicare 2 formule su un post di bitcointalk  Smiley

E inoltre, dove lo metto questo file se voglio che rimanga pubblico? Alla fine tanto vale fare un'immagine collegato a un sito terzo. Sicuramente non si tratta di una soluzione elegante.
legendary
Activity: 2506
Merit: 1120
March 29, 2020, 12:29:26 PM
#81
...
Diciamo allora che per adesso ho trovato un modo per fare finta di importare LaTex nel forum  Smiley



Devo segnalarti che il trasformare codice ascii in immagine è una pratica non proprio adeguata alla diffusione di informazioni.
Io lo sconsiglio. Capisco che sia piu' semplce per te ma non la trovo una soluzione.
legendary
Activity: 1914
Merit: 2071
March 28, 2020, 06:16:41 PM
#79
...
Io pensavo ad una soluzione tipo questa:
http://jsbin.com/?html,output
In pratica basta una libreria js ma, permettere codice particolare potrebbe mettere a rischio la sicurezza del sito quindi suppongo non lo faranno mai su questo forum.

Se clicchi con tasto destro del mouse sulla formula puoi copiare un codice MathML (qui' ho provato e non funziona), magari funziona nei moduli google ...

Ho visto una libreria JS che si attivava con il $ $. Funziona in questa chat: https://hack.chat/ sembra essere https://katex.org/ (ma non ho approfondito).

Trovo noioso creare una immagine da hostare su un server terzo per creare un documento. Per il momento, non ho formule da scrivere quindi non ho sperimentato piu' di tanto.

Sicuramente laTex è la soluzione, ti consiglio anche xcas (Algebra software) che oltre a fare tante cose carine ti crea il LaTex delle equazioni che è anche in grado di risolvere, poi c'è geogebra che mangia testi in LaTex da mettere come etichette a grafici e disegni ...

Ho visto librerie js che ti fanno il pdf a partire la testo LaTex.

Grazie dei consigli, farò delle prove.

Diciamo allora che per adesso ho trovato un modo per fare finta di importare LaTex nel forum  Smiley

legendary
Activity: 2506
Merit: 1120
March 28, 2020, 06:09:59 PM
#78
...
Io pensavo ad una soluzione tipo questa:
http://jsbin.com/?html,output
In pratica basta una libreria js ma, permettere codice particolare potrebbe mettere a rischio la sicurezza del sito quindi suppongo non lo faranno mai su questo forum.

Se clicchi con tasto destro del mouse sulla formula puoi copiare un codice MathML (qui' ho provato e non funziona), magari funziona nei moduli google ...

Ho visto una libreria JS che si attivava con il $ $. Funziona in questa chat: https://hack.chat/ sembra essere https://katex.org/ (ma non ho approfondito).

Trovo noioso creare una immagine da hostare su un server terzo per creare un documento. Per il momento, non ho formule da scrivere quindi non ho sperimentato piu' di tanto.

Sicuramente laTex è la soluzione, ti consiglio anche xcas (Algebra software) che oltre a fare tante cose carine ti crea il LaTex delle equazioni che è anche in grado di risolvere, poi c'è geogebra che mangia testi in LaTex da mettere come etichette a grafici e disegni ...

Ho visto librerie js che ti fanno il pdf a partire la testo LaTex.


legendary
Activity: 1914
Merit: 2071
March 28, 2020, 05:27:00 PM
#77
Grande!
Non lo trovo comodo ma fattibile.
L'ideale sarebbe avere una libreria js dove il codice lo inserisci direttamente tra caratteri $$ e viene parsato dal js, ma vai a spiegarlo all'amministratore di questo forum Sad

Io al momento sto usando questo metodo per scrivere formule in LateX dove mi serve, anche nei moduli di google per fare i quiz online. Lì si usa il formato png invece di svg.

EDIT: il modo più rapido è scrivere direttamente tutto (testo e formule) sul sito codecogs e poi importare qui una sola volta il risultato finale:






legendary
Activity: 2506
Merit: 1120
March 28, 2020, 12:52:21 PM
#76
Si potrebbe chiedere agli admin del forum se possono abilitare qualcosa per scrivere equazioni matematiche.
L'html lo prevede ma nel forum non funzionano ...

https://www.tutorialspoint.com/html5/html5_mathml.htm

Potresti anche scrivere queste perle in un documento LaTex o, anche solo, in writer e pubblicare il pdf.

Ringrazio per le "perle" ma non esageriamo.

Ovviamente sarebbe l'ideale riscrivere tutto in LaTex, ma diventerebbe ai miei occhi tutto troppo professionale, alla fine mi va bene scrivere le cose man mano che mi vengono in mente senza dovermi preoccupare troppo della forma. Si tratta di spunti, voglio buttare giù delle idee che possono tornare utili a me e a chi legge, non voglio scrivere un trattato o qualcosa di livello accademico, certo sarebbe comodo se il forum permettesse di inserire formule matematiche, ma qui hanno pensato solo a come inserire pezzi di codice, pazienza.


Grande!
Non lo trovo comodo ma fattibile.
L'ideale sarebbe avere una libreria js dove il codice lo inserisci direttamente tra caratteri $$ e viene parsato dal js, ma vai a spiegarlo all'amministratore di questo forum Sad

Ho segnalato al moderatore invitandolo ad intervenire ... vedremo, non credo siano solo gli italiani ad aver bisogno di rigore scientifico.

Segnalo che ho trovato, in questi tempi di didattica a distanza forzata, un modo per scrivere formule leggibili sotto forma di immagini SVG (Scalable Vector Graphics). Ho appena verificato che funziona anche all'interno del nostro vecchio e amato forum.

Il risultato lo lascio giudicare a voi, ecco alcuni esempi:









Si può inserire l'espressione matematica in mezzo a una frase e cambiare anche il font:   (in quest'ultimo caso ho scelto Verdana anziché Latin Modern)

Il trucco:

  • andate qui -> https://www.codecogs.com/latex/eqneditor.php
  • digitate la vostra espressione matematica
  • scegliete l'opzione svg anziché gif
  • copiate in basso il codice che si autogenera nella casella "URL Encoded"
  • qui sul forum: insert image
  • incollate il codice tra i due tag  img  e /img

legendary
Activity: 1914
Merit: 2071
March 28, 2020, 12:03:26 PM
#75
Si potrebbe chiedere agli admin del forum se possono abilitare qualcosa per scrivere equazioni matematiche.
L'html lo prevede ma nel forum non funzionano ...

https://www.tutorialspoint.com/html5/html5_mathml.htm

Potresti anche scrivere queste perle in un documento LaTex o, anche solo, in writer e pubblicare il pdf.

Ringrazio per le "perle" ma non esageriamo.

Ovviamente sarebbe l'ideale riscrivere tutto in LaTex, ma diventerebbe ai miei occhi tutto troppo professionale, alla fine mi va bene scrivere le cose man mano che mi vengono in mente senza dovermi preoccupare troppo della forma. Si tratta di spunti, voglio buttare giù delle idee che possono tornare utili a me e a chi legge, non voglio scrivere un trattato o qualcosa di livello accademico, certo sarebbe comodo se il forum permettesse di inserire formule matematiche, ma qui hanno pensato solo a come inserire pezzi di codice, pazienza.


Ho segnalato al moderatore invitandolo ad intervenire ... vedremo, non credo siano solo gli italiani ad aver bisogno di rigore scientifico.

Segnalo che ho trovato, in questi tempi di didattica a distanza forzata, un modo per scrivere formule leggibili sotto forma di immagini SVG (Scalable Vector Graphics). Ho appena verificato che funziona anche all'interno del nostro vecchio e amato forum.

Il risultato lo lascio giudicare a voi, ecco alcuni esempi:









Si può inserire l'espressione matematica in mezzo a una frase e cambiare anche il font:   (in quest'ultimo caso ho scelto Verdana anziché Latin Modern)

Il trucco:

  • andate qui -> https://www.codecogs.com/latex/eqneditor.php
  • digitate la vostra espressione matematica
  • scegliete l'opzione svg anziché gif
  • copiate in basso il codice che si autogenera nella casella "URL Encoded"
  • qui sul forum: insert image
  • incollate il codice tra i due tag  img  e /img
member
Activity: 813
Merit: 65
October 11, 2019, 06:37:57 AM
#74
è una bella trattazione, complimenti.
hero member
Activity: 784
Merit: 1416
February 03, 2019, 02:43:54 AM
#73
Ho segnalato al moderatore invitandolo ad intervenire ... vedremo, non credo siano solo gli italiani ad aver bisogno di rigore scientifico.

Sarebbe la cosa migliore, ma temo non sia una priorità o comunque una cosa lunga.

Ad ogni modo viene usata per l'appunto su questo forum (da anni ormai) e funziona perfettamente, esempio: https://www.matematicamente.it/forum/viewtopic.php?f=19&t=197194
legendary
Activity: 2506
Merit: 1120
February 02, 2019, 12:30:02 PM
#72
Si potrebbe chiedere agli admin del forum se possono abilitare qualcosa per scrivere equazioni matematiche.
L'html lo prevede ma nel forum non funzionano ...

https://www.tutorialspoint.com/html5/html5_mathml.htm

Potresti anche scrivere queste perle in un documento LaTex o, anche solo, in writer e pubblicare il pdf.

Ringrazio per le "perle" ma non esageriamo.

Ovviamente sarebbe l'ideale riscrivere tutto in LaTex, ma diventerebbe ai miei occhi tutto troppo professionale, alla fine mi va bene scrivere le cose man mano che mi vengono in mente senza dovermi preoccupare troppo della forma. Si tratta di spunti, voglio buttare giù delle idee che possono tornare utili a me e a chi legge, non voglio scrivere un trattato o qualcosa di livello accademico, certo sarebbe comodo se il forum permettesse di inserire formule matematiche, ma qui hanno pensato solo a come inserire pezzi di codice, pazienza.


Ho segnalato al moderatore invitandolo ad intervenire ... vedremo, non credo siano solo gli italiani ad aver bisogno di rigore scientifico.
legendary
Activity: 1914
Merit: 2071
February 02, 2019, 07:46:40 AM
#71
Si potrebbe chiedere agli admin del forum se possono abilitare qualcosa per scrivere equazioni matematiche.
L'html lo prevede ma nel forum non funzionano ...

https://www.tutorialspoint.com/html5/html5_mathml.htm

Potresti anche scrivere queste perle in un documento LaTex o, anche solo, in writer e pubblicare il pdf.

Ringrazio per le "perle" ma non esageriamo.

Ovviamente sarebbe l'ideale riscrivere tutto in LaTeX, ma diventerebbe ai miei occhi tutto troppo professionale, alla fine mi va bene scrivere le cose man mano che mi vengono in mente senza dovermi preoccupare troppo della forma. Si tratta di spunti, voglio buttare giù delle idee che possono tornare utili a me e a chi legge, non voglio scrivere un trattato o qualcosa di livello accademico, certo sarebbe comodo se il forum permettesse di inserire formule matematiche, ma qui hanno pensato solo a come inserire pezzi di codice, pazienza.

legendary
Activity: 2506
Merit: 1120
February 01, 2019, 08:17:08 PM
#70
Se ti interessa e hai voglia, potresti usare questi tool che creano direttamente immagini dalle varie formule e operazioni (usano Latex come formato) così diventa più facile leggerle, magari non per tutto ma per alcune parti più importanti:

http://rogercortesi.com/eqn/index.php
http://www.sciweavers.org/free-online-latex-equation-editor

Le immagini create poi vanno caricate su qualche image hosting

Grazie per i link, in effetti sarebbe meglio, bisogna solo trovare tempo e voglia Smiley
Si potrebbe chiedere agli admin del forum se possono abilitare qualcosa per scrivere equazioni matematiche.
L'html lo prevede ma nel forum non funzionano ...

https://www.tutorialspoint.com/html5/html5_mathml.htm

Potresti anche scrivere queste perle in un documento LaTex o, anche solo, in writer e pubblicare il pdf.

legendary
Activity: 1914
Merit: 2071
February 01, 2019, 01:27:11 PM
#69
Se ti interessa e hai voglia, potresti usare questi tool che creano direttamente immagini dalle varie formule e operazioni (usano Latex come formato) così diventa più facile leggerle, magari non per tutto ma per alcune parti più importanti:

http://rogercortesi.com/eqn/index.php
http://www.sciweavers.org/free-online-latex-equation-editor

Le immagini create poi vanno caricate su qualche image hosting

Grazie per i link, in effetti sarebbe meglio, bisogna solo trovare tempo e voglia Smiley
hero member
Activity: 784
Merit: 1416
February 01, 2019, 02:43:06 AM
#68
Se ti interessa e hai voglia, potresti usare questi tool che creano direttamente immagini dalle varie formule e operazioni (usano Latex come formato) così diventa più facile leggerle, magari non per tutto ma per alcune parti più importanti:

http://rogercortesi.com/eqn/index.php
http://www.sciweavers.org/free-online-latex-equation-editor

Le immagini create poi vanno caricate su qualche image hosting
legendary
Activity: 1914
Merit: 2071
January 31, 2019, 02:35:16 PM
#67
Parliamo un po' più a fondo di endomorfismi, vediamo da dove nascono i valori beta di cui ho parlato un paio di post sopra e cerchiamo così di entrare più a fondo nel mondo delle curve ellittiche (sempre privilegiando la nostra curva secp256k1).

ENDOMORFISMI

Una mappa f: E -> E si dice un ENDOMORFISMO (endomorfismo di E sul campo Fp) se

1) manda il punto all'infinito di E nel punto all'infinito di E

2) f(P) = (g(P),h(P)) per tutti i punti P di E, dove g e h sono funzioni razionali (rapporto tra 2 polinomi) i cui coefficienti sono nel campo Fp.

In pratica facendo una serie di operazioni - g - sul punto P (cioè sulla sua x e sulla sua y) si ottiene la x di un nuovo punto, il punto f(P), analogamente facendo un'altra serie di operazioni - h - sulle coordinate x e y di P si ottiene la y di f(P).

Questa mappa quindi consente di passare da un punto P della curva a un punto f(P) sempre della curva, facendo alcune operazioni particolari sulle x e y di P.

Un esempio semplice di mappa che soddisfa il requisito 2) ma non 1) è la mappa che prende P qualsiasi e aggiunge a P sempre lo stesso punto, chiamiamolo G.

f : P  -->  P+G  per ogni P di E

Questa mappa (una sorta di traslazione) è quella che viene usata in programmi tipo vanitygen per generare nella maniera più veloce possibile le chiavi pubbliche (tenendo traccia delle chiavi private, che vengono incrementate di 1 ad ogni iterazione).

Nell'ipotesi che P sia diverso da G e da O (punto all'infinito), questa mappa si compone delle seguenti due parti:

a) la x di f(P) = g(P) = ((yG - yP) / (xG -xP))^2 -xP -xG

b) la y di f(P) = h(P) = ((yG - yP) / (xG -xP)) * (xP - g(P)) - yP

ovvero la solita formule di addizione.

Però questa mappa manda O in O+G = G, e quindi non rispetta il primo criterio e non è un endomorfismo. Vedremo invece che la mappa:

f : P  --> k*P

che associa a ogni punto il suo prodotto per uno scalare k fissato è un endomorfismo.


Nel termine ENDOMORFISMO il prefisso ENDO significa INTERNO, il termine MORFISMO vuol dire che questa mappa rispetta la "forma" (struttura) algebrica di E, nel senso che sommare prima due punti in E e poi applicare la mappa f produce lo stesso risultato che applicare prima f ai due punti separatamente e poi sommare i risultati:

f(P1 + P2) = f(P1) + f(P2) per ogni P1, P2 in E.


Per fare un parallelo con un esempio più noto, la mappa

f : R -> R,  f(x) = ln(x)

si chiama OMOMORFISMO nel senso che traduce la struttura algebrica (operazione) della moltiplicazione in una struttura algebrica analoga, dello stesso tipo, cioè nella addizione:

ln(a*b) = ln(a) + ln(b)


In R se vogliamo costruire un ENDOMORFISMO che rispetti l'operazione di addizione possiamo farlo così:

f : R -> R   f(x) = k*x

k*(a+b) = k*a + k*b

(si noti il parallelismo con k*P delle curve ellittiche, dove k*(P1 + P2) = k*P1 + k*P2)

Nota: possono sembrare cose molto astratte, ma quanti sbagliano trattando la funzione x^2 o la funzione radice come fossero endomorfismi rispetto all'operazione di addizione!

(a + b)^2 = a^2 + b^2

radice (a + b) = radice(a) + radice(b)

mentre ovviamente x^2 e radice(x)  sono endomorfismi solo rispetto all'operazione di moltiplicazione.



Torniamo alle curve ellittiche.

Un endomorfismo f è una mappa da E a E che soddisfa certi requisiti, ovvero che manda punti di E in punti di E con l'unica avvertenza che il punto O va mandato nel punto O.

Si può verificare che un endomorfismo da E in E è sempre un omomorfismo di gruppo, ovvero che:

f(P1 + P2) = f(P1) + f(P2)

Esempi di endomorfismi da E in E

1) la moltiplicazione per uno scalare k fissato

la mappa f: P --> k*P è endomorfismo di E, è immediato verificare infatti che k*(P1 + P2) = k*P1 + k*P2

casi particolari della mappa appena vista si hanno per k = 1 (identità) e k = -1 (la mappa negazione, quella che associa ad ogni punto P il suo opposto -P, nel qual caso f è definita come (x,y) --> (x,-y) ).


2) la mappa f: (x,y) --> (beta*x, y)  dove beta è un elemento di ordine 3 di Fp (è una radice cubica di 1, questo si ha solo se p = 1 mod 3)

in quest'ultimo caso si ha quindi la possibilità di calcolare le coordinate di un nuovo punto in modo rapidissimo, con una sola moltiplicazione nel campo Fp. Se si applica 3 volte di seguito la mappa f appena descritta

P      -->   f(P) = P1  --> f(P1) = P2      --> f(P2) =  P

(x,y) --> (beta*x, y) --> (beta^2*x, y) --> (beta^3*x,y) = (x,y)

si vede che si torna sempre al punto dal quale si era partiti.  Quindi, ragionando senza le coordinate, si ha

P -> lambda * P -> lambda^2 * P -> lambda^3 * P = P   dove lambda è uno scalare di Zn

ovvero che lambda è un elemento di ordine 3 di Fn. Sottolineiamo che, quando si passa da un elemento P a un elemento P1 = f(P), si può sempre scrivere P1 come k*P, poichè ogni punto P diverso dal punto all'infinito genera ogni altro elemento di E, ovvero ogni punto P1 è multiplo di ogni altro punto P, per un opportuno fattore k.

Quindi di fatto la mappa 2) è un caso particolare della mappa 1), dove m = lambda e i calcoli sulle coordinate risultano particolarmente semplici (g(P) = beta*x, h(P) = y)


Piccola osservazione: sia p - 1 che n - 1 sono multipli di 3:

Code:
p - 1 = 115792 089237 316195 423570 985008 687907 853269 984665 640564 039457 584007 908834 671662 (78 digits) = 2 × 3 × 7 × 13441 × 205115 282021 455665 897114 700593 932402 728804 164701 536103 180137 503955 397371 (72 digits)

n - 1 = 115792 089237 316195 423570 985008 687907 852837 564279 074904 382605 163141 518161 494336 (78 digits) = 26 × 3 × 149 × 631 × 107361 793816 595537 × 174 723607 534414 371449 × 341 948486 974166 000522 343609 283189 (33 digits)


Come si fanno a calcolare gli elementi beta e lambda (rispettivamente elementi di ordine 3 di Zp e di Zn)?

Basta prendere un elemento a caso di Zp (Zn) ed elevarlo alla (p-1)/3 ((n-1/3)), si otterrà sicuramente un elemento di ordine 3, se non è uguale a 1 otterremo una delle due radici non banali dell'unità che stiamo cercando:

Code:
>>> hex(pow(19,(p-1)/3,p))  #proviamo prima con 19^((p-1)/3)

'0x1L'     #otteniamo 1, non va bene

>>> hex(pow(20,(p-1)/3,p)) #proviamo allora con 20^((p-1)/3)

'0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501eeL'  --> ok, questo è beta

>>> hex(pow(24,(p-1)/3,p))  #facendo altri tentativi, alla fine otteniamo con 24^((p-1)/3)

'0x851695d49a83f8ef919bb86153cbcb16630fb68aed0a766a3ec693d68e6afa40L'  --> questo lo chiamiamo beta2, poichè è = beta^2


Code:
>>> hex(pow(48,(n-1)/3,n))

'0x1L'

>>> hex(pow(49,(n-1)/3,n))  -->

'0x5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72L'  -->  abbiamo trovato lambda

>>> hex(pow(50,(n-1)/3,n))

'0xac9c52b33fa3cf1f5ad9e3fd77ed9ba4a880b9fc8ec739c2e0cfc810b51283ceL'   --> abbiamo trovato lambda2 = lambda^2


Facciamo un rapido controllo che la seguente mappa :

f:        P        --> lambda*P

         (x,y)   --> (beta*x, y)

sia verificata per P = G:

Code:
from micro_ecdsa import mul

>>> Gx = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
>>> Gy = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

>>> lamb = 0x5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72

>>> (Rx,Ry) = mul(lamb,Gx,Gy)   --> R = lambda * G

>>> hex(Rx)
'0xbcace2e99da01887ab0102b696902325872844067f15e98da7bba04400b88fcbL'

>>> hex(Ry)
'0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8L'  --> da notare che Ry = Gy !!!

>>> beta = 0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee

>>> hex((beta*Gx) % p)
'0xbcace2e99da01887ab0102b696902325872844067f15e98da7bba04400b88fcbL' --> beta * Gx = Rx !!!
legendary
Activity: 3570
Merit: 1985
January 22, 2019, 09:34:44 AM
#66
Avevo letto da qualche parte che la stessa cosa vale per altri tipi di anelli che non sono campi finiti, ad es. definendo:

Z'n = 0 U {a: 0 < a < n, MCD (a, n) = 1}

cioè anche con n che non è primo, se a ed n sono primi fra loro.


Z'p non so neanche se sia corretta come notazione, andavo un po' a memoria.


Trovata, intendevi questo (fonte: https://it.wikipedia.org/wiki/Gruppo_ciclico):

Quote
Gruppo delle unità

Le unità dell'anello Z/nZ  sono i numeri primi con n, ovvero i generatori del gruppo. Formano un gruppo con la moltiplicazione, di φ ( n )  elementi (vedi sopra), indicato generalmente come Zn^* .

Ad esempio, i gruppi Z6^*  = { 1 , 5 }  e Z8^*  = { 1 , 3 , 5 , 7 }  sono isomorfi rispettivamente a Z / 2 Z  e Z / 2 Z × Z / 2 Z.

In generale, Zn^*  è ciclico se e solo se n  è 2, 4 , p^k o 2 p^k  dove p  è un primo dispari e k ≥ 1.

In particolare, il gruppo Zp^* è ciclico con p − 1  elementi per ogni primo p. Più in generale, ogni sottogruppo finito del gruppo moltiplicativo di un campo è ciclico.

Io invece mi sono soffermato nella teoria di questo thread solo sui gruppi di cui si parla nell'ultima riga perchè il campo Fp della secp256k1 è esattamente di quella forma.

ho visto solo ora, grazie del riferimento!
legendary
Activity: 1914
Merit: 2071
January 20, 2019, 04:53:10 AM
#65
Preferisco inserire in questo post dedicato tutte le seguenti considerazioni, che si possono considerare un ulteriore approfondimento di questa sezione che ho comunque riveduto e ampliato a sua volta.

In questo post aggiungo qualche dettaglio anche pratico di calcolo sugli elementi di Fp, il campo delle coordinate che può essere visto (come tutti i campi finiti) sia come gruppo additivo che come gruppo moltiplicativo (tolto lo zero).


Poichè nel nostro caso Fp = Zp (campo delle classi dei resti della divisione degli interi per p), si ha che:

a) Fp è un gruppo ciclico di ordine p rispetto all'operazione di addizione
b) Fp - {0} è un gruppo ciclico di ordine p -1 rispetto all'operazione di moltiplicazione (si può dimostrare)

quindi per

a) si ha che a+a+a+a+a+a... = a*p = 0 mod p per ogni a di Fp
b) si ha che a*a*a*a*a ........... = a^(p-1) = 1 mod p per ogni a di Fp - {0}

La seconda relazione è quella che ci interessa.

Già Fermat aveva dimostrato un risultato pressochè equivalente:

per ogni numero primo p è sempre vera la relazione a^p - a = multiplo di k, ovvero a^p = a mod p  (piccolo teorema di Fermat)
 


1) Visto che il campo finito Fp è un gruppo ciclico (rispetto all'operazione di moltiplicazione) di ordine p - 1, si può utilizzare la relazione precedente per calcolare l'inverso di un elemento a diverso da 1:

a^(p-1) = 1   mod p   (a^(ordine) = 1)

quindi

a^(p-1) * a^(-1) = 1 * a^(-1) =  a^(-1) mod p

Quindi a^(p-2) = a^(-1) mod p

Ad esempio per calcolare l'inverso di 4 in F_ 7 basta fare 4^(7-2)  = 2  mod 7  e infatti  4*2 = 1 mod 7 (effettivamente 2 è l'inverso di 4 in F_7).

Sia nella mia prima versione della libreria micro_ecdsa che nella libreria secp256k1 si utilizza questo metodo (ovviamente nella libreria secp256k1 c'è un'ottimizzazione per la quale si è riusciti a minimizzare il numero di moltiplicazioni necessarie per ottenere a^(p-2) ricorrendo agli elevamenti al quadrato, un po' come nel caso della moltiplicazione (addizione ripetuta) per uno scalare si utilizzano i raddoppi dei punti per fare meno addizioni possibili.


2)  E' possibile anche ricavare la radice quadrata di b = a^2.

Infatti se p = 3 mod 4 (come succede effettivamente nella secp256k1), allora p + 1 è un multiplo di 4, e quindi:

a^p = a   mod p
 
a^(p+1) = a^2    mod p

a^((p+1)/4) = a^1/2 = sqrt(a)  mod p

Code:
>>> p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f

>>> p % 4
3


>>> a = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798

>>> a1 = pow(a, (p+1)/4, p) #sqrt(b)
>>> print(hex(a1))
0xcb6dfbd6cdf31164bbeb3052460c1fa3f827f01d6e7fb5f69580cfb96560c16a

>>> (a1 * a1)-a  % p    #verifica
0

>>> a2 = p-a  #a2 = -a1  trovo l'altra radice
>>> print(hex(a2))
0x34920429320cee9b4414cfadb9f3e05c07d80fe291804a096a7f30459a9f3ac5

>>> (a2 * a2)-a  % p  #verifica
0

Questa è l'implementazione di questa funzione nella libreria secp256k1. In quella libreria quando ci si riferisce a un'operazione definita su un elemento del campo delle coordinate si usa la sillaba 'fe' = field element , quando invece ci si riferisce a un'operazione sui punti della curva si usa la sillaba 'ge' = group element come succede ad esempio qui nell'implementazione della funzione che somma due punti della curva.
legendary
Activity: 1914
Merit: 2071
January 18, 2019, 01:26:04 PM
#64
Avevo letto da qualche parte che la stessa cosa vale per altri tipi di anelli che non sono campi finiti, ad es. definendo:

Z'n = 0 U {a: 0 < a < n, MCD (a, n) = 1}

cioè anche con n che non è primo, se a ed n sono primi fra loro.


Z'p non so neanche se sia corretta come notazione, andavo un po' a memoria.


Trovata, intendevi questo (fonte: https://it.wikipedia.org/wiki/Gruppo_ciclico):

Quote
Gruppo delle unità

Le unità dell'anello Z/nZ  sono i numeri primi con n, ovvero i generatori del gruppo. Formano un gruppo con la moltiplicazione, di φ ( n )  elementi (vedi sopra), indicato generalmente come Zn^* .

Ad esempio, i gruppi Z6^*  = { 1 , 5 }  e Z8^*  = { 1 , 3 , 5 , 7 }  sono isomorfi rispettivamente a Z / 2 Z  e Z / 2 Z × Z / 2 Z.

In generale, Zn^*  è ciclico se e solo se n  è 2, 4 , p^k o 2 p^k  dove p  è un primo dispari e k ≥ 1.

In particolare, il gruppo Zp^* è ciclico con p − 1  elementi per ogni primo p. Più in generale, ogni sottogruppo finito del gruppo moltiplicativo di un campo è ciclico.

Io invece mi sono soffermato nella teoria di questo thread solo sui gruppi di cui si parla nell'ultima riga perchè il campo Fp della secp256k1 è esattamente di quella forma.
legendary
Activity: 1914
Merit: 2071
January 17, 2019, 04:04:47 PM
#63
Ho un'altra domanda... Immagino non sia un caso che il rislutato di "x^3+7 mod 11" siano tutti valori diversi, da cosa dipende?
se ho capito bene la tua domanda è:

perchè la funzione f definita da F_11 a F_11 in questo modo:

    F_11  -->   F_11

f:     x     -->   x^3 + 7

è iniettiva?

Risposta: questa funzione è iniettiva a seconda del valore di p in Fp (lo è nel caso di F_11, non lo è nel caso di Fp della secp256k1)



Una funzione f di A in B si dice iniettiva se

x1 != x2  --> f(x1) != f(x2)  per ogni coppia di valori x1, x2 in A

o equivalentemente se:

f(x1) = f(x2) --> x1 = x2  

Osservazione:

Supponiamo che f(x1) = f(x2), e cioè che  (x1)^3 + 7 = (x2)^3 + 7 mod 11, allora (x1)^3 = (x2)^3 mod 11 (per il primo principio di equivalenza delle equazioni).

Quindi ( x1 / x2 ) ^3 = 1 mod 11

Ora consideriamo l'equazione x^3 = 1 mod 11 (dove x = x1/x2). Quante soluzioni può avere?

Sicuramente ha come possibilità x = 1, ovvero x1 = x2. Quindi se l'equazione x^3 = 1 mod 11 ha come unica soluzione x = 1 allora la funzione f(x) = x^3 + 7 è iniettiva, altrimenti no.

Se infatti esistessero altre radici cubiche dell'unità, che chiameremo beta, ci sarebbero altre possibilità:

tipo beta^3 = 1 mod 11 (con beta diverso da 1) e quindi (x1/x2) = beta -->  x1 = beta * x2 mod 11 ed entrambi i valori x1 e x2 alla terza sarebbero uguali!

Ora si può dimostrare che se il numero primo 'p' di Fp è congruente a 1 mod 3 (ovvero se p = 1 mod 3) allora ci sono ben 3 diversi elementi x che vengono mappati nella stessa y (questa proprietà del campo delle coordinate induce una proprietà particolare nel gruppo dei punti che si costruiscono a partire da queste coordinate, si parla di endomorfismi, un legame particolare tra i punti della curva).

Questo è proprio il caso della p della secp256k1, quindi nel campo delle coordinate della curva utilizzata da Bitcoin esistono 3 numeri: 1, beta1, beta2 che elevati alla terza fanno 1 mod p, questo fa sì che per ogni possibile risultato y = x^3 + 7 mod p vi siano ben 3 valori di x possibili, detta in altri termini

se x --> y
allora anche

beta1*x --> y
beta2*x --> y

quindi i punti della curva secp256k1 si suddividono in gruppi da tre punti che condividono la stessa ordinata:

Code:
(x,y), (beta1*x, y), (beta2*x, y)

dove

beta1 = 0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee #  (beta1^3 = 1 mod p)
beta2 = 0x851695d49a83f8ef919bb86153cbcb16630fb68aed0a766a3ec693d68e6afa40 #  (beta2 = beta1^2, beta2^3 = 1 mod p)

sfruttare questa proprietà della curva accelera enormemente i calcoli (se l'obiettivo è generare il più velocemente possibile i punti della curva).

Nota bene:

11 non è congruente a 1 mod 3 (11 = 2 mod 3), quindi non può avere sottogruppi di ordine 3, e di sicuro non può avere allora un numero a diverso da 1 tale che a^3 = 1 mod 11.  In sostanza un campo di p elementi è un gruppo ciclico rispetto all'operazione di moltiplicazione di ordine p-1 (ha solo p-1 elementi perchè bisogna togliere lo zero), nel nostro caso 10.

Questo vuol dire che i possibili sottogruppi di {1,2,3,4,5,6,7,8,9,10} (guarda qui per il concetto di ordine e di sottogruppo)  possono avere per il teorema di Lagrange solo ordine un divisore di 10, ovvero o 1 o 2 o 5.  In un sottogruppo di ordine 2, deve esistere un elemento a != 1 tale che a^2 = 1 mod 11, in un sottogruppo di ordine 5 (se c'è) ci devono essere degli elementi b != 0 tali che b^5 = 1 mod 11.
Non potendoci essere un sottogruppo di ordine 3 (perchè 3 non divide 10), non ci può essere quindi un elemento beta diverso da 1 tale che beta^3 = 1 mod 11.

Se provi invece con F_7 (o con F_19 o con altri valori di p primo congruenti a 1 mod 3), poichè 7 = 1 mod 3 (ovvero 7-1 è un multiplo di 3) in F_7 può esserci un sottogruppo di ordine 3 e quindi un paio di elementi diversi da 1 di ordine 3 (ci può essere cioè un sottoinsieme di F_7 formato da 3 elementi = {1, beta1, beta2} che elevati alla terza fanno 1).

Infatti (tutti i calcoli sono fatti modulo 7 in F_7):

x     x^3    x^3 + 7    y=sqrt(x^3 + 7)

0      0            0                        0
1     1            1                     1 o 6
2     1            1                     1 o 6
4     1            1                     1 o 6
3      6            6                 non esiste
5      6            6                 non esiste  
6      6            6                 non esiste

quindi l'insieme E(F_7), ovvero la curva (il gruppo) formata da tutti i punti le cui coordinate nel campo F_7 soddisfano l'equazione y^2 = x^3 + 7 mod 7 é

E(F_7) = { (0,0), (1,1), (2,1), (4,1), (1,6), (2,6), (4,6) } U {punto all'infinito}

notare la doppia "simmetria"di questa curva:

1) rispetto all'asse x  (le y vanno a "coppie", 1 e 6 sono come 1 e -1, sono valori simmetrici rispetto all'asse x, questo deriva dal termine y^2)

2) rispetto ai singoli valori di y (le x associate alla stessa y sono terne di x legate tra loro dalle radici cubiche dell'unità, questo deriva dal termine x^3 dell'equazione e dal particolare valore di p)

Ho aggiunto in fondo a questo post il calcolo del numero distinto dei valori assunti dalle coordinate x e dalle coordinate y dei punti della curva, calcolo che si basa proprio su questa doppia simmetria.
sr. member
Activity: 292
Merit: 250
January 17, 2019, 05:55:18 AM
#62
Addizione tra 2 punti in E(F_11): esempio


Vediamo di costruire come esempio il gruppo E(F_11), cioè il gruppo di elementi della curva di equazione y^2=x^3+7 a coordinate in F_11.

Proviamo tutti i casi possibili:

x   x^3+7   x^3+7 mod 11    Sqrt(x^3+7) mod 11   
0   7                   7      
1   8                   8      
2   15                   4                     2 o 9        2 o -2   --> (2,2), (2,-2)
3   34                   1                    1 o 10      1 o -1  -->  (3,1), (3, -1)
4   71                   5                    4 o 7        4 o -4  -->  (4,4),(4,-4)        
5   132                   0                        0               0      -->  (5,0)
6   223                   3                    5 o 6        5 o -5   -->  (6,5),(6,-5)
7   350                   9                    3 o 8        3 o -3   --> (7,3),(7,-3)
8   519                   2      
9   736                  10      
10   1007                  6      




Mi perdo nel passaggio dalla terza alla quarta colonna, il mod11 viene fatto sul sqrt? Non capisco come vengono estrapolati i valori.

mod 11 viene applicato al risultato della radice quadrata (in generale viene applicato al risultato di qualsiasi operazione quando questo risultato supera 11).

Prendiamo per esempio la riga del 2:

x = 2 --> x^3 = 8 --> x^3 + 7 = 8 + 7 = 15 = 4 mod 11 --> sqrt(4) = 2 o 9 (perchè 2*2 = 4 ma anche 9*9=81 = 4 mod 11) lascia perdere i valori negativi (semplicemente 9 = -2 mod 11, li ho inseriti solo per far vedere che le radici quadrate sono sempre opposte, anche in questi insiemi strani; anche con i numeri normali se ti dico x^2 = 4, chi è x? Tu rispondi: 2 o -2)

Ho un'altra domanda... Immagino non sia un caso che il rislutato di "x^3+7 mod 11" siano tutti valori diversi, da cosa dipende?
sr. member
Activity: 292
Merit: 250
January 17, 2019, 03:39:34 AM
#61



 sqrt(4) = 2 o 9 (perchè 2*2 = 4 ma anche 9*9=81 = 4 mod 11)

ecco il motivo, scusate ma ho solo qualche reminiscenza universitaria...
legendary
Activity: 1914
Merit: 2071
January 16, 2019, 05:48:58 PM
#60
Addizione tra 2 punti in E(F_11): esempio


Vediamo di costruire come esempio il gruppo E(F_11), cioè il gruppo di elementi della curva di equazione y^2=x^3+7 a coordinate in F_11.

Proviamo tutti i casi possibili:

x   x^3+7   x^3+7 mod 11    Sqrt(x^3+7) mod 11   
0   7                   7      
1   8                   8      
2   15                   4                     2 o 9        2 o -2   --> (2,2), (2,-2)
3   34                   1                    1 o 10      1 o -1  -->  (3,1), (3, -1)
4   71                   5                    4 o 7        4 o -4  -->  (4,4),(4,-4)        
5   132                   0                        0               0      -->  (5,0)
6   223                   3                    5 o 6        5 o -5   -->  (6,5),(6,-5)
7   350                   9                    3 o 8        3 o -3   --> (7,3),(7,-3)
8   519                   2      
9   736                  10      
10   1007                  6      




Mi perdo nel passaggio dalla terza alla quarta colonna, il mod11 viene fatto sul sqrt? Non capisco come vengono estrapolati i valori.

mod 11 viene applicato al risultato della radice quadrata (in generale viene applicato al risultato di qualsiasi operazione quando questo risultato supera 11).

Prendiamo per esempio la riga del 2:

x = 2 --> x^3 = 8 --> x^3 + 7 = 8 + 7 = 15 = 4 mod 11 --> sqrt(4) = 2 o 9 (perchè 2*2 = 4 ma anche 9*9=81 = 4 mod 11) lascia perdere i valori negativi (semplicemente 9 = -2 mod 11, li ho inseriti solo per far vedere che le radici quadrate sono sempre opposte, anche in questi insiemi strani; anche con i numeri normali se ti dico x^2 = 4, chi è x? Tu rispondi: 2 o -2)
legendary
Activity: 1914
Merit: 2071
January 16, 2019, 05:27:58 PM
#59
...
Altra domanda...Qualcuno è così gentile da scrivere i vari passaggi da privkey a pubkey con una privkey reale? grazie
Vedi: https://en.bitcoin.it/wiki/Technical_background_of_Bitcoin_addresses
e anche https://en.bitcoin.it/wiki/Address

Grazie, ma manca proprio il calcolo della chiave pubblica (passaggio da 0 a 1)

L'ho spiegato qui con un codice python applicato a una chiave reale:

https://bitcointalksearch.org/topic/m.48983013

nella libreria micro_ecdsa la funzione che effettua il passaggio dalla chiave privata alla chiave pubblica è la funzione mul che moltiplica il generatore G per una chiave privata d (uno scalare) e restituisce la chiave pubblica corrispondente d*G. Quindi per trovare la chiave pubblica relativa a 'd' basta chiamare la funzione mul(d,Gx, Gy), dove Gx e Gy sono le coordinate del punto G scelto dalla SEC. Ti consiglio di scaricarti lo script pyhton e provare a generare delle chiavi pubbliche a partire dalle chiavi private. Lascia stare gli indirizzi, quelli vengono dopo.

La funzione 'mul' invece di fare banalmente d*G = G+G+G+.... un numero d di volte (essendo d dell'ordine di 2^256 ci impiegherebbe un'eternità) crea tutte le potenze di 2 tipo 2*G, 4*G, 8*G, 16*G, 32*G, ... , 2^255*G e poi somma tra loro quelle che servono. Ho anche fatto un esempio concreto con una chiave piccola tipo 25 = 11001 in base 2. In quel caso basta generare 1G, 2G, 4G, 8G, 16G e poi sommare rispettivamente: 16G + 8G +1G (che corrispondono ai 3 'uno' della sequenza 11001) per ottenere 25G (che è la chiave pubblica relativa alla chiave privata 25).  Nella libreria ci sono anche la formula per l'addizione di due punti e la formula per il raddoppio di un punto che sono i mattoncini base per la funzione mul.

EDIT: altri link utili:

https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication

https://hackernoon.com/what-is-the-math-behind-elliptic-curve-cryptography-f61b25253da3

legendary
Activity: 2506
Merit: 1120
January 16, 2019, 07:42:41 AM
#58
...
Altra domanda...Qualcuno è così gentile da scrivere i vari passaggi da privkey a pubkey con una privkey reale? grazie
Vedi: https://en.bitcoin.it/wiki/Technical_background_of_Bitcoin_addresses
e anche https://en.bitcoin.it/wiki/Address

Grazie, ma manca proprio il calcolo della chiave pubblica (passaggio da 0 a 1)
A memoria, certo di sbagliarmi, prego correggermi.
prv=privete key
pub=public key
G= generatore

pub=G+G+G ...+G=prv*G (o G*prv se commutativo, non ricordo).
sr. member
Activity: 292
Merit: 250
January 16, 2019, 04:54:24 AM
#57
...
Altra domanda...Qualcuno è così gentile da scrivere i vari passaggi da privkey a pubkey con una privkey reale? grazie
Vedi: https://en.bitcoin.it/wiki/Technical_background_of_Bitcoin_addresses
e anche https://en.bitcoin.it/wiki/Address

Grazie, ma manca proprio il calcolo della chiave pubblica (passaggio da 0 a 1)
sr. member
Activity: 292
Merit: 250
January 16, 2019, 04:52:53 AM
#56
Per molti sarà banale, per uno come me che non è del mestiere ho trovato questo materiale molto utile. Vedere il codice a volte aiuta a capire la teoria  Grin :

https://rosettacode.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm

https://rosettacode.org/wiki/RSA_code

https://rosettacode.org/wiki/Bitcoin/public_point_to_address

legendary
Activity: 2506
Merit: 1120
January 16, 2019, 04:51:58 AM
#55
...
Altra domanda...Qualcuno è così gentile da scrivere i vari passaggi da privkey a pubkey con una privkey reale? grazie
Vedi: https://en.bitcoin.it/wiki/Technical_background_of_Bitcoin_addresses
e anche https://en.bitcoin.it/wiki/Address
sr. member
Activity: 292
Merit: 250
January 16, 2019, 04:21:42 AM
#54
Addizione tra 2 punti in E(F_11): esempio


Vediamo di costruire come esempio il gruppo E(F_11), cioè il gruppo di elementi della curva di equazione y^2=x^3+7 a coordinate in F_11.

Proviamo tutti i casi possibili:

x   x^3+7   x^3+7 mod 11    Sqrt(x^3+7) mod 11   
0   7                   7      
1   8                   8      
2   15                   4                     2 o 9        2 o -2   --> (2,2), (2,-2)
3   34                   1                    1 o 10      1 o -1  -->  (3,1), (3, -1)
4   71                   5                    4 o 7        4 o -4  -->  (4,4),(4,-4)        
5   132                   0                        0               0      -->  (5,0)
6   223                   3                    5 o 6        5 o -5   -->  (6,5),(6,-5)
7   350                   9                    3 o 8        3 o -3   --> (7,3),(7,-3)
8   519                   2      
9   736                  10      
10   1007                  6      



Mi perdo nel passaggio dalla terza alla quarta colonna, il mod11 viene fatto sul sqrt? Non capisco come vengono estrapolati i valori.
Altra domanda...Qualcuno è così gentile da scrivere i vari passaggi da privkey a pubkey con una privkey reale? grazie
legendary
Activity: 1914
Merit: 2071
January 11, 2019, 02:39:50 PM
#53
Sono un po OT, ma volevo sapere: partendo da un indirizzo, posso sapere se è stato generato a partire da una pubkey compressa o meno? Grazie

No, non si può sapere. Nel momento in cui passi la stringa '04' + 'X' + 'Y' alla funzione ripemd160(sha256()) il risultato è solo una stringa di 160 bit, lo stesso otterresti se mettessi in input '02' + 'X'.

Di più, la stringa di 160 bit (l'address è sostanzialmente un numero di 160 bit presentato all'essere umano in base 58) potrebbe essere l'impronta di qualsiasi cosa. Ad esempio, se consideri la frase 'Ciao come stai' e la dai in pasto così:  ripemd160(sha256('Ciao come stai')) ottieni un numero di 160 bit, se ora passi la sua codifica in base 58 a qualcuno perchè lui ti paghi su quell'indirizzo, la transazione avverrà con destinazione quell'indirizzo, poichè non è possibile dall'indirizzo stesso ricavare nulla su come sia stato effettivamente generato (se non che la sua codifica in base 58 è stata ottenuta aggiungendo il byte 00 all'inizio della stringa di 160 bit).
Quindi in tal caso nessuno potrebbe smuovere più quei fondi.
sr. member
Activity: 292
Merit: 250
January 11, 2019, 06:22:41 AM
#52
Sono un po OT, ma volevo sapere: partendo da un indirizzo, posso sapere se è stato generato a partire da una pubkey compressa o meno? Grazie
legendary
Activity: 3570
Merit: 1985
January 01, 2019, 07:13:01 PM
#51
mi sono ricordato che ai miei tempi c'era un corso di Algebra tra quelli opzionali, ma non lo sceglieva quasi nessuno, me compreso...
Avevamo tutti un corso di Geometria al primo anno, con solo una parte di algebra lineare sulle matrici. Devo dire che a volte mi pesa avere di queste lacune.

Non è mai troppo tardi per mettersi a studiare, l'importante è che ti interessi veramente, ormai di materiale in rete ce n'è in abbondanza.

già, di materiale senz'altro, ma di tempo no purtroppo Sad
legendary
Activity: 1914
Merit: 2071
January 01, 2019, 06:26:56 PM
#50
mi sono ricordato che ai miei tempi c'era un corso di Algebra tra quelli opzionali, ma non lo sceglieva quasi nessuno, me compreso...
Avevamo tutti un corso di Geometria al primo anno, con solo una parte di algebra lineare sulle matrici. Devo dire che a volte mi pesa avere di queste lacune.

Non è mai troppo tardi per mettersi a studiare, l'importante è che ti interessi veramente, ormai di materiale in rete ce n'è in abbondanza.
legendary
Activity: 3570
Merit: 1985
January 01, 2019, 06:11:09 PM
#49

ok ti ringrazio, mi mancava quel tassello dell'identità di Bezout!
Z'p non so neanche se sia corretta come notazione, andavo un po' a memoria.

Per curiosità, che corso è quello del testo? Tu insegni questo all'università?

Direi un classico corso di Algebra. Certo era solo un riferimento, visto che mi hai chiesto dei campi finiti ho fatto una rapida ricerca con google.  Smiley

Io insegno matematica al liceo, non all'università.

mi sono ricordato che ai miei tempi c'era un corso di Algebra tra quelli opzionali, ma non lo sceglieva quasi nessuno, me compreso...
Avevamo tutti un corso di Geometria al primo anno, con solo una parte di algebra lineare sulle matrici. Devo dire che a volte mi pesa avere di queste lacune.
legendary
Activity: 1914
Merit: 2071
January 01, 2019, 06:04:51 PM
#48

ok ti ringrazio, mi mancava quel tassello dell'identità di Bezout!
Z'p non so neanche se sia corretta come notazione, andavo un po' a memoria.

Per curiosità, che corso è quello del testo? Tu insegni questo all'università?

Direi un classico corso di Algebra. Certo era solo un riferimento, visto che mi hai chiesto dei campi finiti ho fatto una rapida ricerca con google.  Smiley

Io insegno matematica al liceo, non all'università.
legendary
Activity: 3570
Merit: 1985
January 01, 2019, 05:50:30 PM
#47
ok ma qui è invertito l'ordine: è appunto la parte in grassetto che non capisco come si dimostra. Come dimostri che per ogni a < p, esiste b < p t.c. a x b = 1?

Infatti ho solo dimostrato che Zn non è un campo quando n non è primo.

Dimostrare che un insieme è un campo è ovviamente più laborioso (dimostrazione completa , da pag. 35 a pag. 46!), devi infatti dimostrare che le operazioni di somma e moltiplicazioni sono ben definite, godono delle proprietà associative e commutative e che tutti gli elementi hanno l'opposto e il reciproco.

Come hai ben osservato, la parte più interessante è l'ultima, ovvero dimostrare che ogni elemento (a parte lo 0) di Zp ha sempre un inverso.


Premessa:

Identità di Bezout: dati a e b numeri interi relativi diversi da 0 e detto d = MCD(a,b), allora esistono x,y interi tali che

a*x + b*y = d

x e y non sono unici, per trovarne un paio basta applicare l'algoritmo di Euclide per la determinazione del MCD (ce ne sono in realtà  infinite coppie).

Supponiamo vera l'identità di Bezout (vedi pag. 45 del link), vediamo che x e y non sono unici.

Notiamo infatti che a*b + b*(-a) = 0, quindi k * [a*b + b*(-a)] = 0 per ogni k intero

da ciò segue che per ogni k intero, a*(b*k) + b(-a*k) = 0 quindi x = b*k e y = -a*k  possono assumere infiniti valori.



Teorema: se p é primo allora ogni elemento diverso da 0 di Zp ha un inverso in Zp

Sia a un numero diverso da 0 di Zp, con p primo.

Poichè p è primo, MCD(a,p)=1

Per l'identità di Bezout esistono x e y interi tali che:

a*x + p*y = 1

ovvero a*x = 1 -y*p  ovvero a*x  = 1 mod p (a*x = 1 mod p significa che esiste q tale che a*x= q*p + 1)

quindi x è l'inverso di a mod p
CVD

Ti consiglio caldamente la lettura delle pagine dalla 42 alla 46, spiegano bene la questione a partire dal concetto di divisore, di MCD, identità di Bezout e teorema su Zp.


Avevo letto da qualche parte che la stessa cosa vale per altri tipi di anelli che non sono campi finiti, ad es. definendo:

Z'n = 0 U {a: 0 < a < n, MCD (a, n) = 1}

cioè anche con n che non è primo, se a ed n sono primi fra loro.

Penso che dalla dimostrazione che ti ho dato ora questo punto sia diventato chiaro.

Ultima osservazione, bisognerebbe stare attenti a come sono definiti gli elementi degli insiemi in algebra, io ho utilizzato una notazione 'leggera' per cui Zp = { 0, 1, 2, ...., n-1} mentre in realtà bisognerebbe scrivere Zp = { [ 0], [1], [2], ...., [n-1]} perchè gli elementi di Zp sono le classi di congruenza modulo n, penso che anche l'insieme Z'n di cui parli tu sia la stessa cosa, altrimenti non è chiaro neanche come è definita l'addizione e la moltiplicazione tra elementi.

Detta in altri termini, Zp = { 0, 1, 2, ...., n-1} NON è un campo con le usuali operazioni di addizioni e moltiplicazione!
Invece Zp = { [ 0], [1], [2], ...., [n-1]} lo è, una volta definite le operazioni + e * sui suoi particolari elementi.

Ad esempio Z'6 = {[ 0], [1], [5]} ( Z'6 ha 3 elementi, è isomorfo quindi a Z3 = {[ 0], [1], [2]} )

dove
[ 0]  * [ 0] = [ 0]
[ 0]  * [1] = [ 0]
[ 0]  * [5] = [ 0]
[ 1]  * [ 0] = [ 0]
[ 1]  * [1] = [ 1]
[ 1]  * [5] = [ 5]
[ 5]  * [ 0] = [ 0]
[ 5]  * [1] = [ 5]
[ 5]  * [5] = [ 1]

ok ti ringrazio, mi mancava quel tassello dell'identità di Bezout!
Z'p non so neanche se sia corretta come notazione, andavo un po' a memoria.

Per curiosità, che corso è quello del testo? Tu insegni questo all'università?
EDIT: vedo nel link Geometria e Algebra, ma non so se l'hai segnalato solo come riferimento
legendary
Activity: 1914
Merit: 2071
January 01, 2019, 04:08:55 PM
#46
ok ma qui è invertito l'ordine: è appunto la parte in grassetto che non capisco come si dimostra. Come dimostri che per ogni a < p, esiste b < p t.c. a x b = 1?

Infatti ho solo dimostrato che Zn non è un campo quando n non è primo.

Dimostrare che un insieme è un campo è ovviamente più laborioso (dimostrazione completa , da pag. 35 a pag. 46!), devi infatti dimostrare che le operazioni di somma e moltiplicazioni sono ben definite, godono delle proprietà associative e commutative e che tutti gli elementi hanno l'opposto e il reciproco (in sostanza che sono definite implicitamente anche le operazioni di sottrazione e divisione per un numero diverso da zero).

Come hai ben osservato, la parte più interessante è l'ultima, ovvero dimostrare che ogni elemento (a parte lo 0) di Zp ha sempre un inverso.


Premessa:

Identità di Bezout: dati a e b numeri interi relativi diversi da 0 e detto d = MCD(a,b), allora esistono x,y interi tali che

a*x + b*y = d

x e y non sono unici, per trovarne un paio basta applicare l'algoritmo di Euclide per la determinazione del MCD (ce ne sono in realtà  infinite coppie).

Supponiamo vera l'identità di Bezout (vedi pag. 45 del link), vediamo che x e y non sono unici.

Notiamo infatti che a*b + b*(-a) = 0, quindi k * [a*b + b*(-a)] = 0 per ogni k intero

da ciò segue che per ogni k intero, a*(b*k) + b(-a*k) = 0 quindi

0 + a*x + b*y = d ->  a*(b*k) + b(-a*k) + a*x + b*y = d

da cui si ricava che x' = b*k + x    e   y' = -a*k + y possono assumere infiniti valori.



Teorema: se p é primo allora ogni elemento diverso da 0 di Zp ha un inverso in Zp

Sia a un numero diverso da 0 di Zp, con p primo.

Poichè p è primo, MCD(a,p)=1

Per l'identità di Bezout esistono x e y interi tali che:

a*x + p*y = 1

ovvero a*x = 1 -y*p  ovvero a*x  = 1 mod p (a*x = 1 mod p significa che esiste q intero tale che a*x= q*p + 1)

quindi x è l'inverso di a mod p
CVD

Ti consiglio caldamente la lettura delle pagine dalla 42 alla 46, spiegano bene la questione a partire dal concetto di divisore, di MCD, identità di Bezout e teorema su Zp.


Avevo letto da qualche parte che la stessa cosa vale per altri tipi di anelli che non sono campi finiti, ad es. definendo:

Z'n = 0 U {a: 0 < a < n, MCD (a, n) = 1}

cioè anche con n che non è primo, se a ed n sono primi fra loro.

Penso che dalla dimostrazione che ti ho dato ora questo punto sia diventato chiaro.

Ultima osservazione, bisognerebbe stare attenti a come sono definiti gli elementi degli insiemi in algebra, io ho utilizzato una notazione 'leggera' per cui Zp = { 0, 1, 2, ...., n-1} mentre in realtà bisognerebbe scrivere Zp = { [ 0], [1], [2], ...., [n-1]} perchè gli elementi di Zp sono le classi di congruenza modulo n, penso che anche l'insieme Z'n di cui parli tu sia la stessa cosa, altrimenti non è chiaro neanche come è definita l'addizione e la moltiplicazione tra elementi.

Detta in altri termini, Zp = { 0, 1, 2, ...., n-1} NON è un campo con le usuali operazioni di addizioni e moltiplicazione!
Invece Zp = { [ 0], [1], [2], ...., [n-1]} lo è, una volta definite le operazioni + e * sui suoi particolari elementi.

Ad esempio Z'6 = {[ 0], [1], [5]} ( Z'6 ha 3 elementi, è isomorfo quindi a Z3 = {[ 0], [1], [2]} ) (per fare i calcoli basta sostituire [5] con [2])

dove

[ 0]  * [ 0] = [ 0]                [ 0]  +  [ 0] = [ 0]
[ 0]  * [ 1] = [ 0]                [ 0]  +  [ 1] = [ 1]
[ 0]  * [ 5] = [ 0]                [ 0]  +  [ 5] = [ 5]
[ 1]  * [ 0] = [ 0]                [ 1]  +  [ 0] = [ 1]
[ 1]  * [ 1] = [ 1]                [ 1]  +  [ 1] = [ 5]
[ 1]  * [ 5] = [ 5]                [ 1]  +  [ 5] = [ 0]
[ 5]  * [ 0] = [ 0]                [ 5]  +  [ 0] = [ 5]
[ 5]  * [ 1] = [ 5]                [ 5]  +  [ 1] = [ 0]
[ 5]  * [ 5] = [ 1]                [ 5]  +  [ 5] = [ 1]
legendary
Activity: 3570
Merit: 1985
January 01, 2019, 02:54:27 PM
#45
Una cosa però avevo provato a studiarla ma non l'ho mai capita: come fai a dimostrare che l'insieme dei numeri interi non negativi e minori di p (numero primo) sia un campo? Ovvero, come dimostri che per ogni elemento di quell'insieme esiste un inverso, anch'esso nello stesso insieme?

Si può dimostrare che Zn è un campo finito se e solo se n è primo.

Al momento mi ricordo solo come si fa a dimostrare che se n non è primo, allora Zn non è un campo.

Premessa:
in un campo qualsiasi deve valere la legge di annullamento del prodotto, ovvero a x b = 0 implica necessariamente che almeno uno tra a e b sia uguale a 0.

Infatti se per assurdo a x b = 0 con a,b entrambi diversi da 0, posso moltiplicare entrambi i membri per b^-1 (ogni elemento diverso da 0 ha il suo inverso in un campo):

a x b x b^-1 = 0 x b^-1


ok ma qui è invertito l'ordine: è appunto la parte in grassetto che non capisco come si dimostra. Come dimostri che per ogni a < p, esiste b < p t.c. a x b = 1?
Avevo letto da qualche parte che la stessa cosa vale per altri tipi di anelli che non sono campi finiti, ad es. definendo:

Z'n = 0 U {a: 0 < a < n, MCD (a, n) = 1}

cioè anche con n che non è primo, se a ed n sono primi fra loro.
legendary
Activity: 1914
Merit: 2071
January 01, 2019, 02:18:44 PM
#44
Una cosa però avevo provato a studiarla ma non l'ho mai capita: come fai a dimostrare che l'insieme dei numeri interi non negativi e minori di p (numero primo) sia un campo? Ovvero, come dimostri che per ogni elemento di quell'insieme esiste un inverso, anch'esso nello stesso insieme?

Si può dimostrare che Zn è un campo finito se e solo se n è primo.

Al momento mi ricordo solo come si fa a dimostrare che se n non è primo, allora Zn non è un campo.

Premessa:
in un campo qualsiasi deve valere la legge di annullamento del prodotto, ovvero a x b = 0 implica necessariamente che almeno uno tra a e b sia uguale a 0.

Infatti se per assurdo a x b = 0 con a,b entrambi diversi da 0, posso moltiplicare entrambi i membri per b^-1 (ogni elemento diverso da 0 ha il suo inverso in un campo):

a x b x b^-1 = 0 x b^-1

a x 1 = 0

a = 0 che va contro l'ipotesi che a sia diverso da 0.
 


Tornando a Zn, se n non è primo, allora n = a x b, con a,b diversi da 0.

Ma Zn = {0, 1, 2, ..., n -1} è definito come l'insieme delle classi dei resti modulo n ovvero n = 0 in Zn.

Quindi se n non è primo, è possibile trovare due numeri diversi da 0 il cui prodotto fa 0, ma in un campo la legge di annullamento del prodotto deve valere sempre, quindi si conclude che Zn non è un campo.


EDIT: aggiungo inoltre che ogni campo finito Fq ha necessariamente p^n elementi, dove p è un numero primo. Ogni campo finito contiene un sottocampo finito di p elementi isomorfo a Zp, e tutti i campi finiti di p elementi sono isomorfi a Zp (link)
legendary
Activity: 3570
Merit: 1985
January 01, 2019, 01:31:01 PM
#43
Ti ringrazio per la guida, anche se in ritardo... purtroppo non so quando riuscirò mai a trovare in tempo per studiarmi per bene l'argomento.

Una cosa però avevo provato a studiarla ma non l'ho mai capita: come fai a dimostrare che l'insieme dei numeri interi non negativi e minori di p (numero primo) sia un campo finito? Ovvero, come dimostri che per ogni elemento di quell'insieme esiste un inverso, anch'esso nello stesso insieme?
legendary
Activity: 1914
Merit: 2071
December 31, 2018, 11:06:33 AM
#42
Dopo quasi 3 anni mi sono deciso a continuare questo thread, aggiungendo le parti relative alla firma di un messaggio (già fatta) e la firma di una transazione bitcoin (ancora da fare).

Si tratta di una sezione più operativa, con esempi di codice in python funzionanti (tranne casi particolari che non affronterò).

Ricordo comunque che si tratta di materiale a scopo didattico, solo per imparare, non usate questi software per cose serie.

Questo il link al nuovo thread (continuazione di questo):

https://bitcointalksearch.org/topic/ecdsa-parte-2-firma-di-un-messaggio-e-di-una-transazione-bitcoin-5091462
legendary
Activity: 1914
Merit: 2071
February 03, 2016, 07:41:47 AM
#41
Ho inserito un indice (all'inizio del primo post) per mettere un po' di ordine in questo thread.

Ho aggiunto anche la parte relativa alla firma e alla verifica, più avanti vedo di inserire magari anche qualche esempio specifico.
legendary
Activity: 2506
Merit: 1120
January 31, 2016, 06:40:59 PM
#40
@picchio
Non ho modo/poteri io di farlo, e comunque non ci saranno modifiche/aggiunte a questa versione del forum, è da più di un anno che stanno lavorando a creare una versione nuova.
Ok, grazie. Se ti capita fai presente che potrebbe servire, immagino non saremo i soli con l'esigenza di scrivere in matematichese
staff
Activity: 4214
Merit: 1203
I support freedom of choice
January 31, 2016, 06:04:57 PM
#39
@picchio
Non ho modo/poteri io di farlo, e comunque non ci saranno modifiche/aggiunte a questa versione del forum, è da più di un anno che stanno lavorando a creare una versione nuova.
legendary
Activity: 1914
Merit: 2071
January 31, 2016, 10:24:02 AM
#38
Per quanto riguarda la scelta dei sei parametri che definiscono la curva secp256k1 (tra tutte le curve ellittiche possibili):

The number is a generalized mersenne prime. The reason for this is that our we are doing calculations in this field so when we multiply we must take the result mod p where p is the size of the field. If p is a freely chosen prime to compute the mod we must divide which is hideously complex. Instead, if P has special form, we can break the larger value at the word level into small fragments and compute the mod p as some sum of them with negations. The performance impact is enormous.

n dovrebbe discendere di conseguenza, come h e anche a e b.

Nulla si sa invece del criterio di scelta di G.
legendary
Activity: 2506
Merit: 1120
January 31, 2016, 07:56:51 AM
#37
Letture consigliate:
..

http://www.math.brown.edu/~jhs/Presentations/WyomingEllipticCurve.pdf (Un'ottima presentazione delle curve ellittiche stile PowerPoint di una summer school; vi sono molte rappresentazioni grafiche delle curve)
OT: Ogni volta che vedo un documento scritto in LaTex mi viene voglia di re-imparare questo strumento eccezionale.
A mio avviso andrebbe imparato e potrebbe anche risolvere tanti problemi .. ad esempio radunare le idee di questo 3d in latex permetterebbe (credo) un utilizzo delle info contenute in modo comodo e utile. Qualcuno lo conosce?


Che tu sappia si può inserire latex nei post del forum? Io so per esempio che su mathstackexchange è possibile

http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference

ma dubito che si possa fare anche qui su bitcointalk.
Provo a segnalare a HostFat la cosa, immagino sia un plugin da abilitare, dubito lo facciano in quanto ogni aggiunta e' un rischio di attacco ... vediamo se interviene.
legendary
Activity: 1914
Merit: 2071
January 31, 2016, 07:27:30 AM
#36
Letture consigliate:
..

http://www.math.brown.edu/~jhs/Presentations/WyomingEllipticCurve.pdf (Un'ottima presentazione delle curve ellittiche stile PowerPoint di una summer school; vi sono molte rappresentazioni grafiche delle curve)
OT: Ogni volta che vedo un documento scritto in LaTex mi viene voglia di re-imparare questo strumento eccezionale.
A mio avviso andrebbe imparato e potrebbe anche risolvere tanti problemi .. ad esempio radunare le idee di questo 3d in latex permetterebbe (credo) un utilizzo delle info contenute in modo comodo e utile. Qualcuno lo conosce?


Che tu sappia si può inserire latex nei post del forum? Io so per esempio che su mathstackexchange è possibile

http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference

ma dubito che si possa fare anche qui su bitcointalk.
legendary
Activity: 2506
Merit: 1120
January 31, 2016, 07:16:35 AM
#35
Letture consigliate:
..

http://www.math.brown.edu/~jhs/Presentations/WyomingEllipticCurve.pdf (Un'ottima presentazione delle curve ellittiche stile PowerPoint di una summer school; vi sono molte rappresentazioni grafiche delle curve)
OT: Ogni volta che vedo un documento scritto in LaTex mi viene voglia di re-imparare questo strumento eccezionale.
A mio avviso andrebbe imparato e potrebbe anche risolvere tanti problemi .. ad esempio radunare le idee di questo 3d in latex permetterebbe (credo) un utilizzo delle info contenute in modo comodo e utile. Qualcuno lo conosce?
legendary
Activity: 1914
Merit: 2071
January 31, 2016, 06:24:48 AM
#34
Letture consigliate:


http://www.math.vt.edu/people/brown/doc/ellip.pdf   (Da dove vengono queste curve ellittiche? Che connessione hanno con l'ellisse? Quale tipo di problemi permettono di affrontare in teoria dei numeri?)

http://www.math.brown.edu/~jhs/Presentations/WyomingEllipticCurve.pdf (Un'ottima presentazione delle curve ellittiche stile PowerPoint di una summer school; vi sono molte rappresentazioni grafiche delle curve)
legendary
Activity: 1914
Merit: 2071
January 30, 2016, 08:11:05 PM
#33
Ci possono anche essere rette con zero intersezioni e sono quelle del tipo x=k con k minore di x_1 (x_1  lo zero a sinistra dell'equazione x^3 + ax + b=0).

Certo, ma visto che il nostro problema è definire un'operazione tra punti della curva, delle rette che non intersecano la curva non ci importa nulla.

La retta x=x_1 che passa per il punto di coordinata x_1 è il caso limite, e poichè essa è tangente alla curva in quel punto A, è come se incontrasse in due punti "coincidenti" la curva; in quel caso si ha :

A+A+zero=zero

( A in questo caso è opposto a se stesso, tutti i punti che stanno sull'asse x sono opposti a se stessi, come nel caso D(5,0) di E(F11) )

Aggiungo: non avevo mai pensato al fatto che sommando numeri "a" minori di p in algebra modulo p (a>0) si ottengono tutti i numeri da 1 a (p-1) che poi è quello che succede nelle curve ecdsa "utili".
EDIT: se p è primo!

Questo succede perchè in tal caso a e p sono sempre coprimi (hanno MCD = 1 in quanto p appunto è primo). Quindi, poichè per ogni coppia di numeri naturali a,b vale la formula:

mcm(a,b) * MCD(a,b) = a * b

segue che per la coppia a,p con a


Sempre puo' chiaro e complicato... domande:
...
2) esiste una definizione di prodotto tra due punti che magari porta a qualcosa di simile ad un anello?

Inizialmente avevo pensato di moltiplicare tra loro semplicemente gli scalari; cioè, fissato il generatore G, supponiamo A=3*G , B=7*G, definisco A*B=(7*3)*G=21*G

Il problema è che questa operazione dipende dal generatore scelto e quindi dal modo di ordinare i punti rispetto al generatore; per esempio si avrebbe che ogni punto A moltiplicato per G  darebbe come risultato sempre A ( poichè qui G vale come 1, l'elemento neutro della moltiplicazione) ma se scegliessi viceversa A come generatore, si avrebbe allora A*G = G.
Un'operazione per essere ben definita non può produrre risultati diversi a seconda del modo con cui si rappresentano e indicano gli elementi su cui opera.
legendary
Activity: 2506
Merit: 1120
January 30, 2016, 05:24:22 PM
#32
Sempre puo' chiaro e complicato... domande:
1) da dove arriva questo modo strampalato di fare la somma tra due punti?

Discende da una questione geometrico-algebrica; visto che l'equazione di Weierstrass contiene il termine x^3, se metto quella equazione a sistema con una retta si troveranno in genere uno, due o tre punti di intersezione (l'equazione risolvente diventerà polinomiale di terzo grado in x)

y = mx + q
y^2 = x^3 + ax + b

--> (mx + q)^2 = x^3 + ax + b

Ci possono anche essere rette con zero intersezioni e sono quelle del tipo x=k con k minore di x_1 (x_1  lo zero a sinistra dell'equazione x^3 + ax + b=0).
Anche io trovo affascinante il fatto che le proprietà si trasmettano dal reale al discreto e anche che valga la proprietà associativa (A+B)+C=A+(B+C).
Devo ancora analizzare bene quanto hai scritto ... intanto dico (come al solito) quello che mi rifrulla per la capa ...
Aggiungo: non avevo mai pensato al fatto che sommando numeri "a" minori di p in algebra modulo p (a>0) si ottengono tutti i numeri da 1 a (p-1) che poi è quello che succede nelle curve ecdsa "utili".
EDIT: se p è primo!
Il bello/brutto di questa matematica è che è maledettamente astratta e faccio una fatica bestia a starci dietro.
legendary
Activity: 1914
Merit: 2071
January 30, 2016, 02:57:08 PM
#31
Ho riscritto in gran parte il post precedente dal momento che non ero soddisfatto della risposta che avevo dato a picchio sul perchè si definisce in modo così strano la somma tra due punti.

Mi piacerebbe trovare un modo efficace di "confezionare" questo thread, inizialmente pensavo che lo spazio che mi ero riservato nei primi post fosse sufficiente, in realtà non si è rilevato tale, l'argomento richiede troppe spiegazioni, precisazioni e integrazioni varie che sto aggiungendo qua e là (ma il tutto rischia di diventare un po' dispersivo, grazie comunque a picchio per le sue numerose e puntuali domande e osservazioni)

Forse conviene creare un altro thread che si occupi nello specifico solo dell'algoritmo ECDSA (firma di un messaggio mediante chiave privata e verifica tramite relativa chiave pubblica, magari con esempi pratici che devo ancora preparare)

Questo thread potrebbe continuare ad occuparsi solo della struttura matematica delle curve ellittiche, con l'aggiunta magari del discorso di quantificare l'intrattabilità del problema di risalire dalla chiave pubblica alla chiave privata privata corrispondente (in sostanza il problema del logaritmo discreto), giusto per dare una dimensione della sicurezza su cui si basa tutta la crittografia a cui si affida il sistema Bitcoin.
legendary
Activity: 1914
Merit: 2071
January 29, 2016, 05:08:40 PM
#30
Sempre puo' chiaro e complicato... domande:
1) da dove arriva questo modo strampalato di fare la somma tra due punti?

Discende da una questione geometrico-algebrica; visto che l'equazione di Weierstrass contiene il termine x^3, se metto quella equazione a sistema con una retta si troveranno in genere uno, due o tre punti di intersezione (l'equazione risolvente diventerà polinomiale di terzo grado in x)

y = mx + q
y^2 = x^3 + ax + b

--> (mx + q)^2 = x^3 + ax + b

(escludiamo invece i casi patologici delle curve con nodi o punti angolosi - grazie al concetto di discriminante - altrimenti non potremmo tracciare le tangenti in ogni punto, cioè ci sarebbero punti per i quali non sarebbe possibile definire la somma con se stessi)

Cosa c'entra una retta con il concetto di addizione?

Se dobbiamo definire un'operazione, dobbiamo trovare una regola per associare fra loro 3 elementi della curva, in modo che la relazione (A,B) -> C diventerà la nostra addizione. Il legame è quindi dato dalla retta che collega tra loro i punti della curva.
L'idea di base è che 3 punti allineati devono dare sempre somma "zero".

Se una retta ha in comune 3 punti con la curva, allora si pone semplicemente:

A+B+C= "zero" , cioè si dice che A+B = -C  

Chi è quindi -C ? Per capire chi è -C, l'opposto di C, cioè l'elemento che sommato a C dà "zero" come risultato dobbiamo adesso attribuire a qualcuno il ruolo dello "zero".

Osserviamo 2 fatti:

1) una retta può intersecare la curva anche in solo due punti A e B (qui per intersecare intendo proprio "secare", non essere solo tangente in A o in B), e non necessariamente in 3 punti; come definire allora la somma tra questi due elementi, visto che la retta che li collega non passa per nessun altro punto della curva?

2) le uniche rette che passano solo per 2 punti distinti della curva (senza essere tangenti alla curva in nessuno dei due punti) sono le rette verticali (rette che collegano tra loro quindi 2 punti simmetrici rispetto all'asse x)

Unendo 1) e 2) otteniamo che nel caso di due punti A e B simmetrici rispetto all'asse x dobbiamo aggiungere per forza un terzo punto allineato a loro per definire la loro somma, e questo punto deve essere obbligatoriamente un nuovo punto, lo "zero" appunto (nuovo nel senso che non sta "naturalmente" sulla curva):

A+B+"zero" = "zero"  (quindi 2 punti sono opposti se e solo se sono simmetrici rispetto all'asse x)

dove qui "zero" indica quindi la direzione della retta verticale che passa per A e B e poi si "perde" verso infinito, si attribuisce perciò lo status di punto a una direzione come si è soliti fare in geometria proiettiva

NB: ribadisco che il punto zero non ha coordinate (anche se viene rappresentato nei software con le coordinate fittizie (0,0), coordinate che non soddisfano certo l'equazione di Weierstrass).
Le curve ellittiche vengono perciò definite come l'insieme dei punti che soddisfano Weierstrass + il punto all'infinito (a volte c'è ambiguità nel termine "curva", ma dobbiamo ricordarci che va sempre aggiunto alle soluzioni dell'equazione anche il punto all'infinito!). Questo punto è necessario per dare all'insieme nella sua totalità una configurazione di gruppo. Il punto zero è chiamato in questo modo semplicemente perchè è, per definizione, l'elemento neutro rispetto all'addizione.

Torniamo per un momento alla formula iniziale:

A+B+C=zero   cioè A+B=-C

adesso dovrebbe risultare più chiaro perchè, per sommare A e B, non basta solo tracciare una secante che da A e B raggiunga il punto C, ma dobbiamo passare poi anche al suo opposto (e simmetrico) C'=-C.

Quindi si tratta sì di una regola "strampalata" ma anche ragionata  Smiley

Poi il perchè questa regola per definire l'addizione valga anche se prendiamo i coefficienti in un sottocampo finito di R, questo proprio non lo so (ma è proprio questo che rende interessanti le curve ellittiche per le applicazioni pratiche, il fatto che ereditano proprietà normalmente valide solo sul continuo di R come quella dei 3 punti di intersezione tra retta e curva anche in un campo di lavoro finito per le coordinate, fatto veramente notevole per il quale queste curve vengono utilizzate in teoria dei numeri; le curve ellittiche gettano un ponte tra il mondo del continuo e il mondo del discreto e per quanto riguarda quest'ultimo anche tra l'infinito e il finito).


Sempre puo' chiaro e complicato... domande:

2) esiste una definizione di prodotto tra due punti che magari porta a qualcosa di simile ad un anello?

2) non lo so, a occhio direi proprio di no, tra un gruppo e un anello c'è una bella differenza, il prodotto dei punti della curva per gli scalari non è in realtà una vera moltiplicazione, ma semplicemente un modo sintetico di indicare un'addizione ripetuta.
legendary
Activity: 2506
Merit: 1120
January 29, 2016, 01:57:34 PM
#29
Sempre puo' chiaro e complicato... domande:
1) da dove arriva questo modo strampalato di fare la somma tra due punti?
2) esiste una definizione di prodotto tra due punti che magari porta a qualcosa di simile ad un anello?
legendary
Activity: 1914
Merit: 2071
January 28, 2016, 12:34:19 PM
#28
E(F11) ha 12 elementi (bisogna contare anche lo zero!)

Il numero n di cui parli tu nel caso della secp256k1 non dipende dal punto iniziale scelto ed è esattamente uguale al numero di punti della curva. Questo vuol dire che E è un gruppo è ciclico, vuol dire che puoi ottenere tutti i suoi elementi a partire da uno solo.

EDIT: anche E(F11) è un gruppo ciclico ma non ha un numero primo di elementi, quindi alcuni suoi elementi hanno un ordine minore di 12. Se riguardi il post lo avevo scritto, se invece un gruppo ha un numero primo di elementi (come nel caso della secp256k1, n è un numero primo in quel caso) allora ogni suo elemento escluso lo 0 genera tutto il gruppo, questo fatto discende dal teorema di Lagrange che ho inserito nel post sulla matematica.

EDIT2: cosa dice il teorema di Lagrange? In soldoni dice che il numero di elementi che puoi generare a partire da un elemento di un gruppo deve essere sempre un divisore del numero degli elementi di tutto il gruppo.

Pensiamo a Z/12Z, che ha 12 elementi, e che può essere visto come un orologio con le 12 ore: ci sono elementi come 4 che hanno ordine 3 (poichè <4>={4, 4+4, 4+4+4} ={4,8,0} cioè ha ordine 3, che è un divisore di 12), elementi come 2 che hanno ordine 6, elementi come 1 che generano tutto il gruppo (che per questo si dice ciclico).
Nell'esempio di E(F11), poichè anch'esso è un gruppo finito di 12 elementi, è normale che tu possa trovare alcuni elementi che non generano tutti gli altri elementi del gruppo ma che al contrario generino solo un sottogruppo di 2 o 3 o 4 o 6 elementi del gruppo di partenza.

Tecnicamente si dice che l'ordine del sottogruppo deve dividere l'ordine del gruppo, e il risultato del rapporto ordine del gruppo / ordine del sottogruppo è un numero intero detto "cofattore". Se vai qui (https://en.bitcoin.it/wiki/Secp256k1 guarda nell'ultima riga il parametro h) vedrai che nella secp256k1 il cofattore di G è 1, cioè l'ordine di G è esattamente uguale all'ordine di E(Fp), entrambi sono n.

Domanda: è un caso fortunato che G generi tutto il gruppo? Oppure è stato trovato dopo un lungo lavoro di ricerca in E(Fp)? Direi proprio di no!

Infatti se un gruppo finito ha un numero primo di elementi, poichè per Lagrange l'ordine di ogni elemento deve dividere l'ordine del gruppo (ordine vuol dire numero di elementi) allora ogni elemento (diverso dallo zero) deve per forza avere ordine "massimo" (non può certo avere ordine 1, visto che almeno se stesso e lo 0 devono sempre esserci in ogni sottogruppo).

Questo è proprio il caso della secp256k1, che avendo un numero primo n di elementi risulta essere quindi non solo un gruppo ciclico ma in più ha anche la caratteristica che ogni suo elemento, a parte lo 0, è in grado di generare tutti gli altri.

Per riassumere: l'esempio che stai implementando non si comporta proprio come la secp256k1, poichè non stai utilizzando un gruppo con un numero primo di elementi.

EDIT3: penso che il termine "ordine di un elemento G" derivi dal fatto che scegliere un punto G di partenza (un generatore) equivalga di fatto a imporre un ordine con cui descrivere tutti gli altri elementi del gruppo: 2G, 3G, ... ordine che dipende quindi dal punto di vista di G)
legendary
Activity: 2506
Merit: 1120
January 28, 2016, 12:25:12 PM
#27

Certo che l'insieme è limitato a n!
Per l'esattezza è compreso tra 1 e n-1 (questo sono sicuro di averlo scritto!)

n è leggermente minore di p (cioè il numero di punti della curva secp256k1 è leggermente minore dei possibili valori che posso provare ad assegnare alla x per vedere se c'è una y corrispondente tale per cui la coppia (x,y) soddisfa l'equazione della curva).

p è a sua volta un po' minore di 2^256.

EDIT: Poichè E è ciclico nel caso della secp256k1 ed è formato da un numero primo di elementi, ogni suo elemento tranne lo 0, compreso G, genera tutto E

EDIT2: nel caso di E(F11), la curva del post 6, E è ciclico ma non ha un numero primo di elementi (ne ha 12), lì quindi bisogna trovare in effetti una G che generi tutto E.  

Se poi mi chiedi con quale criterio allora abbiano scelto G nella secp256k1, sinceramente non lo so  Grin
L'"n" di cui parlo io è ancora minore del numero degli elementi della curva e cambia in funzione del punto di inizio.
Non mi quadra l'info di EDIT2: perche' 12 elementi? A me ne risultano 11:
(2, 2)
(2, 9)
(3, 1)
(3, 10)
(4, 4)
(4, 7)
(5, 0)
(6, 5)
(6, 6)
(7, 3)
(7, Cool
Punti ellittica: 11; modulo 11

Sequenza dei punti
(4, 4)
(6, 6)
(2, 9)
(3, 10)
(7, 3)
(5, 0)
(7, Cool
(3, 1)
(2, 2)
(6, 5)
(4, 7)
Se parto da (2, 2):
Sequenza dei punti
(2, 2)
(5, 0)
(2, 9)
Caso particolare, diversi ma opposti
(2, 9)
(2, 2)
-----------------
(11, 11)
(2, 2)
(5, 0)
(2, 9)
Caso particolare, diversi ma opposti
(2, 9)
(2, 2)
-----------------
(11, 11)
(2, 2)
(5, 0)
(2, 9)

Potrei aver commesso errori nel sw che sto debuggando.
legendary
Activity: 1914
Merit: 2071
January 28, 2016, 11:51:38 AM
#26
...
Purtroppo ho saltato diverse precisazioni...

Non credo sia possibile fare altrimenti. Il problema è tutt'altro che banale! Una trattazione completa richiede sicuramente competenze difficili da spiegare a chi, come me, ha conoscenze lacunose e frammentate, intanto io cerco di capire e ti sfrutto ... ogni volta arrivo ad un livello di comprensione differente ...
Chiamo ZERO il punto ad infinito ...
Appurato che calcoli tipo (5, 0)+(5,0)=ZERO o anche che ad un certo punto io arrivo ad uno zero, ossia n*G=ZERO allora da quel valore di n in avanti ritroveremo la sequenza iniziale e quindi mi sa che il gruppo è inutilizzabile o sbaglio?
in formule, parto da G:
1*G
2*G
...
n*G=ZERO
(n+1)*G=n*G+G=ZERO+G=G
2*G
...
ossia, si ricomincia ...  l'insieme delle chiavi sarebbe pertanto limitato ad "n" e non ad un valore simile alla base del modulo.
Forse la scelta di G deve essere fatta in modo da massimizzare questo valore? Ci deve essere una bella scatola di vermi dentro questo concetto ...

Certo che l'insieme è limitato a n!
Per l'esattezza è compreso tra 1 e n-1 (questo sono sicuro di averlo scritto!)

n è leggermente minore di p (cioè il numero di punti della curva secp256k1 è leggermente minore dei possibili valori che posso provare ad assegnare alla x per vedere se c'è una y corrispondente tale per cui la coppia (x,y) soddisfa l'equazione della curva).

p è a sua volta un po' minore di 2^256.

EDIT: Poichè E è ciclico nel caso della secp256k1 ed è formato da un numero primo di elementi, ogni suo elemento tranne lo 0, compreso G, genera tutto E

EDIT2: nel caso di E(F11), la curva del post 6, E è ciclico ma non ha un numero primo di elementi (ne ha 12), lì quindi bisogna trovare in effetti una G che generi tutto E.  

Se poi mi chiedi con quale criterio allora abbiano scelto G nella secp256k1, sinceramente non lo so  Grin
legendary
Activity: 2506
Merit: 1120
January 28, 2016, 11:41:44 AM
#25
...
Purtroppo ho saltato diverse precisazioni...

Non credo sia possibile fare altrimenti. Il problema è tutt'altro che banale! Una trattazione completa richiede sicuramente competenze difficili da spiegare a chi, come me, ha conoscenze lacunose e frammentate, intanto io cerco di capire e ti sfrutto ... ogni volta arrivo ad un livello di comprensione differente ...
Chiamo ZERO il punto ad infinito ...
Appurato che calcoli tipo (5, 0)+(5,0)=ZERO o anche che ad un certo punto io arrivo ad uno zero, ossia n*G=ZERO allora da quel valore di n in avanti ritroveremo la sequenza iniziale e quindi mi sa che il gruppo è inutilizzabile o sbaglio?
in formule, parto da G:
1*G
2*G
...
n*G=ZERO
(n+1)*G=n*G+G=ZERO+G=G
2*G
...
ossia, si ricomincia ...  l'insieme delle chiavi sarebbe pertanto limitato ad "n" e non ad un valore simile alla base del modulo.
Forse la scelta di G deve essere fatta in modo da massimizzare questo valore? Ci deve essere una bella scatola di vermi dentro questo concetto ...

legendary
Activity: 1914
Merit: 2071
January 28, 2016, 10:33:38 AM
#24
...
Infine calcoliamo un "multiplo" di un punto, per esempio 2*A, utilizzando le formule appropriate:

A=(2,2)      2*A=



Quindi 2*A = D.
..
Sto cercando di simulare queste operazioni, subito casini ...
Se devo fare D+D=2D mi trovo a denominatore 2y_D=0 che non ha inverso. Come ci si comporta?
Inoltre, quando sommo due elementi che hanno stessa x, ho lo stesso problema, in questo caso credo si arrivi al punto ad infinito che corrisponde allo zero. Ma nel caso di D(5, 0) non mi pare ricada nello stesso caso altrimenti il gruppo avrebbe 2 zeri differenti e non mi pare sia possibile.


Dovevo specificare che:

Se A diverso da B, e xA = xB allora A+B = 0 (punto all'infinito), quindi in tal caso non si applica la formula della somma di due punti (semplicemente una retta verticale non ha coefficiente angolare, quindi è inutile tentare di dividere per 0)

Se A = B, e yA=0 allora A+B=2A = 0 (punto all'infinito), quindi in tal caso non si applica la formula di duplicazione

Nel caso specifico di D(5,0) siamo nel secondo caso (che è a sua volta un caso particolare del primo caso). Quel punto è anche l'opposto di se stesso - poichè 2 punti sono opposti se e solo se hanno stessa x e y opposta (se (x,y) soddisfa l'equazione di Weierstrass la soddisfa evidentemente anche (x,-y)); nel caso di ordinata nulla se (x,0) soddisfa l'equazione di Weierstrass, se mantengo la x e cambio "segno" alla y trovo ancora (x,0), quindi (x,0)+(x,0) = 0 sempre!

Purtroppo ho saltato diverse precisazioni...
legendary
Activity: 2506
Merit: 1120
January 28, 2016, 10:00:45 AM
#23
...
Infine calcoliamo un "multiplo" di un punto, per esempio 2*A, utilizzando le formule appropriate:

A=(2,2)      2*A=



Quindi 2*A = D.
..
Sto cercando di simulare queste operazioni, subito casini ...
Se devo fare D+D=2D mi trovo a denominatore 2y_D=0 che non ha inverso. Come ci si comporta?
Inoltre, quando sommo due elementi che hanno stessa x, ho lo stesso problema, in questo caso credo si arrivi al punto ad infinito che corrisponde allo zero. Ma nel caso di D(5, 0) non mi pare ricada nello stesso caso altrimenti il gruppo avrebbe 2 zeri differenti e non mi pare sia possibile.
legendary
Activity: 1914
Merit: 2071
January 27, 2016, 09:10:01 AM
#22
Intanto grazie del 3d.
Faccio le domande come a scuola ... ne approfitto!
... Le curve ellittiche in generale hanno equazione y^2 = Ax^3+Bx+C,  e poco hanno a che fare con l'ellisse, nonostante il loro nome.  

In giro si trova che dipende da solo due parametri, in pratica https://en.wikipedia.org/wiki/Elliptic_curve indica solo i tuoi B=a, C=b mentre A=1, y^2 ha coefficiente 1 in entrambe. Sono equivalenti le trattazioni?

La definizione rigorosa di curva ellittica non è banale, si tratta di una curva proiettiva liscia i cui punti soddisfano una certa equazione detta equazione di Weierstrass generalizzata.

"proiettiva" ha a che fare con il fatto che dobbiamo aggiungere il punto all'infinito, "liscia" vuol dire non singolare, cioè deve essere derivabile in ogni punto, senza spigoli (altrimenti non sarebbe definita la tangente in ogni punto)

Si può dimostrare che quasi ogni curva ellittica può essere descritta da un tipo di equazione più semplice detta equazione di Weierstrass:

Domanda forse banale ma ... intanto spero di riuscire a spiegarmi ...
ECDSA serve solo per firmare o posso anche crittare messaggi "da" e "verso" le due chiavi in modo "scambiabile"?

ECDSA come dice il nome stesso (Elliptic Curve Digital Signature Algorithm) è solo un algoritmo di firma, quindi serve solo a firmare e a verificare la firma.

Se vuoi però utilizzare le curve ellittiche anche per cifrare i messaggi esistono anche algoritmi di cifratura come ad esempio  l' ECIES (Elliptic Curve Integrated Encryption Scheme) che trovi a pag.99-100 sempre della tesi.
legendary
Activity: 2506
Merit: 1120
January 27, 2016, 06:44:10 AM
#21
Domanda forse banale ma ... intanto spero di riuscire a spiegarmi ...
ECDSA serve solo per firmare o posso anche crittare messaggi "da" e "verso" le due chiavi in modo "scambiabile"?
legendary
Activity: 1914
Merit: 2071
January 27, 2016, 02:32:34 AM
#20
...
Dubbi residui:
- come critto un messaggio? Ossia poi, di fatto, come funziona?


Per quanto riguarda l'algoritmo ECDSA, sto preparando la spiegazione!

Ti segnalo http://kakaroto.homelinux.net/2012/01/how-the-ecdsa-algorithm-works/ che spiega come hanno hackerato la PS3 sfruttando un baco dell'implementazione da parte di sony ... poi corretto.
Se ho capito sony usava sempre uno stesso numero che dovrebbe essere casuale, assomiglia alla chiave privata, e serve per firmare un documento. Con qualche formula inversa sono arrivati alla chiave privata. Cita i passaggi ma non ho ancora potuto analizzarli meglio. Non so se sono giusti.

Per produrre una firma, oltre alla chiave privata e al messaggio da firmare, è necessario generare ogni volta un numero casuale. Se firmi due messaggi per mezzo della chiave privata utilizzando sempre lo stesso numero "casuale", è banale ricavare dalla firma la chiave privata.
Questo è il motivo per cui è necessario avere un buon generatore di numeri pseudo casuali, non solo per generare buone chiavi private, ma anche per poter firmare in sicurezza senza esporre la chiave privata (che è poi il senso generale della firma).
legendary
Activity: 2506
Merit: 1120
January 26, 2016, 08:24:26 PM
#19
...
Dubbi residui:
- come critto un messaggio? Ossia poi, di fatto, come funziona?

Per quanto riguarda l'algoritmo ECDSA, sto preparando la spiegazione!

[/quote]
Ti segnalo http://kakaroto.homelinux.net/2012/01/how-the-ecdsa-algorithm-works/ che spiega come hanno hackerato la PS3 sfruttando un baco dell'implementazione da parte di sony ... poi corretto.
Se ho capito sony usava sempre uno stesso numero che dovrebbe essere casuale, assomiglia alla chiave privata, e serve per firmare un documento. Con qualche formula inversa sono arrivati alla chiave privata. Cita i passaggi ma non ho ancora potuto analizzarli meglio. Non so se sono giusti.
legendary
Activity: 2506
Merit: 1120
January 26, 2016, 06:28:10 PM
#18
...
L'insieme degli indirizzi ha circa 2^160 elementi distinti possibili. Per passare dall'insieme E(Fp) all'insieme degli indirizzi ci sono 2 operazioni, un hash256 e un ripmed160 che traducono una stringa di 256 bit in una di 160 bit (la quale viene poi rappresentata in base 58, ma questo è solo un problema appunto di rappresentazione).

Quindi ci sono tantissime chiavi private (con relative chiave pubbliche) che producono lo stesso indirizzo.***

***EDIT2: in realtà c'è anche un altro problema quando traduciamo un punto della curva in un indirizzo. Poichè la funzione hash lavora in modo stupido solo sulla rappresentazione del punto, se scriviamo un punto di E(Fp) nella sua forma compressa (cioè con solo la coordinata x e il "segno" della y, aggiungendo come prefisso 02 se y è pari e 03 se y è dispari), avremo che lo stesso punto può essere tradotto in due indirizzi completamente diversi (ma controllati sempre dalla stessa chiave privata)
...
Interessante, non solo ci sono molti meno indirizzi bitcoin (2^160) ma addirittura ogni chiave privata ne controlla 2... non hanno pensato di imporre la rappresentazione compressa prima di calcolare l'address BTC?
Esagerazione: Non e' che poi alla fine facciamo la fine degli IPv4 che alla fine non bastano?
legendary
Activity: 1914
Merit: 2071
January 26, 2016, 11:45:12 AM
#17
...
Nella secp256k1 si è deciso di partire dal punto G

G = 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
...
Scritto cosi' non si capisce bene, magari usa (Gx, Gy) tipo:
G =(79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,  483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8).

CIao
P
EDIT: sto punto G l'ho gia' sentito da qualche parte e mi pare sia anche quello un punto di partenza ma non ricordo dove ...

Ho migliorato nel post 1 la presentazione di G, aggiungendo anche il controllo che effettivamente appartenga alla curva secp256k1.

Ho anche aggiunto una precisazione alla risposta alla tua domanda sulla corrispondenza biunivoca tra chiavi private e pubbliche nel post 14.
legendary
Activity: 1914
Merit: 2071
January 26, 2016, 10:55:43 AM
#16

EDIT: a voler essere pignoli, per ottenere un indirizzo è sufficiente fornire una stringa di 256 bit al posto di un punto della curva ellittica. Non vorrei dire una stupidaggine ma penso che il sistema bitcoin - blockchain sia del tutto indipendente dalla teoria delle curve ellittiche e dall'algoritmo di firma digitale ECDSA.


piu' o meno si... nel senso che il merkle tree di bitcoin funzionerebbe con qualsiasi altro sistema di crittografia, pero' fu scelto ECDSA perche
attualmente e' uno di quelli che garantisce alti livelli di sicurezza con chiavi corte... ad esempio con gli algoritmi basati su fattorizzazione tipo  RSA servono 1024 bit o piu' per
avere livelli decenti di sicurezza.... questo sarebbe drammatico per le dimesnioni della blockchain che gia' e' bella pesa...

Inoltre nei client adesso c'e' implementato tutto il codice per la ECDSA

ad esempio la OP_CHECKSIG fa il check presupponendo implicitamente questo particolare modo crittografia,
ossia non ha un parametro che dice "controlla usando  RSA" oppure "controlla usando il sistema di crittografia x"
quindi ci sarebbe da implementare pesantemente sui client .... ma teoricamente e' possibile.

Io intendevo, in maniera ancora più radicale, si potrebbe evitare proprio (a livello teorico, ovviamente sarebbe scomodissimo) di utilizzare il concetto di firma e quindi i comandi tipo OP_CHECKSIG.  
Alla fin dei conti sarebbe sufficiente scrivere uno script con i comandi consentiti dalla sintassi del linguaggio SCRIPT e farne l'hash. Mi riferisco al concetto di P2SH (pay to script hash).

Quote
Pay-to-script-hash addresses

Another important part of the P2SH feature is the ability to encode a script hash as an address, as defined in BIP0013. P2SH addresses are Base58Check encodings of the 20-byte hash of a script, just like bitcoin addresses are Base58Check encodings of the 20-byte hash of a public key. P2SH addresses use the version prefix "5", which results in Base58Check-encoded addresses that start with a "3"

Ad esempio: scrivo uno script del tipo

"fornisci l'hash del blocco 1000 e confrontalo con 0000125...."

oppure

"x + 10 = 30, fornisci x"

poi ne faccio l'hash e ripemd160 e la stringa che ottengo diventa il mio "indirizzo", l'analogo della stringa da 160 bit che ottengo facendo sha256 e poi ripemd160 partendo dalle coordinate di un punto sulla curva ellittica.

Prima della versione 0.9.2 di Bitcoin Core, di fatto si utilizzava questa modalità solo per gli indirizzi multisig, ora è permessa tutta la flessibilità consentita dal linguaggio SCRIPT.

PS: ovviamente vincolare dei fondi a uno script come quello proposto da me sopra non avrebbe senso alcuno, poichè qualora volessi sbloccare quei fondi dovrei trasmettere alla rete una transazione con lo script in chiaro il cui hash256 corrisponde al mio indirizzo + il dato richiesto per lo sblocco, e quindi sarebbe facilissimo sostituire la mia transazione modificando al volo il destinatario prima che essa sia inclusa in un blocco.
Il concetto di firma è proprio quello di poter generare una stringa con la quale dimostrare di avere la chiave privata senza bisogno di renderla pubblica.
Il senso del mio discorso era che il sistema bitcoin fondamentalmente lavora con coppie di stringhe A e B, la stringa/indirizzo B con la funzione di vincolare i btc all'indirizzo/stringa B, la stringa A con la funzione di svincolare i btc dall'indirizzo B. Nel caso delle curve ellittiche, A è la chiave privata, B l'hash della chiave pubblica, ma non è strettamente necessario che sia così.
 
legendary
Activity: 3066
Merit: 2595
January 26, 2016, 10:06:29 AM
#15

EDIT: a voler essere pignoli, per ottenere un indirizzo è sufficiente fornire una stringa di 256 bit al posto di un punto della curva ellittica. Non vorrei dire una stupidaggine ma penso che il sistema bitcoin - blockchain sia del tutto indipendente dalla teoria delle curve ellittiche e dall'algoritmo di firma digitale ECDSA.


piu' o meno si... nel senso che il merkle tree di bitcoin funzionerebbe con qualsiasi altro sistema di crittografia, pero' fu scelto ECDSA perche
attualmente e' uno di quelli che garantisce alti livelli di sicurezza con chiavi corte... ad esempio con gli algoritmi basati su fattorizzazione tipo  RSA servono 1024 bit o piu' per
avere livelli decenti di sicurezza.... questo sarebbe drammatico per le dimesnioni della blockchain che gia' e' bella pesa...

Inoltre nei client adesso c'e' implementato tutto il codice per la ECDSA

ad esempio la OP_CHECKSIG fa il check presupponendo implicitamente questo particolare modo crittografia,
ossia non ha un parametro che dice "controlla usando  RSA" oppure "controlla usando il sistema di crittografia x"
quindi ci sarebbe da implementare pesantemente sui client .... ma teoricamente e' possibile.

legendary
Activity: 1914
Merit: 2071
January 26, 2016, 09:26:39 AM
#14
Riflettendo ora risulta molto chiaro il funzionamento dei vanity gen che permettono di essere sicuri.
Basta dare chiave pubblica e il miner vanity somma G alla chiave k volte fino ad ottenere l'indirizzo desiderato, comunica k al proprietario della chiave privata "n" e genera un indirizzo privato n+k  che magicamente diventa il vanity richiesto.

Dubbi residui:
- come critto un messaggio? Ossia poi, di fatto, come funziona?

Per quanto riguarda l'algoritmo ECDSA, sto preparando la spiegazione!

Non avevo mai pensato al funzionamento del vanity gen, in effetti dovrebbe essere proprio come lo hai descritto!


l'applicazione che porta da "private key" a E(Fp) è iniettiva? (in caso sarebbe anche suriettiva visto che hanno lo stesso numero di elementi).

Sì, una volta scelto il punto base G, detto per questo anche punto generatore di E(FP), c'è una corrispondenza biunivoca tra l'insieme dei naturali compresi tra 1 e n-1 e i punti della curva

Si fissa G (è stato scelto "Standards for Efficient Cryptography" (SEC), vedi http://www.secg.org/sec2-v2.pdf a pagina 9).
Fissato G, è univoco l'ordine con cui percorrere tutti i punti della curva:

1 --> G
2 --> 2*G
3 --> 3*G
..
..
n-1 --> (n-1)*G


la prima colonna è quella delle chiavi private (scalari)
la seconda colonna è quella delle chiavi pubbliche corrispondenti (punti di E(Fp)) (NB: lo scalare 0 non è considerato una chiave privata accettabile nel protocollo bitcoin, quindi 0*G ( o n*G, che è lo stesso) non lo ho inserito nelle possibilità.)

Per ogni chiave privata c'è un'unica chiave pubblica e viceversa.

Le 2 colonne hanno entrambe n-1 elementi (sono circa 2^256, un po' di meno di p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1 che è l'ordine del campo delle coordinate). La corrispondenza biunivoca tra i due insiemi è garantita dalla matematica che ho spiegato nei post precedenti (E(Fp) è un gruppo ciclico, l'elemento G è un generatore che permette di riottenere tutti gli altri punti)

La corrispondenza però non è più biunivoca se aggiungiamo una terza "colonna", quella degli indirizzi, che non c'entrano però con le curve ellittiche.

insieme scalari (fissato G)     <-->    insieme di punti di E(Fp)  -->   indirizzi


L'insieme degli indirizzi ha circa 2^160 elementi distinti possibili. Per passare dall'insieme E(Fp) all'insieme degli indirizzi ci sono 2 operazioni, un hash256 e un ripemd160 che traducono una stringa di 256 bit in una di 160 bit (la quale viene poi rappresentata in base 58, ma questo è solo un problema appunto di rappresentazione del risultato finale).

Quindi ci sono tantissime chiavi private (con relative chiave pubbliche) che producono lo stesso indirizzo.***

***EDIT2: in realtà c'è anche un altro problema quando traduciamo un punto della curva in un indirizzo. Poichè la funzione hash lavora in modo stupido solo sulla rappresentazione del punto, se scriviamo un punto di E(Fp) nella sua forma compressa (cioè con solo la coordinata x e il "segno" della y, aggiungendo come prefisso 02 se y è pari e 03 se y è dispari), avremo che lo stesso punto può essere tradotto in due indirizzi completamente diversi (ma controllati sempre dalla stessa chiave privata)

Riporto qui il passo dedicato alla questione in "Mastering Bitcoin"
Quote
Compressed public keys

As we saw previously, the public key is a point on the elliptic curve consisting of a pair of coordinates (x,y). It is usually presented with the prefix 04 followed by two 256-bit numbers, one for the x coordinate of the point, the other for the y coordinate. The prefix 04 is used to distinguish uncompressed public keys from compressed public keys that begin with a 02 or a 03.

Here’s the public key generated by the private key we created earlier, shown as the coordinates x and y:

x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

Here’s the same public key shown as a 520-bit number (130 hex digits) with the prefix 04 followed by x and then y coordinates, as 04 x y:

K=04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

Compressed public keys were introduced to bitcoin to reduce the size of transactions and conserve disk space on nodes that store the bitcoin blockchain database. Most transactions include the public key, required to validate the owner’s credentials and spend the bitcoin. Each public key requires 520 bits (prefix \+ x \+ y), which when multiplied by several hundred transactions per block, or tens of thousands of transactions per day, adds a significant amount of data to the blockchain.

As we saw in the section “Public Keys”, a public key is a point (x,y) on an elliptic curve. Because the curve expresses a mathematical function, a point on the curve represents a solution to the equation and, therefore, if we know the x coordinate we can calculate the y coordinate by solving the equation y2 mod p = (x3 + 7) mod p. That allows us to store only the x coordinate of the public key point, omitting the y coordinate and reducing the size of the key and the space required to store it by 256 bits. An almost 50% reduction in size in every transaction adds up to a lot of data saved over time!

Whereas uncompressed public keys have a prefix of 04, compressed public keys start with either a 02 or a 03 prefix. Let’s look at why there are two possible prefixes: because the left side of the equation is y2, that means the solution for y is a square root, which can have a positive or negative value. Visually, this means that the resulting y coordinate can be above the x-axis or below the x-axis. As you can see from the graph of the elliptic curve in Figure 4-2, the curve is symmetric, meaning it is reflected like a mirror by the x-axis. So, while we can omit the y coordinate we have to store the sign of y (positive or negative), or in other words, we have to remember if it was above or below the x-axis because each of those options represents a different point and a different public key. When calculating the elliptic curve in binary arithmetic on the finite field of prime order p, the y coordinate is either even or odd, which corresponds to the positive/negative sign as explained earlier. Therefore, to distinguish between the two possible values of y, we store a compressed public key with the prefix 02 if the y is even, and 03 if it is odd, allowing the software to correctly deduce the y coordinate from the x coordinate and uncompress the public key to the full coordinates of the point.

Here’s the same public key generated previously, shown as a compressed public key stored in 264 bits (66 hex digits) with the prefix 03 indicating the y coordinate is odd:

K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A

This compressed public key corresponds to the same private key, meaning that it is generated from the same private key. However, it looks different from the uncompressed public key. More importantly, if we convert this compressed public key to a bitcoin address using the double-hash function (RIPEMD160(SHA256(K))) it will produce a different bitcoin address. This can be confusing, because it means that a single private key can produce a public key expressed in two different formats (compressed and uncompressed) that produce two different bitcoin addresses. However, the private key is identical for both bitcoin addresses.


EDIT: a voler essere pignoli, per ottenere un indirizzo è sufficiente sostituire nel meccanismo una qualsiasi stringa di 256 bit al posto dell'hash256 delle coordinate di un punto della curva ellittica. Non vorrei dire una stupidaggine ma penso che il sistema bitcoin - blockchain sia del tutto indipendente dalla teoria delle curve ellittiche e dall'algoritmo di firma digitale ECDSA.
legendary
Activity: 2506
Merit: 1120
January 26, 2016, 05:02:17 AM
#13
Riflettendo ora risulta molto chiaro il funzionamento dei vanity gen che permettono di essere sicuri.
Basta dare chiave pubblica e il miner vanity somma G alla chiave k volte fino ad ottenere l'indirizzo desiderato, comunica k al proprietario della chiave privata "n" e genera un indirizzo privato n+k  che magicamente diventa il vanity richiesto.

Dubbi residui:
- come critto un messaggio? Ossia poi, di fatto, come funziona?
- l'applicazione che porta da "private key" a E(Fp) è iniettiva? (in caso sarebbe anche suriettiva visto che hanno lo stesso numero di elementi).
NB: Gran tread! Grazie.
legendary
Activity: 2506
Merit: 1120
January 25, 2016, 08:17:56 PM
#12
...
Nella secp256k1 si è deciso di partire dal punto G

G = 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
...
Scritto cosi' non si capisce bene, magari usa (Gx, Gy) tipo:
G =(79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,  483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8).

CIao
P
EDIT: sto punto G l'ho gia' sentito da qualche parte e mi pare sia anche quello un punto di partenza ma non ricordo dove ...
legendary
Activity: 1914
Merit: 2071
January 24, 2016, 03:55:41 PM
#11
...
mentre 2*A = A+A si ottiene così

x_2A=((3〖x^2〗_A)/(2y_A ))^2-〖2x〗_A
〖          y〗_2A=((3〖x^2〗_A)/(2y_A ))(x_A-x_2A )-y_A

NB: giova ricordare che tutte le operazioni sopra indicate vanno fatte modulo p nel caso della curva secp256k1 poichè le coordinate in quel caso sono elementi di Fp.
Non capisco i simboli 〖 ... 〗si puo' riscrivere senza?


Avevo copiato da Word e in effetti non si capiva molto. Guarda adesso se si capisce.
legendary
Activity: 2506
Merit: 1120
January 24, 2016, 01:19:40 PM
#10
...
mentre 2*A = A+A si ottiene così

x_2A=((3〖x^2〗_A)/(2y_A ))^2-〖2x〗_A
〖          y〗_2A=((3〖x^2〗_A)/(2y_A ))(x_A-x_2A )-y_A

NB: giova ricordare che tutte le operazioni sopra indicate vanno fatte modulo p nel caso della curva secp256k1 poichè le coordinate in quel caso sono elementi di Fp.
Non capisco i simboli 〖 ... 〗si puo' riscrivere senza?
legendary
Activity: 1914
Merit: 2071
January 24, 2016, 09:19:49 AM
#9
- come viene definita la somma nel gruppo E(K) tra le coppie (a, b) e (c, d) con a, b, c, d in K?
- qual'è l'elemento neutro del gruppo E(K) rispetto alla somma?

A queste due domande ho tentato di rispondere nei post 4 e 5 di questo thread.


- esiste un algoritmo per calcolare n*(a, b) con n, a, b in K, senza fare (a, b) + (a, b) ... + (a, b) n volte?

Certo, si basa proprio su n*(a,b), si tratta in sostanza di dividere n in 2^m passi e applicare ricorsivamente la formula di duplicazione 2*(a,b) (però per essere più preciso devo andare a cercarlo)
legendary
Activity: 2506
Merit: 1120
January 24, 2016, 07:03:05 AM
#8
Vediamo se riesco a comporre una domanda formalmente corretta. Sarebbe già un buon inizio ...
- come viene definita la somma nel gruppo E(K) tra le coppie (a, b) e (c, d) con a, b, c, d in K?
- qual'è l'elemento neutro del gruppo E(K) rispetto alla somma?
- esiste un algoritmo per calcolare n*(a, b) con n, a, b in K, senza fare (a, b) + (a, b) ... + (a, b) n volte?
legendary
Activity: 2506
Merit: 1120
January 24, 2016, 05:23:15 AM
#7
Intanto grazie del 3d.
Faccio le domande come a scuola ... ne approfitto!
... Le curve ellittiche in generale hanno equazione y^2 = Ax^3+Bx+C,  e poco hanno a che fare con l'ellisse, nonostante il loro nome. 

In giro si trova che dipende da solo due parametri, in pratica https://en.wikipedia.org/wiki/Elliptic_curve indica solo i tuoi B=a, C=b mentre A=1, y^2 ha coefficiente 1 in entrambe. Sono equivalenti le trattazioni?
legendary
Activity: 1914
Merit: 2071
January 24, 2016, 03:19:10 AM
#6



Crittografia e algoritmo ECDSA

La crittografia viene utilizzata per rendere possibili uno dei due seguenti scenari:

1.   A vuole mandare un messaggio segreto a B, in modo che solo B possa leggerne il contenuto (A deve codificare un messaggio mediante una chiave pubblicata da B e quindi nota a tutti, inviarlo a B che lo decodifica mediante la chiave privata che "inverte" l'azione di quella determinata chiave pubblica; in tutto questo processo il messaggio rimane segreto al resto del mondo)

2.   A  vuole inviare un messaggio pubblico a B; poichè il messaggio è pubblico A deve tutelare se stesso (e B) dal fatto che qualcun altro si interponga tra A e B e possa modificare il nome del mittente del messaggio o qualunque altra parte del messaggio stesso (A firma il messaggio con la sua chiave privata, lo invia a B che verifica a sua volta con la chiave pubblica relativa che il messaggio sia stato effettivamente firmato da chi possiede la chiave privata relativa e non sia stato modificato, in tutto questo processo il messaggio è sempre visibile al resto del mondo)

Nel sistema Bitcoin i messaggi si chiamano transazioni (perchè spostano del valore - rappresentato dalla moneta Bitcoin - da un utente a un altro). Quindi d'ora in poi considereremo i termini "messaggi" e "transazioni" come sinonimi.   Poichè tutte queste transazioni devono essere pubbliche, la crittografia nel sistema Bitcoin viene utilizzata per rispondere alle esigenze evidenziate nello scenario 2, cioè viene utilizzata per certificare di fronte a tutto il mondo che una transazione sia stata effettivamente effettuata dall'autore dichiarato nel messaggio e che la transazione non sia stata manomessa in alcuna sua parte.

Il metodo crittografico scelto per certificare le transazioni nel mondo dei Bitcoin si basa su un algoritmo di firma digitale che lavora con curve ellittiche detto ECDSA (Elliptic Curve Digital Signature Algorithm).

Le curve ellittiche entrano in scena nelle seguenti tre situazioni:

•   GENERAZIONE DI UNA CHIAVE PUBBLICA A PARTIRE DA UNA CHIAVE PRIVATA: quando si genera un indirizzo di un portafoglio; l'algebra delle curve ellittiche è alla base del meccanismo che permette di ricavare da una chiave privata una chiave pubblica; la chiave pubblica viene poi trasformata con un ulteriore passaggio (vedi http://gobittest.appspot.com/Address) in un indirizzo Bitcoin

•   FIRMA DIGITALE DI UNA TRANSAZIONE/MESSAGGIO CON LA CHIAVE PRIVATA: quando A deve effettuare un pagamento; A deve firmare mediante la propria chiave privata la transazione/messaggio di pagamento, per certificare in modo visibile a tutti la validità di questo atto di pagamento; la firma di A è necessaria per muovere dei fondi da un certo indirizzo, questa firma è ottenuta applicando in modo appropriato la chiave privata alla transazione (o meglio: al doppio hash della transazione) da eseguire

•   VERIFICA DELLA FIRMA DIGITALE MEDIANTE LA CHIAVE PUBBLICA: quando un nodo della rete, addetto alla convalida delle transazioni, alla trasmissione di quest'ultime alla rete e alla loro registrazione in un registro pubblico detto "block chain", deve verificare mediante la chiave pubblica che la transazione sia stata firmata effettivamente dalla chiave privata corrispondente (pur senza conoscerla) e che la transazione non sia stata modificata in alcuna sua parte



Generazione di una chiave pubblica a partire da una chiave privata


Si fissa un punto G della curva (che nel caso della secp256k1 è stato fissato dalla SEC), si sceglie un numero casuale d tra 1 e n - 1 (dove n è l'ordine di G), e si ottiene così la chiave pubblica P = d*G.

Facciamo un esempio nel caso semplificato di

E(F_11 )={(2,2),(2,-2),(3,1),(3,-1),(4,4),(4,-4),(5,0),(6,5),(6,-5),(7,3),(7,-3)}  ∪ {O}

Scegliamo un punto base. Proviamo con A = (2,2)

Osserviamo che o(A) = 4  (l'ordine di A) infatti

A+A=2*A=D    (vedi calcolo effettuato in precedenza,  D(5,0) )

A+A+A=3*A=2*A+A=D+A=A'



A+A+A+A= 4*A = 3*A+A = A'+A = O

Poichè A ha ordine un numero non primo, non è un buon candidato per essere scelto come punto base. (NB: in questo caso o(A) = 4, quindi il cofattore o(E) : o(A) sarebbe uguale a 3 )

Proviamo con B = (3,1). Si può verificare che esso ha periodo 12, cioè B genera tutto E(F_11) ( = E(F_11)) (NB: in questo caso il cofattore è 1, così come succede per la curva secp256k1, da ciò si deduce che E(F_11) è un gruppo ciclico, anche se non ha un numero primo di elementi).

Quindi:

E = E(F_11)  

G (il punto base della curva) = B

d (la chiave privata) = 4 (numero scelto a caso tra 1 e 11)

P (la chiave pubblica corrispondente a d=4) = 4*B = 2*(2*B) = (3,-1) .




Firma digitale di un messaggio mediante una chiave privata




Che cos'è una firma? E' una coppia di numeri r , s  (entrambi di lunghezza max 256 bit, minori di n) che si ottengono a partire da:

il messaggio m** , la chiave privata d, un numero casuale k

**ciò che si firma realmente non è il messaggio originale, ma una sua "impronta digitale" (detta "message digest", una stringa di 256 bit), impronta che è il risultato di un doppio hash del messaggio originale; nel caso particolare in cui si firma non un messaggio qualunque ma una transazione è da sottolineare come si effettua il doppio sha256 della transazione quando essa è ancora in una forma incompleta e non definitiva (è chiaro che nel momento in cui si firma una transazione la firma stessa non può essere già presente nella transazione stessa! Quindi a rigore in quel caso non si firma neanche tutto il messaggio, messaggio che però deve alla fine contenere anche la firma come sua parte essenziale --> a sottolineare la natura "spuria" della firma rispetto al resto della transazione è recentemente intervenuto il soft fork "segregated witness" (firma separata), dove di fatto la firma viene considerata una parte a se stante della transazione ed è trattata in modo particolare.

Algoritmo di verifica della firma

Date la coppia di firme (r, s) del messaggio m and la chiave pubblica P:

1.  Controllare che r e s appartengano entrambi all'intervallo [1,n-1]

2.  Calcolare e = hash(m)    

3. Calcolare w = s^-1  mod n
(qui si utilizza la seconda parte della firma)
  
4. Calcolare  u1 = e*w mod n,     u2 = r*w mod n
(qui si utilizza il messaggio m e la seconda parte della firma per u1, entrambe le parti della firma per u2)

5. Calcolare il punto X = (x0,y0) =  u1*G + u2*P  
 (se X è il punto all'infinito rifiuta; questo è il punto dove si utilizza la chiave pubblica P )

6. Convertire x0 in un intero e porre  v = x0 mod n.

7. Confronta v e r, se v = r allora la firma è corretta.


------------------------------------------------------------------------------------------------------------
Dimostriamo perchè questa verifica è corretta:

Notiamo innanzitutto che k = u1+u2*d, infatti:

k = s^-1 * (e + r*d)  (vedi punto 4 dell'algoritmo di firma)
  = s^-1*e + s^-1 * r*d = u1 + u2*d  mod n  (ricordiamo che   u1=s^-1*e ,  u2=s^-1*r )

Quindi X = u1*G + u2*P = u1*G + u2*d*G = (u1+u2*d)*G = k*G = X1  (ricordiamo che P = d*G ,  X1 = k*G),     ovvero X = X1
-------------------------------------------------------------------------------------------------------------

Nota bene: chi verifica non calcola mai esplicitamente nè k nè d, queste due informazioni rimangono sempre ignote;
chi verifica spezza il percorso che lo porta a X in due parti, cioè decompone k che non conosce in due parti:  k = u1 + u2*d  (il verificatore calcola solo u1 e u2, non conosce d e quindi nemmeno k!)

u1 = s^-1*e (termine che usa il contributo del messaggio e serve  per muoversi dal generatore G verso X)
u2 = s^-1 * r (questa parte serve per muoversi da P invece che da G sempre per raggiungere X; in questo modo il risultato corretto è ottenuto pur non conoscendo la chiave privata d)

Il verificatore grazie a s, che condensa diverse informazioni, riesce a determinare i seguenti due punti,
                                                           A = u1*G    e    B = u2*P
la somma di questi due punti deve dare finalmente X

Alla fine si ottiene quindi che il verificatore ha ricostruito con le informazioni in suo possesso l'identità del punto X che coincide con il punto X1 da cui è partito colui che ha fatto la firma, quindi x0 = x1  ( v = r   mod n )

Riassumendo:

chi fa la firma determina un punto X casuale e fornisce pubblicamente la posizione di X (prima parte della firma), il messaggio, la chiave pubblica e un valore s (seconda parte della firma) che dipende dalla posizione di X, dal messaggio e dalla chiave privata d

chi verifica l'autenticità del messaggio, verifica se, partendo dalla seconda parte della firma s, riesce a invertire il processo per riottenere la prima parte della firma r (che corrisponde alla posizione di X, già nota); per invertire questo processo deve utilizzare due informazioni base: il messaggio m e la chiave pubblica P.



Note finali:

1) quando si firma un messaggio vero e proprio (non una transazione) con un client bitcoin tipo Bitcoin Core viene richiesto esplicitamente di inserire l'indirizzo di chi sta firmando. Bitcoin Core infatti provvede a recuperare la chiave privata associata all'indirizzo in automatico (NB: è possibile firmare solo con un indirizzo di cui si possiede la chiave privata!).
Anche nel caso della verifica, però, viene richiesto solo l'indirizzo, non la chiave pubblica. Ma come è possibile recuperare la chiave pubblica dall'indirizzo? In generale non è possibile. Però nel caso in cui si abbiano a disposizione, oltre all'indirizzo, la firma e il messaggio stesso allora si può ricostruire la chiave pubblica, infatti:

               X = u1*G + u2*P -->  X = s^-1*e*G + s^-1*r*P  

in quest'ultima equazione il destinatario del messaggio che deve effettuare la verifica ha a disposizione tutti i valori tranne uno,  P, che costituisce quindi l'incognita dell'equazione e che si ricava quindi in funzione degli altri dati:

s*X = e*G + r*P
r*P = s*X - e*G
                                P = r^-1 (s*X - e*G)

A questo punto chi verifica si limita a trasformare la chiave pubblica P nell'indirizzo corrispondente e a controllare infine se quest'ultimo coincide con l'indirizzo che gli è stato trasmesso.

Quindi nel caso di un messaggio normale firmato con una chiave bitcoin la verifica non consiste più nel ricavare r a partire da s e da P (oltre che da m), ma invece consiste nel ricavare la chiave pubblica P dalla firma r,s (e dal messaggio m) e nel confrontare quindi l'indirizzo che P genera con quello inviato in chiaro dal firmatario.

2) se (r,s) è una firma valida per il messaggio m, lo è anche (r,-s)  (sostanzialmente il verificatore che parte da -s trova -X1, ma due punti opposti X1 e -X1 hanno sempre la stessa ascissa, quindi anche da -s si riottene sempre r).

Questo fatto consentiva, fino a qualche tempo fa, di prendere una transazione che arrivava nella mempool (quindi una transazione non ancora confermata) e modificare il segno di s. Questa modifica non cambiava di una virgola address di partenza, importo e address di arrivo della transazione, ma provocava un cambio del TXID (cioè del codice identificativo della transazione), che è un hash della transazione intera, firma compresa. In questo caso si parla di "Transaction Malleability".

Bitcoin Core dalla versione 0.11.1 non consente più questa flessibilità che poteva portare problemi:

Quote
Inherent ECDSA signature malleability We require that the S value inside ECDSA signatures is at most the curve order divided by 2 (essentially restricting this value to its lower half range). See reference: Low S values in signatures

quindi all'algoritmo della firma, per precisione, va aggiunto adesso un ulteriore passaggio:

se s è maggiore di (n+1)/2 allora sostituisci s con (n - s)

le versioni più recenti di Bitcoin Core non propagano più quindi transazioni nelle quali le firme presentano una s maggiore di (n+1)/2.





Esempio pratico di firma e verifica utilizzando l'algoritmo ECDSA applicato alla curva secp256k1
legendary
Activity: 1914
Merit: 2071
January 24, 2016, 03:18:54 AM
#5
Addizione tra 2 punti in E(F_11): esempio


Vediamo di costruire come esempio il gruppo E(F_11), cioè il gruppo di elementi della curva di equazione y^2=x^3+7 a coordinate in F_11.

Proviamo tutti i casi possibili:

x   x^3+7   x^3+7 mod 11    Sqrt(x^3+7) mod 11   
0   7                   7      
1   8                   8      
2   15                   4                     2 o 9        2 o -2   --> (2,2), (2,-2)
3   34                   1                    1 o 10      1 o -1  -->  (3,1), (3, -1)
4   71                   5                    4 o 7        4 o -4  -->  (4,4),(4,-4)        
5   132                   0                        0               0      -->  (5,0)
6   223                   3                    5 o 6        5 o -5   -->  (6,5),(6,-5)
7   350                   9                    3 o 8        3 o -3   --> (7,3),(7,-3)
8   519                   2      
9   736                  10      
10   1007                  6      

Abbiamo quindi trovato che
 
E(F_11 )={(2,2),(2,-2),(3,1),(3,-1),(4,4),(4,-4),(5,0),(6,5),(6,-5),(7,3),(7,-3)}  ∪{O}

Si noti che in questo caso particolare l'ordine del gruppo E(F_11) è 12 ed è superiore al numero degli elementi di F_11, mentre con la curva secp256k1 l'ordine di E(K) è minore (seppur dello stesso ordine di grandezza) del numero degli elementi di K.  

Viene comunque rispettata la stima di Hasse:    |#E (Fp) - (p + 1)| < 2rad(p)
infatti                                                                                      
                                                                                     |12-12|<2*sqrt(11)

Visualizzazione nel piano cartesiano di E(F_11 ):




Si noti come E(F_11) non costituisca visivamente un sottoinsieme di E(R), poichè bisogna tenere conto anche del modulo 11.

Nel grafico si è scelto di rappresentare gli 11 valori possibili per la coordinata y tra -5 e +6 anzichè tra 0 e 10 per mantenere visivamente la simmetria rispetto all'asse x. Si noti come questo insieme di punti non costituisca affatto un sottoinsieme dei punti della curva a coefficienti reali che soddisfa la stessa equazione; infatti il campo di "gioco" adesso è costituito da una griglia di punti a coordinate intere (11 valori possibili per le x, 11 per le y), e ogni volta che il calcolo di x^3+7 fa "sforare" una coordinata da un lato del quadrato si ricomincia dal lato opposto - questo vuol dire lavorare in modulo 11.

Da questo grafico si evince inoltre come l'operazione di "addizione" tra punti perda il significato geometrico originale in questa situazione (non ci sono curve con secanti e tangenti nel senso classico di questi termini), anche se sorprendemente l'operazione algebrica sulle coordinate determina ancora una struttura di gruppo per l'insieme E(F_11)

Addizione tra 2 punti in E(F_11)

A=(2,2)  B=(3,1)  A+B = ?
 


Quindi A+B=F

In questo caso particolare il risultato era facilmente prevedibile per via geometrica, poichè per passare da A, B, F' e F  non si  "rimbalza" mai sui lati di questo particolare biliardo quadrato.




Ma se volessimo addizionare A e F, cosa otterremmo?
A=(2,2) e F=(7,3);  A+F=?



(La pendenza sarebbe 1:5, cioè l'inverso di 5 che in F_11 corrisponde a 9 (poichè 9*5=45=1 modulo 11)

Quindi A+F=E'



Come si può notare, in questo particolare biliardo se si tocca un lato si riparte dalla parte opposta (oppure se preferite potete pensare di stare avvolgendo uno spago intorno a un rocchetto a forma di ciambella, con "pendenza" del filo costante uguale a quella del tratto iniziale AF, e lo scopo è di continuare così fino a intercettare un altro punto del gruppo che si trova sulla superficie della ciambella. A priori non è noto quanti avvolgimenti (diagonali) bisogna fare intorno al rocchetto prima di raggiungere un altro punto, in questo caso è bastato solo 1 avvolgimento.) E' proprio il tipo di relazione non banale tra il punto di partenza e quello di arrivo (pur essendo nota la "direzione" iniziale) a rendere crittograficamente interessanti le curve ellittiche.


Infine calcoliamo un "multiplo" di un punto, per esempio 2*A, utilizzando le formule appropriate:

A=(2,2)      2*A=



Quindi 2*A = D.





La creazione di una chiave pubblica (individuare un punto della curva) procede proprio in questo modo: si parte da un punto G (detto generatore del gruppo), lo si moltiplica per uno scalare random d (la chiave privata) e quindi si ottiene la chiave pubblica d*G (un punto della curva). Pur essendo noti a tutti sia il punto G che la chiave pubblica d*G, è computazionalmente intrattabile il problema di ricavare il legame tra G e d*G, cioè di fatto è impossibile ricavare la chiave privata d che corrisponde al numero di volte in cui bisogna sommare G a se stesso per ottenere la chiave pubblica.
legendary
Activity: 1914
Merit: 2071
January 24, 2016, 03:18:44 AM
#4
Addizione tra 2 punti in E(R): definizione


Per capire meglio la struttura di E(K) dobbiamo però definire meglio l'operazione di addizione tra punti che caratterizza questo gruppo ciclico.


Visualizziamo la curva di equazione y^2=x^3+7 (per ora lasciamo "libere" le coordinate di assumere valori reali, quindi per adesso lavoriamo in E(R)):



Cosa vuol dire "sommare" due punti A e B di questa curva?
Si definisce C := A+B il punto della curva che si ottiene nel seguente modo:
1)   si considera la terza intersezione della retta che passa per A e B con la curva (questa retta interseca quasi* sempre la curva in un terzo punto)
2)   si prende il simmetrico del punto così ottenuto rispetto all'asse x (che appartiene ancora alla curva, in quanto essa stessa è simmetrica rispetto all'asse x)



In questo modo si definisce un'operazione "somma" tra i punti della curva che dà come risultato sempre un altro punto della curva; bisogna poi verificare che questa operazione sia anche associativa (e lo è, inoltre è anche evidentemente commutativa), che esista l'elemento neutro* e che ogni elemento abbia il suo inverso. Si ha quindi che E(R)** è un gruppo abeliano (vuol dire commutativo).

Alcune note:

*se si considerano due punti simmetrici rispetto all'asse x, in quel caso la retta che li unisce è parallela all'asse y; poichè la somma di due punti deve dare come risultato sempre un altro punto del gruppo, si deve aggiungere ai punti della curva un punto O all'infinito che diventa lo zero (l'elemento neutro) di questo gruppo;  ne consegue che due punti che sono simmetrici rispetto all'asse x sono uno l'opposto dell'altro, poichè la loro somma dà O come risultato
                                          
                                                                  O=A+B




Ma per sommare invece un punto A a se stesso, come scegliere la direzione della retta passante per A?
Basta prendere la tangente alla curva proprio in A:



**una caratteristica notevole delle curve ellittiche è che anche se i valori delle coordinate appartengono a un sottocampo di R, i punti così ottenuti costituiscono ancora un gruppo utilizzando la stessa operazione somma definita in precedenza (E(K) è quindi un sottogruppo di E(R)). Nel caso di E(K), come abbiamo già visto in precedenza, esso è un gruppo ciclico (quindi abeliano) e ha inoltre un numero primo di elementi, si tratta cioè di un gruppo i cui elementi si possono tutti generare a partire da un qualsiasi suo elemento G ≠ 0:

G                              = 1*G              
G+G                          = 2*G
G+G+G                     =  3*G
G+G+G+G                 =  4*G
............
G+G+G+......+G        = (n-1)*G
G+G+G+.....+G+G    =  n*G  = 0 (che è come dire che (n-1)*G è l'opposto di G!)



L'operazione "somma", che ha in origine una costruzione puramente geometrica, si può tradurre nelle seguenti formule utilizzando la geometria analitica:




NB: giova ricordare che tutte le operazioni sopra indicate vanno fatte modulo p nel caso della curva secp256k1 poichè le coordinate in quel caso sono elementi di Fp.
Dovevo specificare che:

NB2:
se A è diverso da B, e xA = xB allora A+B = 0 (punto all'infinito), quindi in tal caso non si applica la formula della somma di due punti (semplicemente una retta verticale non ha coefficiente angolare, quindi è inutile tentare di dividere per 0)

se A = B, e yA=0 allora A+B=2A = 0 (punto all'infinito), quindi in tal caso non si applica la formula di duplicazione (questo caso può essere visto come un caso particolare del caso precedente)

Osservazione:

A e B sono opposti se e solo se A=m*G e B=(n-m)*G, in tal caso infatti A+B = m*G + (n-m)*G = n*G = zero

ma A e B sono opposti, per costruzione geometrica, anche se e solo se hanno stessa x e y opposta (o y=0)

da ciò si deduce che se m è la chiave privata relativa al punto A(x,y), allora n-m è la chiave privata relativa al punto simmetrico A'(x,-y).



legendary
Activity: 1914
Merit: 2071
January 24, 2016, 03:18:34 AM
#3
Teoremi sulle curve ellittiche


Per le curve ellittiche in generale, valgono i seguenti tre teoremi:

1) Sia K un campo e supponiamo che sia data una curva ellittica E di equazione:

y^2=x^3 + Ax + B,  con A, B appartenenti a K

Sia E(K) l'insieme dei punti della curva E a coordinate in K
E(K) = (x,y) in E, con x,y in K   a cui si aggiunge il punto O (punto all'infinito)

Allora E(K) è un sottogruppo del gruppo di tutti i possibili punti di E (dove con E possiamo pensare a E(R) con R insieme dei numeri reali)  (teorema di Poincarè, intorno al 1900)


2) Se Fp è un campo finito, allora il gruppo dei punti E(Fp) è sempre o ciclico o prodotto di due gruppi ciclici.


3) Sia E l'insieme dei punti della curva ellittica
y^2= x^3+ Ax + B    con  A,B coordinate in Fp.

Allora |#E (Fp) - (p + 1)|< 2rad(p)
(stima sul numero di punti di E(Fp) di Hasse, 1922)

Il primo teorema ci assicura un fatto notevole, e cioè che l'insieme dei punti di una qualsiasi curva ellittica a coordinate in un campo finito costituisce sempre un gruppo (vedremo rispetto a quale operazione di "addizione" particolare)  

Questo fatto è sensazionale, cioè se definisco un'operazione algebrica su E(R) (cioè sulla classica curva nel piano cartesiano), poi con la stessa operazione su E(K), dove K è un qualsiasi sottocampo di R, sono sicuro di trovare ancora un sottogruppo di E(R),  cioè sono sicuro ad esempio che la somma di 2 punti sulla curva a coordinate in F7 è ancora un punto a coordinate in F7 che sta sulla curva !

Il secondo teorema ci dice qualcosa di importante sulla struttura algebrica di E(Fp) (nel caso specifico della secp256k1, i punti della curva costituiscono proprio un gruppo ciclico)

Il terzo teorema ci fornisce una stima sul numero degli elementi di questo gruppo, stima che si basa sul numero degli elementi del campo delle coordinate. In sostanza esso ci dice che la differenza tra il numero n dei punti della curva e il numero p degli elementi del campo è trascurabile rispetto al numero p degli elementi del campo. Quindi dal momento che il nostro campo Fp ha p elementi, allora anche la curva E(Fp) dovrà avere un numero n di elementi che è all'incirca pari a p più o meno 2 radice di p.
 
Per l'uso crittografico però non è sufficiente la stima ma bisogna conoscere il numero esatto degli elementi (e in generale non è affatto banale riuscire a calcolare questo numero).

Nel caso della curva secp256k1 i suoi punti costituiscono un gruppo ciclico e il numero dei suoi elementi (è sempre un numero primo) è  

n=115792089237316195423570985008687907852837564279074904382605163141518161494337
  
Se confrontiamo n con p

n=115792089237316195423570985008687907852837564279074904382605163141518161494337  (numero di punti, compreso il punto all'infinito)
p=115792089237316195423570985008687907853269984665640564039457584007908834671663  (valori possibili per le coordinate dei punti)

osserviamo che il numero di punti della curva è dello stesso ordine di grandezza del numero degli elementi del campo (un po' inferiore, la differenza è dell'ordine di radice di p).
Il numero di punti è importantissimo, poichè ci fornisce il periodo del gruppo che è lo "spazio" all'interno del quale girano gli algoritmi di firma digitale. Da notare che n (come p) è rappresentabile mediante una stringa di 256 bit (da qui il nome secp256k1), misura comoda per l'implementazione nel calcolatore.
Il numero di elementi di questo gruppo è quindi all'incirca simile al numero degli elementi del campo.


A questo punto potremmo anche chiederci quanti sono i diversi valori che effettivamente sono assunti dalle coordinate x e y dei punti della curva.

Per stabilire quanti sono gli elementi x che vengono mappati in y dalla funzione:

y = sqrt(x^3 + 7)

dobbiamo prendere il numero n - 1 (il numero dei punti che hanno effettivamente le coordinate in Fp e che corrisponde quindi al massimo numero di potenziali valori distinti sia per x che per y) e dividerlo per 2 : per ogni valore effettivamente assunto dalla coordinata x di un punto infatti ci sono due possibili valori di y, y = sqrt(x^3 + 7) e y = - sqrt(x^3 + 7) , ricordiamo che l'equazione da soddisfare è y^2 = x^3 + 7 mod p, ovvero per ogni x tale che x^3 + 7 ammetta la radice quadrata in Fp ci sono 2 radici quadrate (2 valori possibili di y).

Quindi avremo (n - 1) / 2 valori distinti per x (si noti che questo equivale a dire che all'incirca poco meno della metà dei valori di Fp sono assunti dalla coordinata x dei punti della curva dal momento che p è poco più grande di n).

Per quanto riguarda invece il numero dei diversi valori assunti dalla coordinata y, bisogna prendere n - 1 e dividerlo per 3 (per dettagli sul motivo si veda questo post)
legendary
Activity: 1914
Merit: 2071
January 24, 2016, 03:18:24 AM
#2
Definizioni di algebra


Un campo è un insieme di elementi (numeri) per i quali sono definite due operazioni matematiche - addizione e moltiplicazione - ciascuna delle quali applicata a ogni coppia di elementi dell'insieme dà come risultato un elemento dell'insieme stesso.

Le due operazioni devono soddisfare la proprietà associativa e commutativa, deve valere la proprietà distributiva della moltiplicazione rispetto all'addizione, infine per ogni elemento del campo deve essere presente nel campo stesso il suo opposto (un numero che sommato al primo dà come risultato il numero 0, elemento neutro dell'addizione) e per ogni elemento del campo (tranne lo 0) deve essere presente anche il suo inverso (un numero che moltiplicato al primo dà come risultato 1, l'elemento neutro della moltiplicazione). In sostanza l'esistenza degli opposti e degli inversi è un po' come dire che sono implicitamente definite anche le operazioni di sottrazione (a - b = a + (-b)) e di divisione per un elemento diverso dallo zero ( a / b = a * b^(-1)).

Per fare degli esempi, l'insieme dei numeri naturali con le usuali operazioni di addizione e moltiplicazione non è un campo, poichè nessun altro numero naturale a parte lo 0 ha il suo opposto all'interno di quell'insieme (in maniera equivalente, l'insieme dei naturali non è chiuso rispetto alla sottrazione); l'insieme dei numeri interi relativi non è un campo perchè a parte il numero 1 nessun altro numero ha il suo reciproco (non è chiuso rispetto alla divisione). L'insieme dei numeri razionali è invece un campo infinito, così come lo è l'insieme dei numeri reali.

Un'ultima osservazione sul numero di elementi che compongono il campo finito K a cui appartengono le coordinate dei punti della curva secp256k1; questo numero è
  
                                              
p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1

dove p sta a indicare che si tratta di un numero primo; per la teoria dei campi ogni campo finito deve avere un numero di elementi che sia primo (p) o potenza di un primo (p^n).
Nel caso della secp256k1, E = E(Fp), Fp è il campo delle coordinate, dove p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1, quindi siamo nel primo caso.


Un gruppo è un insieme in cui è definita una sola operazione che soddisfa la proprietà associativa, è presente l'elemento neutro rispetto a quella operazione e inoltre il gruppo contiene l'inverso di ogni suo elemento.

Quindi per quanto detto in precedenza:

1) un campo K  è un gruppo commutativo rispetto all'operazione di addizione
2)  K - {l'elemento neutro dell'addizione} è un gruppo commutativo rispetto all'operazione di moltiplicazione


Ordine di un gruppo


Sia G un gruppo. L'ordine di G è il numero (finito o infinito) degli elementi di G e si indica con o(G).

Ordine di un elemento di un gruppo

Sia G un gruppo con elemento neutro "e".  Sia "a" un elemento di G diverso da "e".
L'ordine (additivo) di a è il più piccolo intero positivo n tale che a+a+a+a+....+a = n*a= e, se tale intero n non esiste si dice che a ha ordine infinito. L'ordine di a (finito o infinito) si indica con o(a).

(l'espressione "ordine di un elemento a" deriva dal fatto che scegliere un punto a di partenza (un generatore) equivale di fatto a imporre un ordine con cui descrivere tutti gli altri elementi del gruppo: 2*a, 3*a, 4*a, 5*a, ... ordine che dipende quindi dal punto di vista particolare di a; l'insieme dei punti della curva secp256k1 costituisce un gruppo additivo, e gli scalari 2, 3, 4, 5, ... rappresentano l''ordine' con cui si ottengono i vari punti a partire da un punto particolare chiamato "g", il generatore della curva scelto dalla SEC. I 'numeri d'ordine' 2, 3, 4, 5,... corrispondono alle chiavi private dei punti/chiavi pubbliche: 2*g, 3*g, 4*g, 5*g, ...).

NB: se invece consideriamo un gruppo G moltiplicativo, allora l'ordine (moltiplicativo) di un elemento a è per analogia il più piccolo intero positivo m tale che a*a*a*...*a = a^m = e , dove 'e = 1' in questo caso è l'elemento neutro della moltiplicazione.


Dato un elemento 'a' di ordine m, l'insieme {a^0 = 1, a^1, a^2, ...., a^(m-1)} è a sua volta un sottogruppo di G.  Se esiste almeno un elemento 'a' il cui ordine coincide con l'ordine del gruppo, allora 'a' si dice generatore del gruppo, poichè il sottogruppo di G generato dalle potenze di 'a' coincide con G stesso. Notazione: = G.
In questo caso G si dice
gruppo ciclico. I gruppi ciclici sono tutti isomorfi a Zp (o a Z se hanno ordine infinito).

Nel caso del gruppo G dei punti della curva secp256k1, esso è un gruppo ciclico di ordine n rispetto all'operazione di addizione, e l'elemento g scelto dalla SEC si chiama appunto generatore della curva perchè = G (il generato di g coincide con G e per costruzione tutti i generati sono gruppi ciclici perchè ottenuti appunto facendo il 'ciclo' su tutte le potenze/multipli di un elemento dato).

  = {g, g+g, g+g+g, 4*g, 5*g, ....., (n-1)*g} = G = E(Fp)   (si noti in questo caso la notazione additiva anzichè quella moltiplicativa)

Ma n è primo, e questo fatto conferisce un'ulteriore importante proprietà algebrica a questa curva: poichè n è primo si può dedurre che ogni elemento di G escluso lo 'zero' (il punto all'infinito) genera mediante tutti i suoi multipli tutto G.

Questo fatto in generale non è vero per tutti i gruppi ciclici, ovvero un gruppo per essere ciclico deve avere almeno un elemento il cui ordine coincide con quello del gruppo stesso, ma non è detto che tutti gli altri elementi del gruppo diversi dall'elemento neutro abbiano questa proprietà.

Si può dimostrare però una relazione interessante (e banale a livello aritmetico) tra l'ordine di un gruppo finito e l'ordine possibile di un qualsiasi suo elemento (ovvero: c'è una relazione precisa tra l'ordine del gruppo finito e l'ordine di un suo qualsiasi sottogruppo).


Teorema di Lagrange

Il teorema di Lagrange è un teorema basilare nello studio dei gruppi finiti. Esso afferma che ogni sottogruppo di un gruppo finito ha ordine (cioè ha un numero di elementi) che divide l'ordine del gruppo (cioè il numero di elementi del gruppo).

|G|=|A| * |G:A|  per ogni sottogruppo A di G (|A| indica il numero di elementi di A, per G:A vedere qui  e qui ma si tratta di dettagli non importanti al fine della comprensione del nostro discorso).

NB:
Tecnicamente si dice che l'ordine del sottogruppo deve dividere l'ordine del gruppo, e il risultato del rapporto ordine del gruppo / ordine del sottogruppo (numero elementi del gruppo / numero elementi del sottogruppo) è un numero intero detto "cofattore". Se si va qui (https://en.bitcoin.it/wiki/Secp256k1 si osservi il parametro h nell'ultima riga) si vedrà che nella secp256k1 il cofattore del gruppo generato dal punto base è uguale a 1, cioè l'ordine del punto base scelto dalla SEC è esattamente uguale all'ordine di E(Fp), entrambi sono n.


Ma questo fatto non è un caso: la curva secp256k1 infatti costituisce un gruppo finito con un numero primo n di elementi, e ora grazie al teorema di Lagrange possiamo dedurre da questo fatto che

1) G è ciclico poichè un suo elemento diverso da 0 deve avere ordine maggiore di 1 (altrimenti non genera un sottogruppo) e l'unico ordine maggiore di 1 che sia anche divisore di 'n' primo è 'n' stesso.

2) l'ordine di ogni suo elemento (a parte lo 0) deve coincidere per forza con l'ordine del gruppo (che essendo primo non ha altri divisori all'infuori di se stesso), cioè è possibile generare ogni elemento del gruppo a partire da un qualsiasi altro suo elemento (elemento neutro escluso). La scelta del punto base della SEC quindi è del tutto arbitraria (qualsiasi altro punto sarebbe andato bene).

3) per ogni elemento a di G vale che a^ordine(G) = 'e'  (elemento neutro). Questo fatto è la traduzione del punto 2) e si ottiene applicando semplicemente la definizione di ordine di un elemento.

quest'ultima equazione nel caso della curva G si declina osservando che n*a = punto all'infinito per ogni a di G, nel caso del campo Fp delle sue coordinate diventa in notazione moltiplicativa a^(p-1) = 1 mod p (si vedano le prossime righe per la spiegazione, e qui per le ricadute pratiche a livello di calcoli)


Teoria dei campi finiti

Nel caso dei campi, che ripetiamo sono gruppi commutativi rispetto all'operazione di addizione e, tolto lo zero, sono anche gruppi commutativi rispetto alla moltiplicazione, è sempre bene specificare quando si parla di ordine di un elemento se si intende ordine additivo o ordine moltiplicativo.

Nel caso di Fp, il campo delle coordinate della nostra curva, l'ordine additivo di ogni elemento 'a' è p, mentre l'ordine moltiplicativo è p - 1.
Questo implica che

1) a+a+a+....+a = p*a = 0  mod p

2) a*a*a*a*...*a = a^(p-1) = 1  mod p

Dall'ultima uguaglianza si ricava anche che a^(p-2) = a^-1 mod p, ovvero si ricava un modo pratico (anche se computazionalmente oneroso) per calcolare l'inverso di ogni elemento. Per un metodo più efficiente si veda l'identità di Bezout (pagg. 43 -45, soprattutto l'esempio pratico 3.35) e l'algoritmo che implementa il tutto.

Per la teoria dei campi ogni campo finito deve avere un numero di elementi che sia primo (p) o potenza di un primo (p^n).

Se il campo ha un numero primo di elementi allora è un gruppo ciclico (rispetto all'operazione di addizione) ed è isomorfo a  Z/pZ , cioè dal punto di vista delle sue proprietà algebriche è equivalente al campo delle classi di resto modulo p. In particolare quindi il campo Fp delle coordinate della nostra curva è isomorfo a Z/pZ.  

Ma si può dimostrare anche che Fp - {0} è un gruppo ciclico rispetto all'operazione di moltiplicazione pur avendo p-1 elementi (cioè un numero pari di elementi).



Cosa vuol dire campo delle classi dei resti delle divisioni tra interi modulo p? (per una trattazione esaustiva si veda qui)

Facciamo un esempio nel caso p=5,  Z/5Z = { [ 0], [1], [2], [3], [4]}

Perchè le parentesi quadre? Perchè 3 = 8 = -2 = 28 = 23 = 33 = -7 = --- --> tutti questi numeri sono equivalenti poichè si possono scrivere nella forma  3 + 5*k  per qualche k intero, ovvero diminuiti di 3 sono tutti multipli di 5.

Quindi poichè i resti delle divisioni di tutti questi numeri per 5 sono tutti uguali a 3 si introduce la classe di equivalenza dei numeri interi per i quali i resti della divisione per 5 coincidono appunto con 3 --> { 3, 8, 13, 18, 23, 28, 33, ....., -2, -7, -12, -17, ....} = [3]  

L'insieme di tutte queste classi di equivalenza (con i resti che possono variare quindi tra 0 e 4) si indica con Z5.


addizioni: [2]+[3] = [ 0], poichè (2 + k1*5) + (3 + k2*5) = 5 + (k1+k2)* 5 = 0 + (1+k1+k2)*5  = [ 0]

analogamente (trascuro le parentesi per comodità):  3+4=2, poichè 3+4=7 e 7 equivale a 2 modulo 5.

moltiplicazioni: 2*3=1, poichè 2*3=6 e 6 equivale a 1 in questo campo.
legendary
Activity: 1914
Merit: 2071
January 24, 2016, 03:18:13 AM
#1
Indice:






Curve ellittiche: punti, coordinate, scalari:

Vediamo una breve trattazione matematica delle curva secp256k1 (così chiamata, secondo la classicazione "Standards for Efficient Cryptography" (SEC), vedi http://www.secg.org/sec2-v2.pdf a pagina 9), la curva impiegata nel protocollo Bitcoin.

Le curve ellittiche in generale hanno equazione ,  e poco hanno a che fare con l'ellisse, nonostante il loro nome.  

In particolare la curva ellittica secp256k1 utilizzata nel mondo Bitcoin è la curva di equazione:


cioè è l'insieme dei punti P(x,y) del "piano cartesiano" le cui coordinate x e y soddisfano quell'equazione particolare.  


Le coordinate dei punti delle curve ellittiche

I valori che può assumere la coordinata x (e di conseguenza anche la coordinata y) non sono però tutti gli infiniti valori reali (come succede invece a scuola quando si studiano le rette o le parabole ) ma sono solo i valori che corrispondono a elementi di un insieme molto particolare, detto campo, che indicheremo con . Quindi quando parliamo di "piano cartesiano" intendiamo in realtà i punti (coppie di coordinate) che appartengono al prodotto cartesiano .
Anche i numeri reali costituiscono un campo, nel caso della secp256k1 "ovviamente" è un sottoinsieme finito di , ma rimane sempre un campo ("ovviamente" nel senso che applicazioni pratiche e infinito non vanno d'accordo!)

Quindi i punti della curva secp256k1 hanno come coordinate possibili solo gli elementi del campo finito .


I punti della curva secp256k1


I punti della curva costituiscono a loro volta un insieme finito (ovviamente, visto che le coordinate possibili di questi punti sono in numero finito) detto gruppo, che indicheremo con o . Per quanto detto prima è un sottoinsieme di .
Si dimostra che E(Fp) è un gruppo ciclico; inoltre il numero di elementi di questo gruppo è a sua volta un numero primo che è all'incirca simile al numero totale degli elementi del campo (ma non è uguale, sono 2 numeri primi diversi, vedi approfondimenti)


Oltre alle coordinate (campo K) e ai punti della curva (gruppo ciclico E(K)), è presente una terza tipologia di elementi, che non hanno dietro una struttura algebrica a differenza degli elementi citati finora: gli scalari.

Gli scalari

Dove intervengono gli scalari?

Esempio: quando sommiamo un punto A con se stesso 7 volte:

A+A+A+A+A+A+A

possiamo indicare questa somma come 7*A.
Gli scalari quindi in questo contesto sono sostanzialmente dei semplici numeri interi che servono solo come contatori e che non hanno alcuna struttura algebrica dietro.  Gli scalari in questo caso sono importantissimi però poichè è proprio su quest'ultimi che lavora in gran parte l'algoritmo di firma digitale. In sostanza gli scalari tengono conto di quanti "movimenti" abbiamo fatto nello spazio dei punti del gruppo ciclico E(K).

Le chiavi private sono esse stesse degli scalari! (mentre le chiavi pubbliche sono punti della curva).


Nel nostro caso, i punti della secp256k1 costituiscono quindi un gruppo ciclico formato da un numero primo di elementi, da ciò si ottiene che partendo da un punto qualsiasi della curva (diverso dallo 0) si possono ottenere tutti gli altri punti della curva (vedere il post 2 sulle considerazioni matematiche).

Nella secp256k1 si è deciso di partire dal punto G = (Gx, Gy):

G = (55066263022277343669578718895168534326250603453777594175500187360389116729240,
      32670510020758816978083085130507043184471273380659243275938904335757337482424)

Si osservi innanzitutto che entrambe le coordinate sono minori di p=115792089237316195423570985008687907853269984665640564039457584007908834671663

Facciamo un rapido controllo per verificare che G appartenga veramente alla curva seckp256k1, ovvero che Gx^3+7-Gy^2 sia uguale a 0 modulo p:



tutto ok!

Da G è possibile raggiungere tutti gli altri punti della curva moltiplicando il punto G stesso per uno scalare qualsiasi che va da 1 a n
(n = 115792089237316195423570985008687907852837564279074904382605163141518161494337)

G                              = 1*G              
G+G                          = 2*G
G+G+G                     =  3*G
G+G+G+G                 =  4*G
............
G+G+G+......+G        = (n-1)*G
G+G+G+.....+G+G    =  n*G  = 0  

L'espressione "moltiplicare G per uno scalare s" è solo un altro modo di dire "sommare il punto base G a se stesso s volte"

s è la chiave privata che il vostro software wallet pesca random tra 1 e n-1, s*G è la chiave pubblica relativa

NB: le chiavi private "0" o "n" non sono valori consentiti nell'ECDSA, quindi se inviate bitcoin all'indirizzo che si ottiene facendo l'hash del punto all'infinito che è associato a quegli scalari (punto che per pura convenzione si rappresenta mediante le coordinate (0,0)), nessuno sarà in grado di spendere quei bitcoin, poichè la chiave privata "0" (oppure "n") nonostante matematicamente sia associata al punto all'infinito non è considerata valida per firmare le transazioni.
Jump to: