Vous êtes sur la page 1sur 5

Université Paris 8 Année 2020–2021

M1 Mathématiques et applications, parcours ACC et CSSD

Cryptographie à clef publique – Corrigé feuille de TD 6


19 mars 2021

Exercice
Exercice
Exercice 1.
1.
1. Signature
Signature
Signature RSA
RSA
RSA ::: falsification
falsification
falsification universelle
universelle
universelle ààà message
message
message choisi.
choisi.
choisi.
On s’intéresse au schéma de signature RSA brut. Dans le cours, nous en avons vu une falsification exis-
tentielle à clef seule. Le but de cet exercice et de monter une falsification universelle à message choisi
(adaptatif).
On note pk = (n, e) et sk = d les clefs publique et privée du schéma de signature.

Question 1.– Soient m1 , m2 ∈ Z/nZ deux messages, et s1 , s2 leurs signatures correspondantes. Que vaut
la signature s du message m = m1 m2 mod n, en fonction de s1 et s2 ?

Solution Q1. On a
= (m1 )d mod n

 s1
s = (m2 )d mod n
 2
s = (m1 m2 )d mod n
Par conséquent,
s = s1 s2 mod n

Question 2.– En déduire la falsification de la signature d’un message m ∈ Z/nZ quelconque, après avoir
demandé à Alice la signature de deux messages m1 et m2 (différents de m) judicieusement choisis.

Solution Q2. Supposons que l’on veuille falsifier une signature pour un message cible m ∈ Z/nZ.
L’idée de l’attaque est la suivante.
1. On choisit aléatoirement un message m1 ∈ (Z/nZ)× .
2. On calcule m2 = m · m1−1 mod n.
3. On demande à Alice de signer m1 et m2 (notons s1 et s2 les signatures associées).
4. On calcule s = s1 s2 mod n
On obtient alors une signature valide s du message m.
Remarque. L’attaque est donc une falsification universelle à message choisi, adaptative.

Exercice 2.
Exercice
Exercice 2. Signature
2. Signature ElGamal
Signature ElGamal ::: réutilisation
ElGamal réutilisation de
réutilisation de l’aléa.
de l’aléa.
l’aléa.
On s’intéresse au schéma de signature ElGamal, dans lequel le message est haché avant d’être signé. Plus
précisément, si H est une fonction de hachage à valeurs dans le groupe F×
p , voici l’algorithme de signature :

On suppose qu’Alice réutilise le même aléa k pour toutes ses signatures.

Question 1.– Soient s = (b, c) et s0 = (b0 , c0 ) les signatures de deux messages distincts m et m0 (avec le
même k). Comparer b et b0 , puis déterminer une égalité liant h = H (m), h0 = H (m0 ), a, b, c et c0 .

1
Algorithme 1 : Algorithme de signature d’ElGamal avec fonction de hachage
Entrée : un message m ∈ {0, 1}∗ , la clé privée a ∈ {1, . . . , p − 2}
Sortie : une signature s ∈ F×
p × {0, . . . , p − 2}
1 Choisir k ∈ Z/( p − 1)Z inversible.
2 Calculer b = gk mod p.
3 Calculer h = H (m).
4 Calculer c = (h − ab)k−1 mod ( p − 1).
5 Retourner s = (b, c).

Solution Q1. Comme k est le même pour toutes les signatures, on a

b ≡ gk ≡ b0 mod p .

On obtient alors

(h − ab)c0 ≡ (h − ab)(h0 − ab)k−1 ≡ (h0 − ab)(h − ab)k−1 ≡ (h0 − ab)c mod ( p − 1)

Question 2.– En déduire une attaque à message connu sur la clé privée d’Alice, qui réussit avec très bonne
probabilité.

Solution Q2. On cherche la clé privée a d’Alice. Pour cela, on demande à Alice deux signatures
s = (b, c) et s0 = (b0 , c0 ) quelconques (pour deux messages m et m0 connus mais non-choisis). On a
alors :
h0 c − hc0
(h − ab)c0 ≡ (h0 − ab)c mod ( p − 1) ⇐⇒ a≡ mod ( p − 1)
b(c − c0 )

Pour résumer :
1. On calcule h = H (m) et h0 = H (m0 ).
2. On calcule l’inverse de b(c − c0 ) modulo p − 1 (s’il est inversible).
0 hc0
3. On retourne a = hb(cc−
−c0 )
mod ( p − 1)

Cette attaque fonctionne si b et c − c0 sont inversibles modulo p − 1, ce qui est vérifié avec bonne
probabilité en les considérant comme des éléments aléatoires de Z/( p − 1)Z.
Remarque. On pourrait également demander à Alice davantage de signatures pour augmenter la
probabilité de réussite.

bbb ccc dans la


Exercice
Exercice 3.
Exercice 3. Calcul
3. Calcul rapide
Calcul rapide de gggbbbbbbccc dans
de
rapide de dans la vérification
la vérification d’ElGamal.
vérification d’ElGamal.
d’ElGamal.
Dans l’algorithme de vérification de la signature d’ElGamal, on a besoin de calculer la valeur αb bc , où α est
un élément de F×p , et b, c sont des éléments entre 1 et p − 2 que l’on peut considérer comme aléatoires.

L’algorithme square-and-multiply permet de calculer une exponentiation dans un groupe cyclique d’ordre
n, en approximativement log2 (n)/2 multiplications et log2 (n) carrés en moyenne (l’exposant est supposé
aléatoire). Si b et c sont aléatoires, le calcul de gb bc requiert donc, en moyenne, approximativement log2 ( p)
multiplications et 2 log2 ( p) carrés.
Le but de cet exercice est de calculer αb bc sensiblement plus rapidement. Pour cela, on propose l’Algo-
rithme 2.

Question 1.– Démontrer que pour tout i = ` − 1, . . . , 0, à la fin de la boucle Pour (...) de l’Algorithme 2,
on a
∑`−1 b 2 j−i ∑`−1 c 2 j−i
x = α j =i j b j =i j .
En déduire que l’algorithme est correct.

2
Algorithme 2 : Algorithme de calcul rapide de αb bc .
`−1 `−1
Entrée : α ∈ F× i i
p , b = ∑i =0 bi 2 et c = ∑i =0 ci 2 ∈ {1, . . . , p − 2}
Sortie : αb bc
1 Calculer z ← αb.
2 Initialiser x ← 1.
3 Pour i allant de ` − 1 à 0 faire
4 Calculer x ← x2
5 Si (bi , ci ) = (1, 1)
6 Calculer x ← xz
7 Si (bi , ci ) = (1, 0)
8 Calculer x ← xα
9 Si (bi , ci ) = (0, 1)
10 Calculer x ← xb
11 Retourner x.

Solution Q1. Se démontre par induction. On note xi la valeur de x en sortie de la i-ème boucle.
• C’est vrai à l’entrée dans la boucle (qu’on peut penser comme une étape i = `) : on a bien
x ` = 1 = α0 b0 .
• Supposons le résultat vrai à l’étape i, pour un certain i ∈ `, . . . , 1. Trois cas se présentent :
— si (bi , ci ) = (1, 1), alors la valeur de xi devient
 2
2 ∑`− 1
b j 2 j−(i+1) ∑`− 1
c j 2 j−(i+1)
x i = ( x i +1 ) z = α j = i + 1 b j = i + 1 αb

1+∑`− 1
j = i +1 b j 2
j+1−(i +1) 1+ `−1 c 2 j+1−(i +1)
∑ j = i +1 j
=α b
∑`−1 b 2 j−i ∑`−1 c 2 j−i
= α j =i j b j =i j

— si (bi , ci ) = (1, 0), alors la valeur de xi devient


 2
2 ∑`− 1
b j 2 j−(i+1) ∑`− 1
c j 2 j−(i+1)
x i = ( x i +1 ) α = α j = i + 1 b j = i + 1 α

1+∑`− 1
j = i +1 b j 2
j+1−(i +1)
∑`−1 c 2 j+1−(i+1)
=α b j = i +1 j
`−1
b j 2 j−i ∑`− 1
c 2 j −i
= α ∑ j =i b j =i j

— si (bi , ci ) = (0, 1), alors la valeur de xi devient


 2
2 ∑`− 1
b j 2 j−(i+1) ∑`− 1
c j 2 j−(i+1)
x i = ( x i +1 ) b = α j = i + 1 b j = i + 1 b
`−1
b j 2 j+1−(i+1) 1+∑`− 1 j+1−(i +1)
= α ∑ j = i +1 b j = i +1 c j 2

∑`−1 b 2 j−i ∑`−1 c 2 j−i


= α j =i j b j =i j

∑`− 1 j `−1
j =0 b j 2 b ∑ j =0 c j 2
j
La valeur retournée en fin d’algorithme est donc bien x0 = α = αb bc .

Question 2.– Compter le nombre moyen de carrés et le nombre moyen de multiplications effectués par
l’Algorithme 2, lorsque b et c sont des entiers de ` bits tirés aléatoirement.

Solution Q2. En moyenne, on effectue un carré, et 3/4 multiplications par boucle, auxquels il faut
ajouter la multiplication pour obtenir z = αb. On obtient donc
3
` carrés et 4` + 1 multiplications.

C’est bien mieux que les 2` carrés et ` multiplications pour le calcul successif de αb et bc .

3
Question 3.– Implanter l’Algorithme 2 et vérifier l’amélioration pratique qu’il procure, comparé aux
calculs successifs de αb et bc par la méthode square-and-multiply.

Solution Q3. À venir.

Exercice 4.
Exercice
Exercice 4. Implantation
4. Implantation de
Implantation de RSA-FDH.
de RSA-FDH.
RSA-FDH.
On considère le schéma de signature RSA-FDH (full-domain-hash), implanté avec la fonction de hachage
SHA-3 de sortie 224 bits.
Afin d’obtenir des hachés dans Z/nZ (où n est le module public), on suppose que l’on utilise de schéma
de remplissage suivant :

h = SHA3_224(m || 0) || SHA3_224(m || 1) || · · · · · · || SHA3_224(m || r )

où « m || i » est la chaîne de caractère associée à la concaténation de m et de l’entier i, et où r est tel que h


est de longueur ≥ 2t bits, où t est le nombre de bits des facteurs de n. Puis, on convertit h en un entier et
on le réduit modulo n.
Remarque. En python, on pourra utiliser la bibliothèque pycryptodome pour accéder à la fonction de
hachage SHA3_224, voir la documentation ici : [lien]. Il est également possible d’utiliser la bibliothèque
hashlib.

Question 1.– Implanter le schéma de remplissage pour la fonction de hachage SHA3_224. Vérifier que
pour le message m = « test » et la valeur t = 128, on obtient le haché

h = 3489e8b f 24b660896180884567a6c1bb971 f e104137e713de8a7bc98


d6e981ecb4de6889ecd6d33a5022b f f ee9a f 2aa272c2060 f b86 f 098a

en écriture hexadécimale 1 .

Solution Q1. Pour cette question et les suivantes, voir les fichiers annexes.

Question 2.– Implanter les algorithmes de signature et de vérification du schéma de signature RSA-FDH.

Question 3.– Exemple-jouet. On prend t = 16 pour simplifier.


1. Vérifier que pour n = 3089616301 et d = 1118240705, la signature de m = « exemple » est s =
2870643504.
2. Vérifier que pour n = 2509359689 et e = 65537, la valeur s = 520203729 est une signature correcte de
m = « jouet ».

Soit maintenant t = 1024 afin d’avoir 2048 bits de sécurité. Alice engendre une clef publique pk = (n, e) où
n = 14562072925219626537505003469047042785500668121585319676872543492147484780877605739666992
25449888249582590317124717734698971196733754670775756156785679932305277899925056383240714
23524047691547136749231427913935012855918719786667347049525473052076278878022420647909066
02011086610184817093202547333213547731525567338652723588678681565887107328478852782945418
64345843911882605246051565741382110493908869977965671194007503342423728457686129829923923
56783363365457291645975483370370857500597732144531123742460076939774425083020466391546094
84776526032126022251160053615273476044371376549285045935499063517749834738298289997
e = 65537

On considère également un texte accessible à l’adresse suivante :


1. Indication : on pourra s’aider par exemple de https://emn178.github.io/online-tools/sha3_224.html pour vérifier la
valeur des hachés.

4
https://www.math.univ-paris13.fr/∼lavauzelle/teaching/2020-21/docs/lebateauivre.zip

Question 4.– Décompresser l’archive, et considérer m la chaîne de caractère correspondant au fichier texte.
Vérifier que le haché de m, selon le schéma de remplissage décrit ci-dessus, a pour écriture hexadécimale :

159547be4c342a59f961e2cffb8a3c387fc9fe1d76076ba010e177f19500f956942526d89d0cc0ee54a8d
3a7602d7bcad5e51811bf881f5aa15c5380e509f2812a1fa7a1ca89b0ebf20c5e11cca43c603a6541c508
3cd9aa6fbad6da5f61c9bfa8e5d575fad3bb5a2aba918d3138d263849bec964d1bff398db934a02d9d59a
4979b71046ebc859f6e19d5c763978f5e540d9bc560e8907504d2abc4a0c5d01a7cc9f82a65ea889705cc
276e87e1dd0a513d3af043901b7de287e26e312d41d75d8af8594dbe556a217f716327dfcd1f13fb74798
5f4ca3d6f2fa42ccc8b2f0500d886ce636c0a715f7ab976c2cb8a3e55d45ac602ac18bbd9eb2a12e99fa5
b21af8f835129335d050d34c77fee98a0e7d4b8951adf44a42

Question 5.– Parmi les signatures suivantes, laquelle est correcte ?

s1 = 40659815681280531603635453418205820960841204070498308984173201777100686381082607952999604
13105428059913304225556799389014794930299463183669474421534721160165734715537885912754952
59472532021699390590868740207245406782776617097464722957676301705879514669913884789526933
12356357239110304634485045494380208434551884179977649466283604965168216739688201202556665
25460207133388264925943585781278109204906274098028740410348987637855155958701928224140074
45970277200059116793302970518042020818535165657152503258034394341652528848539239250476763
1686495227136314869529065379486198636743171724132672307520914610190790169550612292

s2 = 11207276672954762281681264294161468950159048717202835239599475455690302565003099697885759
79477679138350930381826843461387955915852699216065813395988085880817555417094867119371479
92180469821825397325936639294248238731695376181540215845330896251638228859163452506119760
21245387146944569597959447097827311324271301730271063037174050872057840676791118377973571
19196257252457304660602157099426880170568721780952572300894931587913739877925665349002771
62934827161657019062840160076224595370272291099089761378305735595316242187233726584269263
79032965241631432932583549203289972558458774043027320493498571519931937436408713462

s3 = 77686762981928298291164124330479384729283212616852067997993984556922492333995475681007142
09262616256724496779656974661014613219191029719659885637719142338297332549134294464997142
16097308002208857948737128234343840025862475155424797453072373379724105617348697934959895
80629436170114245041745086025696760597574237453057443932351089919183363574131471595045159
27598539231574785360036930239333215666747551015446473012676193465704054720584952618127328
24272934432453069234247367562343489005410784501643526313304154777460053663755952673672558
9566252890201807925942667423042131499053497009825257938838884949310490074668208989

Vous aimerez peut-être aussi