Appunti di Crittografia Gerardo Pelosi Dipartimento di Elettronica e Informazione Politecnico di Milano email: [email protected] 1 Indice 1 Algoritmo di Euclide 1.1 Esercizi sui campi Zp . . . . . . . . . . . . . 1.1.1 Esercizio 1 . . . . . . . . . . . . . . . 1.2 Algoritmi di Esponenziazione . . . . . . . . 1.2.1 Square and Multiply - Left to Right 1.2.2 Square and Multiply - Right to Left 1.3 Esercizio 2 . . . . . . . . . . . . . . . . . . . 1.4 Esercizio 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 6 6 10 10 11 12 14 2 Esercizi sui campi Fpn 2.1 Esercizio 1 . . . . . 2.2 Esercizio 2 . . . . . 2.3 Esercizio 3 . . . . . 2.4 Esercizio 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 17 18 19 . . . . . 21 22 23 25 28 35 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Aritmetica in multipla precisione 3.1 Algoritmi di Addizione e Sottrazione 3.2 Algoritmo di Moltiplicazione . . . . . 3.3 Rappresentazione di Montgomery . . 3.4 Moltiplicazione di Montgomery . . . 3.5 Note implementative . . . . . . . . . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Capitolo 1 Algoritmo di Euclide Sia D un dominio agli ideali principali, cioè un anello dotato di unità in cui vale la legge di annullamento del prodotto e in cui ogni ideale è principale. Esempio: D =< Z, +, · >, D =< F[X], +, · > Definizione 1.0.1. Dati a, b ∈ D, si definisce Massimo Comun Divisore d = M CD(a, b), l’elemento d ∈ D tale che d|a, d|b e ∀y ∈ D : y|a∧y|b ⇒ y|D. Senza pretesa di rigore matematico, ci limitiamo a ricordare come, dati a, b ∈ D se d ∈ D è il loro massimo comun divisore allora d divide anche una loro qualunque combinazione lineare: d|x · a + y · b con x, y ∈ D. Si può dimostrare, assieme all’esistenza di d anche l’esistenza di almeno una coppia di elementi xa , yb ∈ D tali che d = xa a + yb b Il precedente risultato permetterà di calcolare l’inverso moltiplicativo in un campo finito. Lemma 1.0.1. a, b ∈ D; a > b; se D è un dominio euclideo(es.: Z, F[X]) si può definire una nozione di quoziente e si ha q = ba/bc; r = a mod b = a − qb ∈ {0, 1, 2 . . . , b − 1} e vale il seguente: M CD(a, b) = M CD(b, a mod b) 3 Usando il lemma precedente si possono scrivere le seguenti uguaglianze: a>b>0 r0 = a r1 = b r2 = r0 mod r1 = r0 − br0 /r1 cr1 ; 0 ≤ r2 < r1 r3 = r1 mod r2 = r1 − br1 /r2 cr2 ; 0 ≤ r3 < r2 r4 = r2 mod r3 = r2 − br2 /r3 cr3 ; 0 ≤ r4 < r3 ··· rn = rn−2 mod rn−1 = rn−2 − brn−1 /rn−2 crn−2 ; rn = 0 d = M CD(a, b) d = M CD(r0 , r1 ) d = M CD(r1 , r2 ) d = M CD(r2 , r3 ) d = M CD(r3 , r4 ) ··· d = M CD(rn−1 , 0) per un certo intero n si ha: d = M CD(a, b) = rn−1 Pensiamo ora di riscrivere tutti i passaggi precedenti come combinazioni lineari di a, b: a>b>0 r0 = 1 · a + 0 · b r1 = 0 · a + 1 · b r2 = r0 mod r1 = (1a + 0b) − b rr10 c(0a + 1b) = (ξ2 a + η2 b); 0 ≤ r2 < r1 r3 = r1 mod r2 = (0a + 1b) − b rr12 c(ξ2 a + η2 b) = (ξ3 a + η3 b); 0 ≤ r3 < r2 r4 = r2 mod r3 = (ξ2 a + η2 b) − b rr23 c(ξ2 a + η2 b) = (ξ4 a + η4 b); 0 ≤ r4 < r3 ··· n−3 rn−1 = rn−3 mod rn−2 = (ξn−3 a + ηn−3 b) − b rrn−2 c(ξn−2 a + ηn−2 b) = = (ξn−1 a + ηn−1 b); 0 ≤ rn−1 < rr−2 rn = rn−2 mod rn−1 = (ξn−2 a + ηn−2 b) − b rrn−3 c(ξn−1 a + ηn−1 b) = n−2 = (ξn a + ηn b); rn = 0 per cui: d = rn−1 = ξn−1 a + ηn−1 b; ξ, η ∈ D Formalizzando la precedente costruzione si ottiene l’algoritmo di Euclide esteso per il calcolo del massimo comun divisore. 4 Algorithm 1.0.1: Algoritmo esteso di Euclide Input: a, b ∈ D Output: d = ξa · a + ηb · b, ξa , ηb 1 begin 2 u ← (a, 1, 0) 3 v ← (b, 0, 1) 4 repeat 5 6 7 8 9 10 11 w ← u − b u[0] v[0] c · v u←v v←w until (w[0] = 0) d ← u[0], ξa ← u[1], ηb ← u[2] return (d, ξa , ηb ) end Esempio 1.0.1. Sia D =< Z, +, · > d = M CD(11, 5) = 11ξ + 5η; u ← (11, 1, 0); v ← (5, 0, 1); q = b 11 5 c = 2, w ← (11 − 2 · 5, 1 − 0 · 2, 0 − 1 · 2) = (1, 1, −2); u ← (5, 0, 1); v ← (1, 1, −2); q = b 15 c = 5, w ← (5 − 1 · 5, 0 − 1 · 5, 1 − (−2) · 5) = (0, −5, 11); u ← (1, 1, −2); v ← (0, −5, 11); d = 1; ξ = 1; η = −2. infatti: 1 = 1 · 11 + (−2) · 5. 5 Esercizi sui campi Zp 1.1 1.1.1 Esercizio 1 Si consideri il seguente campo finito: F7 ∼ = Z/7Z. (1) Determinare le tavole di addizione e di moltiplicazione. + 0 1 2 3 4 5 6 0 0 1 2 3 4 5 6 1 1 2 3 4 5 6 0 2 2 3 4 5 6 0 1 3 3 4 5 6 0 1 2 4 4 5 6 0 1 2 3 5 5 6 0 1 2 3 4 · 1 2 3 4 5 6 6 6 0 1 2 3 4 5 1 1 2 3 4 5 6 2 2 4 6 1 3 5 3 3 6 2 5 1 4 4 4 1 5 2 6 3 5 5 3 1 6 4 2 6 6 5 4 3 2 1 (2) Determinare il numero degli elementi generatori del campo. Se n = |F∗7 | è la cardinalità del gruppo, allora il numero di elementi generatori è: ϕ(n) = ϕ(6) = 2. 6 N.B.: Proposizione 1.1.1. In un gruppo ciclico G =< g > di ordine n = |g|, dato h ∈ N si ha: n |g h | = M CD(n, h) Dim. Posto r = |g h |, si ha che g hr = (g h )r = e ⇒ n|hr; questo vuol dire che esiste un intero m tale che rh = mn; dividendo ambo i membri per M CD(n, h) si ottiene: r h M CD(n,h) e n M CD(n,h) h n =m M CD(n, h) M CD(n, h) sono co-primi per costruzione, quindi si può concludere: n |r M CD(n, h) Viceversa si può osservare che n h (g h ) M CD(n,h) = (g n ) M CD(n,h) = e ⇒ r| n M CD(n, h) da cui la tesi. Teorema 1.1.1. Dato n ∈ N+ , la funzione τ (n), definita come il numero dei divisori positivi di n: X τ (n) = |{d ∈ N+ : d|n}| = 1 d|n è una funzione moltiplicativa. Dati n, m ∈ N+ tali che M CD(n, m) = 1 allora τ (n · m) = τ (n) · τ (m) Il gruppo F∗7 è ciclico, quindi ammete almeno un generatore g0 = g ∈ F∗7 , cioè: < g0 >= F∗7 . Gli altri generatori saranno gli elementi gi = g0i tali che M CD(n, i) = 1 con i ∈ {2, 3, ..., n − 1}, il calcolo del numero di generatori coincide quindi con il valore della funzione di Eulero, valutata in n: ϕ(n) = |{i ∈ Z, 0 < i < n : M CD(n, i) = 1}| Valgono i seguenti: Teorema 1.1.2. Siano n, m ∈ N+ con n > m, se M CD(n, m) = 1 allora ϕ(n · m) = ϕ(n) · ϕ(m) 7 Teorema 1.1.3. Dato n ∈ N+ , la funzione τ (n), definita come il numero dei divisori positivi di n: X 1 τ (n) = |{d ∈ N+ : d|n}| = d|n è una funzione moltiplicativa. Dati n, m ∈ N+ tali che M CD(n, m) = 1 allora τ (n · m) = τ (n) · τ (m) Lemma 1.1.1. Siano p un numero primo e k ∈ N+ , allora ϕ(pk ) = pk − pk−1 τ (pk ) = k + 1 Dim. Cerchiamo tutti i numeri interi minori di pk che abbiano unn fattore in comune con pk . Osserviamo che tali interi saranno tutti multipli di p, pertanto della forma h · p con h ∈ {1, . . . , pk−1 }. Il numero di interi minori di pk che hanno un fattore in comune con pk è: pk−1 . Il numero di interi coprimi con pk è dunque immediato: ϕ(pk ) = pk − pk−1 . Per dimostrare che τ (pk ) = k + 1 basta osservare che i divisori di pk sono: 1, p, p2 , . . . , pk . Lemma 1.1.2. Dato n ∈ N+ e la sua scomposizione in fattori primi n = Q ej s j=0 pj con s, ej ∈ N allora ϕ(n) = s Y e e −1 pj j − p j j j=0 τ (n) = =n s Y (1 − j=0 s Y 1 ). pj (1 + ej ). j=0 Dim. È un’applicazione immediata delle proprietà enunciate precedentemente. (3) Determinare gli elementi generatori del campo. Procedendo per tentativi, iniziamo a verificare se g = 2 è un generatore: 21 = 2, 22 = 4, 23 = 8 = 1, quindi l’elemnto g = 2 ha ordine 3 e non è un generatore. Proviamo quindi con g = 3: 31 = 3, 32 = 2mod7, 33 = 6mod7 6= 1, osservando la fattorizzazione dell’ordine del gruppo n = |F∗7 | = 6 = 2 · 3 si deduce l’esistenza di soli elementi di ordine 1, 2, 3 o 6 e quindi dai calcoli fatti possiamo concludere, senza ulteriori conti, che g0 = 3 è un elemento generatore del campo F7 . L’altro generatore sarà: g1 = g05 = 35 = 5 mod 7. 8 (4) Determinare l’inverso moltiplicativo dei seguenti elementi: x = 4, y=3 Abbiamo due modi per calcolare l’inverso di un elemento e precisamente: • il Piccolo Teorema di Fermat: p primo, a ∈ Fp∗ , a−1 = ap−2 mod p. • l’Algoritmo Esteso di Euclide per il calcolo del massimo comun divisore: p primo, a ∈ Fp∗ , essendo M CD(p, a) = 1 = ξ · p + η · a per opportuni interi ξ, η ∈ Z. Prendendo il modulo p di ambo i membri della precedente uguaglianza si trova come: η ·a = 1modp ⇒ η ≡ a−1 modp. Utilizzando il primo metodo si ha: p = 7, x = 4, x−1 mod 7 ≡7 45 ≡7 (42 · 42 · 4) ≡7 22 · 4 ≡7 2 p = 7, y = 3, y −1 mod 7 ≡7 35 ≡7 (32 · 32 · 3) ≡7 22 · 3 ≡7 5 Utilizzando invece l’algoritmo di Euclide: p = 7, x = 4 ⇒ 1 = M CD(7, 4) = 7ξ + 4η u ← (7, 1, 0); v ← (4, 0, 1); q = b 74 c = 1, w ← (7 − 4, 1 − 0, 0 − 1) = (3, 1, −1); u ← (4, 0, 1); v ← (3, 1, −1); q = b 43 c = 1, w ← (4 − 3 · 1, 0 − 1 · 1, 1 − (−1) · 1) = (1, −1, 2); u ← (3, 1, −1); v ← (1, −1, 2); q = b 31 c = 3, w ← (3 − 1 · 3, 1 − (−1) · 3, −1 − 2 · 3) = (0, 4, 7); u ← (1, −1, 2); v ← (0, 4, 7); d = 1; ξ = −1; η = 2 ⇒ x−1 = 4−1 mod 7 = 2 9 p = 7, y = 3 ⇒ 1 = M CD(7, 3) = 7ξ + 3η u ← (7, 1, 0); v ← (3, 0, 1); q = b 73 c = 2, w ← (7 − 6, 1 − 0, 0 − 2) = (1, 1, −2); u ← (3, 0, 1); v ← (1, 1, −2); q = b 31 c = 3, w ← (3 − 1 · 3, 0 − 1 · 3, 1 − (−2) · 3) = (0, −3, 7); u ← (1, 1, −2); v ← (0, −3, 7); d = 1; ξ = −2; η = −2 ⇒ y −1 = 3−1 mod 7 ≡7 −2 ≡7 5 1.2 Algoritmi di Esponenziazione In questa sezione descriveremo due varianti dell’algoritmo più conosciuto per effettuare l’operazione di esponenziazione in maniera efficiente. Il problema è formulato nel modo seguente: dati a, n ∈ N, si vuole calcolare l’intero c = an effettuando un numero di moltiplicazioni minore di n. Indicando con t il numero di cifre binarie necessarie per rappresentare l’intero n, cioè: t = dlg2 ne, n = (nt−1 , . . . , n1 , n0 ) con ni ∈ {0, 1}, i ∈ {0, 1, . . . , t − 1} possiamo scrivere: Pt−1 c = an = a j=0 nj 2j = ant−1 2 t−1 +n t−2 +...+n 21 +n t−2 2 1 0 (1.1) A seconda del modo in cui è possibile leggere l’ultimo membro della catena di uguaglianze appena scritte si esibiscono diverse formalizzazioni dell’algoritmo noto come Square and Multiply(S&M). 1.2.1 Square and Multiply - Left to Right Pensando di scandire l’esponente dell’eq. (1.1) da sinistra verso destra, vale la seguente uguaglianza: c = an = ((· · · ((ant−1 )2 · ant−2 )2 · · · )2 · an1 )2 · an0 Esempio 1.2.1. Si supponga di voler applicare il metodo precedente al calcolo di c = 56 ; allora a = 5, t = 3, n = 6 = 1102 = 1 · 22 + 1 · 21 + 0 · 20 , si può scrivere: c = 51102 = ((51 )2 · 51 )2 · 50 = (52 · 5)2 = 15625. Il costo computazionale del metodo appena illustrato, espresso in numero di moltiplicazioni e quadrati necessari per portare a termine la computazione è uguale a: dlg2 ne quadrati + 21 dlg2 ne moltiplicazioni (caso medio). 10 Algorithm 1.2.1: S&M Left to Right Input: a, n, t = dlg2 ne, n = (nt−1 , . . . , n1 , n0 ), n ≥ 0 Output: c = an 1 begin 2 if n = 0 then 3 return 1 4 c←a 5 for i ← t − 2 down-to 0 do 6 c ← c2 7 if ni = 1 then 8 c←c·a 9 10 return c end 1.2.2 Square and Multiply - Right to Left Pensando di scandire l’esponente dell’eq. (1.1) da destra verso sinistra, vale la seguente uguaglianza: 0 1 2 c = an = (a2 )n0 · (a2 )n1 · (a2 )n2 · · · (a2 t−1 )nt−1 Esempio 1.2.2. Si supponga di voler applicare il metodo precedente al calcolo di c = 56 ; allora a = 5, t = 3, n = 6 = 1102 = 1 · 22 + 1 · 21 + 0 · 20 , si può scrivere: 0 1 2 c = 51102 = (52 )0 · (52 )1 · (52 )1 = (5 · 52 · 54 ) = 15625. Si osservi come i fattori tra parentesi possano essere calcolati come quadrati del fattore precedente. Il costo computazionale del metodo appena illustrato, espresso in numero di moltiplicazioni e quadrati necessari per portare a termine la computazione è uguale a: dlg2 ne quadrati + 12 dlg2 ne moltiplicazioni (caso medio). 11 Algorithm 1.2.2: S&M Right to Left Input: a, n, t = dlg2 ne, n = (nt−1 , . . . , n1 , n0 ), n ≥ 0 Output: c = an 1 begin 2 if n = 0 then 3 return 1 4 b←a 5 if n0 = 1 then 6 c←a 7 else 8 c←1 9 for i ← 1 to t − 1 do 10 b ← b2 11 if ni = 1 then 12 c←c·b 13 14 return c end 1.3 Esercizio 2 Si consideri il campo: F11 ∼ = Z/11Z ∼ = Z11 , si chiede di: 1. determinare il numero di generatori del gruppo moltiplicativo; 2. esibire il valore di tutti i generatori del campo; 3. elencare tutti i sottogruppi di F∗11 con la loro cardinalità; 4. calcolare l’inverso moltiplicativo di x = 7; 5. descrivere il gruppo additivo del campo < F11 , + >; (1) Determinare il numero di generatori del gruppo moltiplicativo. F∗11 = {1, 2, . . . , 10}; n = |F∗11 | = 10; numero generatori = ϕ(n) = ϕ(10) = ϕ(2 · 5) = 4 o anche numero generatori = |{0 < i < n : M CD(i, n) = 1}| = |{1, 3, 7, 9}| = 4. (2) Esibire il valore di tutti i generatori del campo. Tenendo presente la scomposizione in fattori primi dell’ordine del gruppo 12 n = 2 · 5, assumendo come g = 2 come potenziale generatore, si ha: 22 ≡11 4, 23 ≡11 8, 24 ≡11 5, 25 ≡11 10, dunque concludiamo che effettivamente g0 = g = 2 è un generatore del gruppo moltiplicativo del campo assegnato. Gli altri 3 generatori sono: g1 = g03 = 23 ≡11 8; g2 = g07 = 27 ≡11 7; g3 = g09 = 29 ≡11 6. Come verifica, si può provare ad elencare tutti gli elementi del sottogruppo generato da g3 : < g3 >= {g3 = 6, g32 = 3, g33 = 7, g34 = 9, g35 = 10, g36 = 5, g37 = 8, g38 = 4, g39 = 2, g310 = 1}. (3) Elencare tutti i sottogruppi di F∗11 con la loro cardinalità; F∗11 = {1, 2, . . . , 10}; n = |F∗11 | = 10 Conoscendo la scomposizione in fattori primi dell’ordine del gruppo: n = 2·5 possiamo dire che esisteranno soltanto 2 sottogruppi propri H1 , H2 aventi cardinalità rispettivamente n1 = 2 e n2 = 5. n/n H1 =< h1 > con h1 elemento di F∗11 di ordine n1 = 2, h1 = g0 1 ≡11 10; n/n H2 =< h2 > con h2 elemento di F∗11 di ordine n2 = 5, h2 = g0 2 ≡11 4; Tutti i sottogruppi di F∗11 sono dunque: H0 = {1}, n0 = 1 H1 = {10, 1}, n1 = 2 H2 = {4, 5, 9, 3, 1}, n2 = 5 F∗11 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, n = 10 (3) Calcolare l’inverso moltiplicativo di x = 7; Impiegando l’algoritmo di Euclide si trova: p = 11, x = 7 ⇒ 1 = M CD(7, 4) = 7ξ +4η dove ξ = 2, η = −3 ⇒ x−1 ≡11 8 Analogamente, utilizzando il Piccolo di Fermat e l’algoritmo di esponenziazione S&M Left to Right si ha: x−1 ≡11 79 ≡11 710012 ≡11 ((72 )2 )2 · 7 ≡11 (52 )2 · 7 ≡11 32 · 7 ≡11 8 13 (4) descrivere il gruppo additivo del campo: < F11 , + >; < F11 , + >= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, | < F11 , + > | = 11, è un gruppo ciclico (∼ = Z11 ) in cui tutti gli elementi (6= 0) sono generatori (ordine primo), pertanto non ammette sottogruppi propri. numero generatori = ϕ(11) = 10 Assumendo, ad esempio, g = 10 come generatore, si ha: g ≡11 10, 2g ≡11 9, 3g ≡11 8 4g ≡11 7, 5g ≡11 6, 6g ≡11 5, 7g ≡11 4, 8g ≡11 3, 9g ≡11 2, 10g ≡11 1, 11g ≡11 0 1.4 Esercizio 3 Si consideri il campo: F13 ∼ = Z/13Z ∼ = Z13 , si chiede di descrivere completamente il gruppo moltiplicativo di tale campo elencando tutti i suoi sottogruppi con le coro cardinalità e i loro generatori nonché le eventuali relazioni tra i sottogruppi trovati. Sol: n = 12, numero di sottogruppi = 6; n0 = 1, H0 =< 1 >= {1}; n1 = 4, H1 =< 8 >=< 5 >= {1, 5, 8, 12}; n2 = 2, H2 =< 12 >= {1, 12}; n3 = 3, H3 =< 3 >=< 9 >= {1, 3, 9}; n4 = 6, H4 =< 8 >=< 5 >= {1, 3, 4, 9, 10, 12}; n5 = 12, H5 =< 2 >=< 6 >=< 7 >=< 9 >= F∗13 ; H0 < H2 < H1 < H5 ; H0 < H3 < H4 < H5 . 14 Capitolo 2 Esercizi sui campi Fpn 2.1 Esercizio 1 Dopo aver verificato che il polinomio f (x) = x2 −x−1 ∈ F3 [X] è irriducibile, scrivere le tavole di addizione e moltiplicazione del campo: F32 ∼ = F3 [X]/ < f (x) >∼ = F3 (α) con α ∈ F32 \F3 : f (α) = 0. Il polinomio f (x) ∈ F3 [X] non ammette radici in F3 (f (0) = 2, f (1) = 1, f (2) = 1), ed essendo deg(f (x)) = 2 si può concludere che è irriducibile. + 0 1 2 α α+1 α+2 2α 2α+1 2α+2 0 0 1 2 α α+1 α+2 2α 2α+1 2α+2 · 1 2 α α+1 α+2 2α 2α+1 2α+2 1 1 2 0 α+1 α+2 α 2α+1 2α+2 2α 1 1 2 α α+1 α+2 2α 2α+1 2α+2 2 2 0 1 α+2 α α+1 2α+2 2α 2α+1 2 2 1 2α 2α+2 2α+1 α α+2 α+1 α α α+1 α+2 2α 2α+1 2α+2 0 1 2 α α 2α α+1 2α+1 1 2α+2 2 α+2 α+1 α+1 α+2 α 2α+1 2α+2 2α 1 2 0 α+1 α+1 2α+2 2α+1 2 α α+2 2α 1 α+2 2+α α α+1 2α+2 2α 2α+1 2 3 1 α+2 α+2 2α+1 1 α 2+2α 2 α+1 2α 2α 2α 2α+1 2α+2 0 1 2 α α+1 α+2 2α 2α α 2α+2 α+2 2 α+1 1 2α+1 2α+1 2α+1 2α+2 2α 1 2 0 α+1 α+2 α 2α+1 2α+1 α+2 2 2α α+1 1 α+2 α 2α+2 2α+2 2α 2α+1 2 0 1 α+2 α α+1 2α+2 2α+2 α+1 α+2 1 2α 2α+1 α α+1 (1) Determinare: gli elementi primitivi del campo; indicare tutti i possibili polinomi irriducibili e polinomi primitivi che permettono di costruire il campo assegnato. F3 2 ∼ = F3 (α) = θ0 + αθ1 : θ0 , θ1 ∈ F3 ; α ∈ F32 \F3 : f (α) = α2 − α − 1 = 0. 15 Il numero di polinomi irriducibili di grado 2: N2 (3) = (32 − 3)/2 = 3; Per trovare i tre polinomi, viste le ridotte dimensioni del campo procediamo nel seguente modo: f (x) = x2 + θ1 x + θ0 ; f (0) 6= 0 ⇒ θ0 6= 0 ⇔ θ0 = 1, 2; dividiamo i due casi: (1◦ caso): f (x) = x2 +θ1 x+1, dobbiamo imporre: f (2) = 2+2θ1 6= 0 ⇒ θ1 6= 2; f (1) = 2 + θ1 6= 0 ⇒ θ1 6= 1; abbiamo così trovato un primo polinomio irriducibile: f1 (x) = x2 + 1 (2◦ caso): f (x) = x2 + θ1 x + 2, dobbiamo imporre: f (1) = θ1 6= 0; f (2) = 6 + 2θ1 6= 0 ⇒ θ1 6= 0; abbiamo così individuato gli altri due polinomi: f2 (x) = x2 + x + 2 f3 (x) = x2 + 2x + 2 = x2 − x − 1 Sia n = |F∗32 | la cardinalità del gruppo moltiplicativo, allora il numero di elementi primitivi del campo è: ϕ(n) = ϕ(8) = 4; il numero di polinomi primitivi di grado 2 è invece: M2 (3) = ϕ(8)/2 = 2. Si sono individuati 3 polinomi irriducibili, due di questi saranno primitivi. Iniziamo con il trovare un elemento generatore di F∗32 , usando il polinomio irriducibile f (x) = x2 − x − 1 per fare i calcoli (f (α) = 0 ⇔ α2 = α + 1). α1 = α; α2 = α + 1; α3 = 2α + 1; α4 = 2 ⇒ α è primitivo. (Oss.: i divisori dell’ordine n sono 1,2,4,8. ) Trovato un elemento primitivo β0 = α, gli altri elementi primitivi saranno dunque: β1 = α3 = 2α + 1, β2 = α5 = 2α, β3 = α7 = α + 2. Per calcolare i polinomi primitivi richiesti, applichiamo la definizione e troviamo: 1 g1 (x) = (x − α)(x − α3 ) = x2 + 2x + 2 = x2 − x − 1 1 g2 (x) = (x − β1 )(x − β13 ) = (x − α5 )(x − α15 ) = x2 + x + 2 (2) Calcolare l’inverso dei seguenti elementi in F32 ∼ = F3 [X]/ < x2 −x−1 >. g(x) = x + 1 h(x) = 2x Impiegando il Piccolo di Fermat si trova: (g(x))−1 = (x + 1)8−1 mod f (x) = (x + 1)1112 mod f (x) = = ((x + 1)2 (x + 1))2 (x + 1) mod f (x) = · · · = 2x + 2. (h(x))−1 = (2x)8−1 mod f (x) = (2x)1112 mod f (x) = = ((2x)2 (2x))2 (2x) mod f (x) = · · · = 2x + 1. 16 Analogamente volendo utilizzare l’algoritmo esteso di Euclide si ha: f (x) = x2 −x−1, g(x) = x+1 ⇒ 1 = M CD(f (x), g(x)) = f (x)ξ(x)+g(x)η(x) u ← (x2 − x − 1, 1, 0); v ← (x + 1, 0, 1); 2 −x−2 c = x − 2, w ← (x2 − x − 1 − (x + 1)(x − 2), 1, −(x − 2)); q = b x x+1 u ← (x + 1, 0, 1); v ← (1, 1, −x + 2); q = b x+1 1 c = x + 1, w ← (x + 1 − (x + 1), 0 − (x + 1), 1 − (−x + 2)(x + 1)); u ← (1, 1, 2x + 2); v ← (0, 2x + 2, 1); d(x) = 1; ξ(x) = 1; η(x) = 2x + 2 ⇒ (g(x))−1 mod f (x) = 2x + 2 f (x) = x2 −x−1, h(x) = 2x ⇒ 1 = M CD(f (x), g(x)) = f (x)ξ(x)+g(x)η(x) u ← (x2 − x − 1, 1, 0); v ← (2x, 0, 1); 2 c = 2x + 1, w ← (−1, 1, x − 1); q = b x −x−1 2x u ← (2x, 0, 1); v ← (−1, 1, x − 1); 2x q = b −1 c = x, w ← (0, 2x, 2x2 + x + 1); u ← (−1, 1, x − 1); v ← (0, 2x, 2x2 + x + 1); d(x) = ξ(x)f (x) + η(x)h(x), d(x) = −1; ξ(x) = 1; η(x) = x − 1 ⇒ −1 = (1)f (x) + (x − 1)h(x) ⇔ 1 = (−1)f (x) + (2x + 1)h(x) ⇒ η(x) = (h(x))−1 mod f (x) = 2x + 1 mod f (x) 2.2 Esercizio 2 Descrivere il campo: F23 . Detto f(x) il polinomio irriducibile utilizzato per rappresentare il campo si ha: F23 ∼ = F2 (α) = {θ0 + αθ1 + α2 θ2 : θ0 , θ1 , θ2 ∈ F2 ; f (α) = 0}. Il numero di elementi generatori del campo = ϕ(|F∗23 |) = ϕ(7) = 6, quindi 17 tutti gli elementi 6= 0, 1 sono generatori. Il numero di polinomi irriducibili di grado 3 = N3 (2) = (23 − 2)/3 = 2. Il numero di polinomi primitivi di grado 3 = M3 (2) = ϕ(7)/3 = 2. risultato scontato, dopo aver osservato che tutti gli elementi del gruppo moltiplicativo sono generatori. Per esibire i polinomi primitivi/irriducibili, essendo l’estensione del campo uguale a 3, i polinomi per essere irriducibili non devono ammettere come radici 0 o 1, cioè devono avere un numero dispari di coefficienti e un termine noto non nullo: f1 (x) = x3 + x2 + 1; 2.3 f2 (x) = x3 + x + 1 Esercizio 3 Descrivere il campo: F25 . Il numero di polinomi irriducibili di grado 5 = N5 (2) = (25 − 2)/5 = 6. Il numero di elementi generatori del campo = ϕ(|F∗25 |) = ϕ(31) = 30, quindi tutti gli elementi 6= 0, 1 sono generatori; il numero di polinomi primitivi di grado 5 coincide con il numero dei polinomi irriducibili. Per esibire i 6 polinomi primitivi del campo, iniziamo con l’elencare tutti i possibili trinomi e pentanomi a coefficienti in F2 (Condizione necessaria per l’irriducibilità, è che i polinomi in oggetto non ammettano radici nel campo base F2 ): f1 (x) = x5 + x4 + x3 + x2 + 1 f2 (x) = x5 + x4 + x3 + x + 1 f3 (x) = x5 + x4 + x2 + x + 1 f4 (x) = x5 + x3 + x2 + x + 1 f5 (x) = x5 + x4 + 1 f6 (x) = x5 + x3 + 1 f7 (x) = x5 + x2 + 1 f8 (x) = x5 + x + 1 Applicando il seguente test di irriducibilità, ai polinomi adesso elencati, si trova che f5 (x) e f8 (x) NON sono irriducibili. Teorema 2.3.1 (Test di irriducibilità). Sia f (x) ∈ Fp [X] un polinomio monico di grado m, allora f (x) è irriducibilie se e soltanto se: h M CD(f (x), xp − x) = cost 18 ∀h ≤ [m/2] 2.4 Esercizio 4 Considerato il campo F34 ∼ = F3 [X]/ < f (x) >: (1) indicare il numero di elementi generatori; (2) il numero di polinomi irriducibili; (3) il numero dei polinomi primitivi; (4) verificare che il polinomio f (x) = x4 + x − 1 ∈ F3 [X] è irriducibile. (5) verificare che l’elemento α ∈ F34 \F3 : f (α) = 0 è un elemento primitivo del campo. (6) Sapendo che f (x) = (x − α)(x − α3 )(x − α9 )(x − α27 ) = x4 + x − 1 è primitivo, determinare un altro polinomio primitivo del campo, giustificando il procedimento. (Sugg.: considerare l’elemento β = α7 ) Sol: n = 80, numero generatori = 32; numero pol. irriducibili = 18; numero pol. primitivi = 8. Condizione necessaria perchè il polinomio f (x) = x4 + x − 1 sia irriducibile: f (0) = 2 6= 0, f (1) = 1 6= 0, f (2) = 2 6= 0, quindi il polinomio dato non ammette fattori di primo grado a coefficienti in F3 , quello che rimane da verificare, essendo il polinomio di quarto grado è che non ammetta fattori di secondo grado: (x4 + x + 1) = (x2 + ax + b)(x2 + cx + d) a, b, c, d ∈ F3 eseguendo i prodotti si imposta il sistema: a+c=0 d + ac + b = 0 ad + bc = 0 bd = −1 osservando la prima e l’ultima equazione si vede come i valori possibili per a,b,c,d ∈ F3 siano: a = 1, d = −1 oppure a = −1, d = 1; mentre a = 1, c = −1 oppure a = −1, c = 1; e per ognuna di queste combinazioni di valori si vede come la seconda equazione non sia mai soddisfatta. Si può dunque concludere che il polinomio f (x) = x4 + x − 1 ∈ F3 [X] è irriducibile. Fissando per i calcoli il polinomio f (x) = x4 + x − 1, un altro polinomio primitivo del campo è: g(x) = x4 + x3 − x2 − x − 1 19 Nota: α4 = −α + 1; α5 = −α2 + α α6 = −α3 + α2 ; α7 = α3 + α − 1 α8 = α2 + α + 1; α9 = α3 + α2 + α α10 = α3 + α2 − α + 1 α16 = −α3 + α − 1 α20 = −α3 − α2 + α α40 = 2; 20 Capitolo 3 Aritmetica in multipla precisione Gli algoritmi presentati nel seguito del capitolo sono descritti per l’uso con grandi interi non-negativi espressi in notazione posizionale in base b, dove b può essere un qualunque intero ≥ 2. Sebbene le descrizioni siano completamente generali e indipendenti dalla particolare piattaforma di calcolo, la scelta ottimale per il valore di b dipenderà dalla particolare implementazione degli algoritmi. In particolare, b dovrebbe essere scelto in modo tale che moltiplicazioni, divisioni e riduzioni modulo bk (k > 0) siano semplici. Nel seguito sia N il modulo N= n−1 X N i bi , 0 < Nn−1 < b e 0 ≤ Ni < b, i = 0, 1, . . . , n − 2 i=0 e sia x ≥ N il numero che deve essere ridotto modulo N x= l−1 X xi bi , 0 < xl−1 < b e 0 ≤ xi < b, i = 0, 1, . . . , l − 2, 0 < l ≤ 2n − 1 i=0 21 3.1 Algoritmi di Addizione e Sottrazione Addizioni e sottrazioni tra interi espressi in notazione multipla sono eseguite seguendo lo schema di calcolo mostrato negli algoritmi 3.1.1 3.1.2. Gli operandi coinvolti devono avere entrambi la stessa lunghezza. L’operazione di riduzione in modulo dovrà essere eseguita successivamente confrontando il risultato della somma con il valore di N . Si osservi come per poter gestire Algorithm 3.1.1: Addizione in multipla precisione Input: A = An−1 bn−1 + . . . + A1 b + A0 , B = Bn−1 bn−1 + . . . + B1 b + B0 Output: x = A + B = xn bn + . . . + x1 b + x0 1 begin 2 x←0 3 k←0 4 for j ← 0 to n − 1 do 5 xi = Ai + Bi + k mod b 6 if (Ai + Bi + k < b) then 7 k←0 8 else 9 k←1 10 11 12 xn = k return x end i risultati intermedi Ai + Bi + k si necessiti di due cifre in precisione singola da gestire opportunamente per valutare correttamente gli assegnamenti e i confronti. L’algoritmo di sottrazione è analogo a quello di somma, anzichè aversi la propagazione di un carry si ha la propagazione di un borrow. Per il corretto funzionamento dell’algoritmo si suppone che il primo operando sia sempre maggiore o uguale al secondo. 22 Algorithm 3.1.2: Sottrazione in multipla precisione Input: A = An−1 bn−1 + . . . + A1 b + A0 , B = Bn−1 bn−1 + . . . + B1 b + B0 Output: x = A + B = xn bn + . . . + x1 b + x0 1 begin 2 x←0 3 k←0 4 for j ← 0 to n − 1 do 5 xi = Ai − Bi + k mod b 6 if (Ai − Bi + k < b) then 7 k←0 8 else 9 k ← −1 10 11 12 xn = k return x end 3.2 Algoritmo di Moltiplicazione Esistono diverse metodologie per eseguire velocemente ed efficientemente la moltiplicazione fra numeri interi in precisione multipla. Le tecniche asintoticamente (nella dimensione degli operandi) più efficienti sono quelle basate sulla FFT (Fast Fourier Transform). Per dimensioni degli operandi di qualche migliaio di bit risulta però più vantaggioso non ricorrere a simili tecniche ma far uso di metodi più elementari. Nel seguito vengono presentate due implementazioni, a differenti livelli di dettaglio, dell’algoritmo di moltiplicazione school-book. Nell’ eseguire operazioni in modulo la strategia sottointesa è quella del moltiplica e riduci per cui oltre agli algoritmi mostrati di seguito è necessario disporre anche di un metodo efficiente per eseguire le riduzioni modulo N . 23 Algorithm 3.2.1: Moltiplicazione in multipla precisione Input: A = An−1 bn−1 + . . . + A1 b + A0 , B = Bn−1 bn−1 + . . . + B1 b + B0 Output: x = A · B = x2n−1 b2n−1 + . . . + x1 b + x0 1 begin 2 x←0 3 for i ← 0 to n − 1 do 4 x ← x + Ai Bbi 5 return x 6 end Dettagliando tutte le operazioni a livello di cifre in precisione singola, una possibile versione ottimizzata dell’algoritmo precedente è quella mostrata nel seguito. Per sommare una cifra in precisione singola k, al numero in precisione doppia (u, v)b occorre eseguire la somma sulla cifra meno significativa v = v + k e gestire la creazione di un eventuale carry come u = u + (v < k); la cifra v è sicuramente corretta poichè si suppone che tutte le operazioni in precisione singola agiscano modulo b. Algorithm 3.2.2: Moltiplicazione in multipla precisione Ottimizzata Input: A = An−1 bn−1 + . . . + A1 b + A0 , B = Bn−1 bn−1 + . . . + B1 b + B0 Output: x = A · B = x2n−1 b2n−1 + . . . + x1 b + x0 1 begin 2 x←0 3 for j ← 0 to n − 1 do 4 k←0 5 for i ← 0 to n − 1 do 6 (u, v)b = Ai Bj 7 v =v+k 8 u = u + (v < k) 9 v = v + xi+j 10 u = u + (v < xi+j ) 11 xi+j = v 12 k=u 13 xj+n = k 14 return x 15 end 24 3.3 Rappresentazione di Montgomery Eseguire moltiplicazioni modulari, facendo uso di una strategia del tipo moltiplica e riduci presuppone l’utilizzo di un algoritmo di riduzione sufficintemente efficiente che non faccia uso di divisioni nè in precisione singola nè in precisione multipla. La tecnica di Montgomery permette di eseguire una moltiplicazione modulare con un costo computazionale quasi uguale a quello di una moltiplicazione tra interi in precisione multipla. Detto n il numero di cifre dei fattori, il costo della moltiplicazione di Montgomery è pari a 2n(n + 1) moltiplicazioni in precisione singola a fronte di un costo per eseguire una moltiplicazione in precisione multipla pari a n2 . Dato un intero positivo N ∈ N+ si consideri l’anello ZN = {0, 1, 2, . . . , N −1}. Si definisce trasformazione di Montgomery una particolare permutazione tra gli elementi di ZN , cioè una funzione biunivoca: µ : < ZN , +, · > → < Zf N , +, ∗ > La trasformazione di Montgomery è quindi un omomorfismo dall’anello ZN con le tradizionali definizioni delle operazioni di somma e moltiplicazione tra elementi mod N , ad un insieme numerico Zf N (dominio di Montgomery) che è ancora un anello di classi di resto modulo N con la medesima definizione per l’operazione di somma, ma che presenta una diversa definizione dell’operazione di moltiplicazione. La moltiplicazione nel dominio Zf N deve poter essere svolta in maniera più efficiente rispetto all’operazione definita in ZN . In tal modo, se un certo algoritmo prevede una lunga successione di moltiplicazioni modulari sugli stessi operandi in ZN , lo schema di calcolo da adottare è quello di tradurre gli operandi nel dominio di Montgomery, effettuare le moltiplicazioni e soltanto al termine della computazione esprimere nuovamente il valore degli operandi nell’anello ZN . Siano: x ∈ ZN = {0, 1, . . . , N − 1} R ∈ N+ con R > N, M CD(R, N ) = 1 = RR0 − N N 0 R0 ≡ R−1 mod N con 0 ≤ R0 < N N 0 ≡ −N −1 mod R con 0 ≤ N 0 < R allora la definizione delle funzioni di trasformazione è la seguente: x e = µ(x) = x · R mod N x = µ−1 (e x) = x e · R0 mod N La biunivocità delle funzioni µ, µ−1 è garantita dalla condizione di coprimalità tra R e N . Le condizioni sulla scelta del valore del parametro R, denominato Radice di Montgomery, non risultano molto stringenti, quindi generalmente non c’è 25 nessun motivo per non scegliere R uguale ad una potenza di 2, tanto più che, generalmente, nelle implementazioni di algoritmi crittografici asimmetrici il modulo N è un numero primo > 3 o è fattorizzabile nel prodotto di numeri primi grandi (e.g.: RSA) e quindi M CD(2n , N ) = 1. Le operazioni di divisione e di modulo che impiegano un dividendo uguale ad una potenza di 2 sono in assoluto le più semplici ed efficienti da implementare. Come già anticipato, le operazioni di somma e differenza (mod N ) tra elementi nella rappresentazione di Montgomery coincidono con le consuete operazioni tra elementi di ZN , infatti: ^ x e ± ye = xR mod N ± yR mod N = (x ± y)R mod N = (x ± y) Riguardo alla moltiplicazione, siano x, y ∈ ZN due elementi che vogliamo moltiplicare e x e, ye ∈ Zf N le immagini corrsiponedenti secondo la trasformazione di Montgomery, allora x e · ye mod N = xyR2 mod N = x fyR mod N 6= x fy si osserva come l’operazione di moltiplicazione ∗ sia sostanzialmente diversa dal semplice prodotto in ZN . Prima di poter esibire una descrizione operativa dell’operazione di moltiplicazione (∗) tra elementi del dominio di Montgomery, affrontiamo la questione dello svolgere efficientemente e correttamente il seguente calcolo: x ∈ ZN , x← x mod N. R mod N Affinché la divisione (x/R) mod N possa essere eseguita in maniera efficiente, è necessario che l’espansione di x in base R, riporti uno zero come cifra meno significativa, se così non è, l’idea del metodo di Montgomery è quella di aggiungere ad x un opportuno intero t ∈ N e calcolare x← x+t mod N. R La correttezza del procedimento è garantita se sono rispettate le seguenti condizioni: x + t ≡N x t ≡N 0 ⇒ t = t0 N, t0 ∈ N+ t = t0 N, t0 ∈ N+ ⇒ ⇒ 0 x + t ≡R 0 x + t N ≡R 0 t0 ≡R (−N −1 )x = N 0 x mod R La formulazione operativa dei precedenti ragionamenti consente quindi di definire la così-detta Riduzione di Montgomery come indicato dall’algoritmo 3.3.1. 26 Algorithm 3.3.1: MRed(.) - Riduzione di Montgomery Input: 0 < x ≤ RN N, R con R > N , M CD(R, N ) = 1 = RR0 − N N 0 Output: xR−1 mod N 1 begin 2 t0 ← xN 0 mod R 3 x ← x + N t0 4 x ← x/R 5 if x ≥ N then 6 x←x−N 7 return x 8 end Per giustificare l’ultimo passaggio dell’algoritmo facciamo le seguenti osservazioni: t0 < R, x + N t0 < RN + RN , (x + N t0 )/R < 2N . Facendo uso dell’operazione di riduzione secondo Montgomery anche l’operazione di moltiplicazione tra elementi del dominio trasformato Zf N può essere formalizzata operativamente come mostrato dall’algoritmo 3.3.2. Algorithm 3.3.2: MMul(.,.) - Moltiplicazione di Montgomery Input: x e = xR, ye = yR ∈ ZN Output: ze = xyR mod N 1 begin 2 return ze ← M Red(e x · ye) 3 end Partendo da elementi che sono nel dominio di Montgomery, l’applicazione dell’operazione ∗ comporta un risultato che è ancora nella forma di Montgomery: x e ∗ ye mod N = (xR · yR) · R−1 mod N = (xyR2 ) · R−1 mod N = x fy mod N Alla luce della precedente definizione, osserviamo come, la descrizione operativa delle due funzioni di trasformazione: µ: µ−1 ZN → Zf e = µ(x) = xR mod N N : x −1 : Zf x) = x eR0 mod N N → ZN : x = µ (e necessiti della costante R2 mod N , infatti utilizzando l’algoritmo3.3.2 si ha: x e = µ(x) = xR mod N = M M ul(x, R2 mod N ) x = µ−1 (e x) = x eR0 mod N = M M ul(e x, 1) 27 3.4 Moltiplicazione di Montgomery Per scrivere un algoritmo che effettui contemporanemente la riduzione e la moltiplicazione di due numeri in precisione multipla è necessario adattare l’algoritmo di Riduzione di Montgomery per trattare numeri in precisione multipla, così come mostrato nell’algoritmo 3.4.1. N = (Nn−1 Nn−2 . . . N1 N0 ); x← x = (xn−1 xn−2 . . . x1 x0 ); x<N 1 x x x 1 modN = n modN = (· · · (( mod N ) mod N ) · · · mod N ), n− volte R b b |b {z } b i=0 {z } | i=1 {z } | i=n−1 i=0 x x + t0 mod N ⇔ x ← mod N b b 0 t ≡N 0 ⇒ t0 = tN, t ∈ N+ x + t0 ≡N x ⇒ ⇒ 0 x + tN ≡b 0 ⇒ x0 + tN0 ≡b 0 x + t ≡b 0 0 t = tN, t0 ∈ N+ ⇒ t ≡b (−N0−1 )x0 ≡b N00 x0 x← x + t0 x + (N00 x0 mod b)N mod N ⇔ x ← mod N b b Supponendo di effettuare la divisione per b e successivo modN in un secondo momento si ottiene: x← x ← x + (N00 x0 mod b)Nb0 ⇒ x = (xn xn−1 . . . x2 x1 0) Oss: il numero x è ora rappresentato con n + 1 cifre con la meno significativa uguale a 0; i=1 x 0 x 0 t ≡N 0 ⇒ t0 = tN, t ∈ N+ b + t ≡N b ⇒ ⇒ x x 0 b + t ≡b 0 b + tN ≡b 0 ⇒ x1 + tN0 ≡b 0 0 t = tN, t0 ∈ N+ ⇒ t ≡b (−N0−1 )x1 ≡b N00 x1 x + t0 + (N00 x1 mod b)N mod N ⇔ x ← b mod N b b Supponendo di effettuare le divisioni per b e successivi mod N in un secondo momento si ottiene: x← x b x ← x + (N00 x1 mod b)Nb1 ⇒ x = (xn+1 xn . . . x3 x2 00) 28 Oss: il numero x è ora rappresentato con n + 2 cifre con le due meno significative uguali a 0. ....i = n − 1 x bn−1 x bn−1 x + t0 ≡N bn−1 ⇒ + t0 ≡b 0 t0 ≡N 0 ⇒ t0 = tN, t ∈ N+ ⇒ x + tN ≡b 0 ⇒ xn−1 + tN0 ≡b 0 bn−1 t0 = tN, t0 ∈ N+ ⇒ t ≡b (−N0−1 )xn−1 ≡b N00 xn−1 + (N00 xn−1 mod b)N mod N b b Supponendo di effettuare le divisioni per b e successivi mod N in un secondo momento si ottiene: x← x bn−1 + t0 mod N ⇔ x ← x bn−1 x ← x + (N00 xn−1 mod b)Nbn−1 ⇒ x = (x2n x2n−1 . . . xn 00 . . . 0) Oss: il numero x è ora rappresentato con 2n cifre con le n meno significative uguali a 0. Algorithm 3.4.1: Riduzione di Montgomery in multipla precisione Input: N = Nn−1 bn−1 + . . . + N1 b + N0 , R = bn , M CD(R, N ) = 1 = RR0 − N N 0 Output: xR−1 mod N 1 begin 2 for i ← 0 to n − 1 do 3 t ← N00 xi mod b 4 x ← x + tN bi 5 x ← x/bn 6 if x ≥ N then 7 x←x−N 8 return x 9 end 29 Mettendo insieme l’algoritmo 3.4.1 con l’algoritmo 3.2.1 di moltiplicazione tra interi in precisione multipla si ottiene l’algoritmo di Montgomery per moltiplicazione modulare tra due numeri interi in precisione multipla. Algorithm 3.4.2: Moltiplicazione di Montgomery in precisione multipla Input: A = An−1 bn−1 + . . . + A1 b + A0 , B = Bn−1 bn−1 + . . . + B1 b + B0 , N = Nn−1 bn−1 + . . . + N1 b + N0 , R = bn , M CD(R, N ) = 1 = RR0 − N N 0 , N00 = (−N −1 mod N ) mod b Output: x = ABR−1 mod N 1 begin 2 x←0 3 for i ← 0 to n − 1 do 4 x ← x + Ai Bbi 5 t ← N00 xi mod b 6 x ← x + tN bi 7 x ← x/bn 8 if x ≥ N then 9 x←x−N 10 return x 11 end Osservazione 3.4.1. Ad ogni iterazione, la cifra meno significativa dell’accumulatore x viene resa uguale a 0. Osservazione 3.4.2. In entrambi gli algoritmi 3.4.2, 3.4.3 la scelta della Radice di Montgomery R può essere fatta cercando di ottimizzare ulteriormente gli algoritmi. In particolare quando si effettua la computazione di una esponeneziazione modulare è possibile evitare il controllo e l’eventuale sottrazione finale ad ogni passo intermedio e rimandare un unico controllo con eventualmente un’unica sottrazione soltanto al termine del calcolo. Se R è scelta tale che R > 4N (R ≥ 4bn ) anziché R > N (R ≥ bn ), applicando gli algoritmi di moltiplicazione ad operandi A, B < 2N rimane comunque garantita la condizione che tutti i risultati parziali risultino < 2N . Sia w = A · B, allora: (w + N (R − 1)) (2N − 1)2 + N (R − 1) 4N 2 + N R ≤ < < 2N. R R R La presente osservazione risulta essere particolarmente utile in realizzazioni hardware di dispositivi crittografici. 30 Algorithm 3.4.3: Moltiplicazione di Montgomery Ottimizzata Input: A = An−1 bn−1 + . . . + A1 b + A0 , B = Bn−1 bn−1 + . . . + B1 b + B0 , N = Nn−1 bn−1 + . . . + N1 b + N0 , R = bn , M CD(R, N ) = 1 = RR0 − N N 0 , N00 = (−N −1 mod N ) mod b Output: x = ABR−1 mod N 1 begin 2 x←0 3 for i ← 0 to n − 1 do 4 x ← x + Ai B 5 t ← N00 x0 mod b 6 x ← (x + tN )/b 7 if x ≥ N then 8 x←x−N 9 return x 10 end Osservazione 3.4.3. L’algoritmo 3.4.3 di moltiplicazione e riduzione congiunti, ammette complessità computazionale pari a (2n + 1)n moltiplicazioni tra cifre espresse in base b che confrontata con il costo computazionale della sola moltiplicazione in precisione multipla: n2 (algoritmo 3.2.2), permette di cogliere i vantaggi di questo tipo di rappresentazione. 31 Algorithm 3.4.4: Moltiplicazione di Montgomery (Menezes et al., HandBook of Applied Cryptography, Algorithm 14.36) 1 2 3 4 5 6 7 8 9 Input: A = An−1 bn−1 + . . . + A1 b + A0 , B = Bn−1 bn−1 + . . . + B1 b + B0 , N = Nn−1 bn−1 + . . . + N1 b + N0 , R = bn , M CD(R, N ) = 1 = RR0 − N N 0 , N00 = (−N −1 mod N ) mod b Output: x = ABR−1 mod N begin x←0 for i ← 0 to n − 1 do t ← N00 (x0 + Ai B0 ) mod b x ← (x + Ai B + tN )/b if x ≥ N then x←x−N return x end 32 Esempio 3.4.1. Siano: b = 2, n = 4, N = 11, R = 2n = 16 ZN = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} R ZN = {0, 5, 10, 4, 9, 3, 8, 2, 7, 1, 6} M CD(R, N ) = RR0 − N N 0 ⇔ M CD(16, 11) = 1 Utilizzando l’algoritmo esteso di Euclide si trovano i due parametri R0 e N 0 : u = (16, 1, 0) w = (5, 1, −1) u = (11, 0, 1) w = (1, −2, 3) u = (5, 1, −1) w = (0, 11, −16) u = (1, −2, 3) R0 = −2, v = (11, 0, 1) q = [16/11] = 1 v = (5, 1, −1) q = [11/5] = 2 v = (1, −2, 3) q = [5/1] = 5 v = (0, 11, −16) N 0 = −3, N00 = 1 mod 2 Supponiamo, quindi, di voler moltiplicare i seguenti numeri: A = 4, e = 9, A B = 8, e = 7, B AB mod N = 32 mod 11 = 10, ABR mod N = 6 ^=A eBR e −1 mod N = 63(−2) mod 11 = 6 (AB) e = 9 = 10012 , A e = 7 = 01112 , B 33 N = 10112 , N00 = 1 0000 0111 0111 1011 10010 + 1001 0000 1001 1011 10100 + 1010 0000 1010 0000 01010 + 0101 0111 1100 0000 01100 + A0 B = 0111 + t = N00 X0 N = 1011 right shif t A1 B = 0000 + t = N00 X0 N = 1011 right shif t A2 B = 0000 + t = N00 X0 N = 0000 right shif t A3 B = 0111 + t = N00 X0 N = 0000 right shif t ^ = 01102 = 6 (AB) 34 3.5 Note implementative Nelle implementazioni reali dell’algoritmo di Montgomery vengono impiegati alcuni altri accorgimenti per semplificare ulteriormente le operazioni eseguite dall’algoritmo 3.4.4. L’osservazione fondamentale è la seguente, se: R = bn , A = (0, An−1 , An−2 , . . . , A1 , A0 ), B = (Bn−1 , Bn−2 , . . . , B1 , B0 ) allora M M ul(A, B) = ABR−1 mod N ≡ A(bB)(bR)−1 mod N La precedente relazione permette di modificare il ciclo dell’algoritmo di Montgomery. Infatti, eseguendo un’ ulteriore iterazione (che è equivalente a pensare di aver assunto un nuovo R1 = R · b = bn+1 ) si vede come il calcolo del parametro t possa essere ulteriormente semplificato, visto che la cifra meno signidficativa del fattore (bB) sarà sempre nullo. Algorithm 3.5.1: Moltiplicazione di Montgomery: nota 1 Input: A = (0, An−1 , . . . , A1 , A0 ), B = (Bn−1 , . . . , B1 , B0 ), N = (Nn−1 , . . . , N1 , N0 ), R = bn , M CD(R, N ) = 1 = RR0 − N N 0 , N00 = (−N −1 mod N ) mod b Output: x = ABR−1 mod N 1 begin 2 x←0 3 for i ← 0 to n do 4 t ← N00 x0 mod b 5 x ← (x + (Ai (bB)) + tN )/b 6 if x ≥ N then 7 x←x−N 8 return x 9 end Ri-arrangiando il codice dell’algoritmo si arriva all’algoritmo 3.5.2: 35 Algorithm 3.5.2: Moltiplicazione di Montgomery: nota 2 Input: A = (0, An−1 , . . . , A1 , A0 ), B = (Bn , . . . , B1 , B0 ), N = (Nn−1 , . . . , N1 , N0 ), R = bn , M CD(R, N ) = 1 = RR0 − N N 0 , N00 = (−N −1 mod N ) mod b Output: x = ABR−1 mod N 1 begin 2 x←0 3 for i ← 0 to n do 4 if N00 x0 mod b 6= 0 then 5 x ← x + tN 6 x ← x/b + Ai B 7 if x ≥ N then 8 x←x−N 9 return x 10 end Scegliendo come base di rappresentazione degli elementi, quella binaria b = 2, la formulazione del metodo di Montgomery secondo la variante dell’algoritmo 3.5.2, assume un aspetto particolarmente interessante, poiché l’intera operazione risulta essere eseguibile utilizzando esclusivamente un sommatore. L’algoritmo 3.5.3 è quindi spesso implementato per la realizzazione delle primitive del crittosistema RSA in cui il modulo N = p · q (primi) è un numero dispari. 36 Algorithm 3.5.3: Radix-2 Montgomery Product Input: A = (0, An−1 , . . . , A1 , A0 ), B = (Bn , . . . , B1 , B0 ), N = (Nn−1 , . . . , N1 , N0 ), R = 2n , M CD(R, N ) = 1 = RR0 − N N 0 , N00 = (−N −1 mod N ) mod 2 = −N0−1 mod 2 = 1 Output: x = ABR−1 mod N 1 begin 2 x←0 3 for i ← 0 to n do 4 if x0 == 1 then 5 x←x+N 6 x ← x/2 + Ai B 7 if x ≥ N then 8 x←x−N 9 return x 10 end Infine facendo riferimento all’osservazione 3.4.2: R ≥ 4N = 2n+2 , n = dlg2 N e, ammettendo operandi e risultati parziali minori di 2N ad ogni iterazione, A, B < 2N cioè A = An 2n +. . .+A1 2+A0 , B = Bn 2n +. . .+B1 2+B0 , N = Nn−1 2n−1 + . . . + N1 2 + N0 si ha: Algorithm 3.5.4: RSA - Radix-2 Montgomery Product Input: A = (0, An , An−1 , . . . , A1 , A0 ), B = (Bn , . . . , B1 , B0 ) R = 2n+2 , N = (Nn−1 , . . . , N1 , N0 ) Output: x = ABR−1 < N oppure x = ABR−1 + N < 2N 1 begin 2 x←0 3 for i ← 0 to n + 1 do 4 t ← x0 + Ai B0 mod 2 5 x ← (x + (Ai B) + tN )/2 6 return x 7 end L’algoritmo 3.5.4 può essere ri-scritto impiegando l’osservazione ABR−1 modN ≡ A(2B)(2R)−1 modN ; così aggiungendo un ulteriore ciclo (fino all’ n+2-esimo) si arriva alla formulazione dell’algoritmo 3.5.5. 37 Algorithm 3.5.5: RSA - Radix-2 Montgomery Product Input: A = (0, 0, An , An−1 , . . . , A1 , A0 ), B = (Bn , . . . , B1 , B0 ), R = 2n+2 , N = (Nn−1 , . . . , N1 , N0 ) Output: x = ABR−1 < N oppure x = ABR−1 + N < 2N 1 begin 2 x←0 3 for i ← 0 to n + 2 do 4 if x0 == 1 then 5 x ← (x + N ) 6 x ← x/2 + Ai B 7 return x 8 end 38