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