Vous êtes sur la page 1sur 189

Tendances de la Cryptologie Moderne

Introduction à la sécurité prouvée

Fabien Laguillaumie

fabien.laguillaumie@info.unicaen.fr
http://users.info.unicaen.fr/~flaguill/

Casablanca, Maroc

1
Introduction
Sécurité Prouvée

Signature
Définition
RSA textbook
GHR
FDH

Chiffrement
Définition
Elgamal
RSA
Cramer-Shoup
Paillier

2
Introduction
Cryptologie :

I Cryptographie :
I conception de systèmes cryptographiques
I étude (preuve) de leur sécurité
I amélioration des performances

I Cryptanalyse :
I mise en défaut des systèmes cryptographiques
I attaque des problèmes algorithmiques sous-jacents
I observation des “canaux auxiliaires”

3
Introduction
Objectifs :

I confidentialité : garantir que le contenu d’une communication (ou


d’un fichier) n’est pas accessible à tout autre personne que le
destinataire légitime

I authenticité : s’assurer de l’identité d’une entité donnée ou de


l’origine d’une communication (ou d’un fichier)

I intégrité : s’assurer que le contenu d’une communication (ou d’un


fichier) n’a pas été modifié de façon malveillante

4
Introduction
Objectifs :

I confidentialité : garantir que le contenu d’une communication (ou


d’un fichier) n’est pas accessible à tout autre personne que le
destinataire légitime
chiffrement
I authenticité : s’assurer de l’identité d’une entité donnée ou de
l’origine d’une communication (ou d’un fichier)

I intégrité : s’assurer que le contenu d’une communication (ou d’un


fichier) n’a pas été modifié de façon malveillante

4
Introduction
Objectifs :

I confidentialité : garantir que le contenu d’une communication (ou


d’un fichier) n’est pas accessible à tout autre personne que le
destinataire légitime
chiffrement
I authenticité : s’assurer de l’identité d’une entité donnée ou de
l’origine d’une communication (ou d’un fichier)
identification/signature
I intégrité : s’assurer que le contenu d’une communication (ou d’un
fichier) n’a pas été modifié de façon malveillante

4
Introduction
Objectifs :

I confidentialité : garantir que le contenu d’une communication (ou


d’un fichier) n’est pas accessible à tout autre personne que le
destinataire légitime
chiffrement
I authenticité : s’assurer de l’identité d’une entité donnée ou de
l’origine d’une communication (ou d’un fichier)
identification/signature
I intégrité : s’assurer que le contenu d’une communication (ou d’un
fichier) n’a pas été modifié de façon malveillante
hachage/signature

4
Introduction
Cyptographie à clé publique

on ne s’échange plus de clé : on la publie !

chaque utilisateur possède un couple

(sk, pk)

où pk est publique et sk est gardée secrète

sk R pk
il est “difficile” de retrouver sk à partir de pk.

New Directions in Cryptography. W. Diffie and M. E. Hellman,


IEEE Transactions on Information Theory, vol. IT-22, Nov. 1976, pp 644–654.

5
Sécurité Prouvée

I Pour se convaincre de la sécurité d’un schéma :


I exhiber une attaque : le système est prouvée non-sûr
si on n’en trouve pas ?
I Système de Chor et Rivest 1 : attaque 2 définitive après 10 ans de vie

I Prouver la sécurité du schéma

I Preuve réductionniste (théorie de la complexité ) dans le “modèle


standard”

I Une preuve fournit une réduction entre la résolution d’un problème


difficile et une attaque contre le protocole

1. A knapsack-type public-key cryptosystem based on arithmetic in finite fields. B.


Chor and R.L. Rivest. IEEE IT, 34(5) : 901–909 (1988)
2. Cryptanalysis of the Chor-Rivest cryptosystem. S. Vaudenay, Proc. of Crypto’98,
Springer LNCS Vol. 1462, 243–256 (1998)
6
Sécurité Prouvée
I Sécurité prouvée
I Défintion d’un modèle de sécurité
I Réduction (polynomiale) à une hypothèse minimale (ex. fonction à
sens unique)
résultats théoriques

La sécurité prouvée garantit qu’un protocole est asymptotiquement sûr, i.e.,


que toute attaque polynomiale échoue pour des clés suffisamment grandes

I Sécurité exacte (ou pratique)


I Rendre la réduction la plus fine possible
i.e., à partir d’une attaque, on peut construire un algorithme qui
casse le schéma sous-jacent avec la même probabilité de réussite.

La sécurité exacte donne une réduction explicite pour fixer la taille des clés
pour une sécurité concrète

7
Sécurité Prouvée
I Hypothèses calculatoires
I Peu de cryptosystèmes sont “inconditionnellement” sûrs

I Exemples :
I existence de fonction à sens-unique
I difficulté de la factorisation
I difficulté du calcul d’un logarithme discret
I difficulté du problème DDH
I ...

I Hypothèses supplémentaires
I modèle de l’oracle aléatoire
I modèle du chiffrement idéal
I modèle générique

I Un attaquant contre un cryptosystème donne lieu à un algorithme de


factorisation en 225 k 10
I k = 1024 2125 opérations
I or NFS a besoin de 2200 opérations pour factoriser...

8
Sécurité Prouvée
Input : the vector −

x `+
˜ m̃ = (x1 , . . . , x`+
˜ m̃ ) whose components are pairwise distinct
elements of (Z/pZ)? which define the polynomials

Y ˜ m̃
`+
Y
f (X ) = (X + xi ) and g (X ) = (X + xi ),
i=1 ˜
i=`+1

the values  ˜ t̃−2


`+ κ·γ·f (γ)


 g0 , g0γ , . . . , g0γ , g0 , (l.1)
˜
ωγ `+t̃−2

 ωγ


 g0 , . . . , g 0 , (l.2)
˜ t̃


 α αγ `+
g0 , g0 , . . . , g0αγ , (l.3)
m̃−2 κ·g (γ)
 h0 , hγ , . . . , hγ

, h0 (l.4)

 0 0
 hω , h , . . . , hωγ m̃−1 ,
ωγ

(l.5)


 0 0 0

 α αγ 2(m̃−t̃)+3
h0 , h0 , . . . , h0αγ (l.6)
where κ, α, γ, ω are unknown random elements of (Z/pZ)? , and finally an element
T ∈ GT .
Output : a bit b.

The problem is correctly solved if the output is b = 1 when T = e(g0 , h0 )κ·f (γ) or if
the output is b = 0 when T is a random value from GT .

9
Sécurité Prouvée
k

Générateur

d’instances I

Réduction
I
attaquant
pk, P

oracle

solution

10
Sécurité des schémas de signatures.

11
Signature
I La signature électronique émule la signature manuscrite.

I Elle doit dépendre du message.

I Elle vérifie les propriétés suivantes :

I authenticité de la source
I intégrité
I résistance à une contrefaçon
I vérification universelle
I non-répudiation

12
Signature

KG

skA pkA
Aida Brahim

m ∈ {0, 1}∗ Σ (m, σ) V valide/invalide

13
Signature
Sécurité d’un schéma de signatures

Définition des buts et des moyens d’un forgeur F.

14
Signature
Sécurité d’un schéma de signatures

Définition des buts et des moyens d’un forgeur F.


I cassage total : F retrouve la clé secrète du signataire,
I forge universelle : F peut signer n’importe quel message,
I forge sélective : F peut signer un message de son choix,
I forge existentielle : F peut générer un couple message/signature
valide.

14
Signature
Sécurité d’un schéma de signatures

Définition des buts et des moyens d’un forgeur F.


I cassage total : F retrouve la clé secrète du signataire,
I forge universelle : F peut signer n’importe quel message,
I forge sélective : F peut signer un message de son choix,
I forge existentielle : F peut générer un couple message/signature
valide.

. une attaque sans message : F ne connaı̂t que pk


. une attaque à messages connus : F a accès à une liste de couples
message/signature de ce signataire,
. une attaque à messages choisis : F obtient des signatures de
messages de son choix.

14
Fonctions de hachage
Definition
Soit ` ∈ N.
Une fonction h : {0, 1}∗ −→ {0, 1}` est une fonction de hachage si
I h est à sens unique (résistante à la préimage)
[étant donné h(x) trouver x 0 tel que h(x 0 ) = h(x) est difficile]
I h est résistante à la seconde préimage
[étant donné x et h(x), trouver x 0 6= x tel que h(x 0 ) = h(x) est
difficile]
I h est résistante aux collisions
[trouver x et x 0 , x 6= x 0 , tels que h(x) = h(x 0 ) est difficile]

h crée une “empreinte” (un haché) de m.

15
Fonctions de hachage

? x 6= ? ? 6= ?

h h h h h

h(x) h(x) = h(x 0) h(x) = h(x 0)

Complexité : 2` 2` 2`/2

16
Signature
Définition
Soit k ∈ N. Un schéma de signatures S est un quadruplet

(Setup,KeyGen,Sign,Verify)

où
I S.Setup est une PPTM prenant en entrée k dont la sortie est
appelée paramètres publics et notée P

S.Setup(k) = P
I S.KeyGen est une PPTM prenant en entrée des paramètres publics
et dont la sortie est un couple (pk, sk) de clés publique et privée

S.KeyGen(P) = (pk, sk)

17
Signature
Définition
Soit k ∈ N. Un schéma de signatures S est un quadruplet

(Setup,KeyGen,Sign,Verify)

I S.Sign est une PPTM prenant en entrée des paramètres publics, un


message et une clé privée. Sa sortie est une chaı̂ne binaire appelée
signature

S.Sign(P, m, sk) = σ
I S.Verify est une PPTM prenant en entrée des paramètres publics,
une clé publique, un message et une chaı̂ne binaire. Elle renvoie un
bit qui vaut 0 si la signature est invalide, et 1 sinon.

S.Verify(P, pk, m, σ) ∈ {0, 1}

17
Signature
Définition
Soit k ∈ N. Un schéma de signatures S est un quadruplet

(Setup,KeyGen,Sign,Verify)

et tel que
∀k ∈ N,
∀P = S.Setup(k),
∀(pk, sk) = S.KeyGen(P),
∀m ∈ {0, 1}∗ ,
∀σ = S.Sign(P, m, sk)
alors

S.Verify(P, pk, m, σ) = 1
avec probabilité 1.
Consistance

17
Signature
Modèle de sécurité :

I La notion de sécurité la plus forte est la


la résistance à une forge existentielle
dans une attaque à messages choisis

I Existential forgery in a chosen message attack : EF-CMA

S. Goldwasser, S. Micali, R. L. Rivest : A Digital Signature Scheme Secure Against Adaptive


Chosen-Message Attacks. SIAM J. Comput. 17(2) : 281-308 (1988)

18
Signature
Modèle de sécurité :
Définition (EF-CMA)
Soit k ∈ N et l’expérience aléatoire suivante :
Experiment Expef−cma
S,F (k)
params = S.Setup(k)
(pk, sk) = S.KeyGen(params)
(m? , σ ? ) ← F Σ (params, pk)
Retourne 1 si S.Verify(params, pk, m? , σ ? ) = 1 et σ ? ne provient pas de Σ
0 sinon
On définit le succès de F comme
h i
Succef-cma ef−cma
S,F (k) = Pr ExpS,F (k) = 1 .

Un schéma de signature est dit résistant aux forges existentielles dans


une attaque à messages choisis si toute PPTM a un succès négligeable
dans cette expérience aléatoire.

19
RSA textbook
I RSA.Setup(k) = {k}
I RSA.KeyGen(k) :
I p et q sont deux grands premiers tels que
2bk/2c−1 ≤ p, q ≤ 2bk/2c − 1
I N = pq
I e et d sont deux entiers premiers à ϕ(N) = (p − 1)(q − 1) tels que

ed = 1 mod ϕ(N)
I Finalement
I (N, e) est la clé publique pk
I (d, p, q) est la clé secrète sk

I RSA.Sign(k, m, (d, p, q)) :

σ = md mod N
I RSA.Verify(k, (N, e), m, σ) :

σ valide ⇐⇒ m = σ e mod N
20
RSA textbook
Sécurité

I Est-il EF-CMA ?

I Est-il EF-KMA ?

I Est-il EF-NMA ?

I Est-il SF-CMA ?

I Est-il TB-NMA ?

21
RSA textbook
Sécurité

I Est-il EF-CMA ? non

I Est-il EF-KMA ?

I Est-il EF-NMA ?

I Est-il SF-CMA ?

I Est-il TB-NMA ?

21
RSA textbook
Sécurité

I Est-il EF-CMA ? non

I Est-il EF-KMA ? non

I Est-il EF-NMA ?

I Est-il SF-CMA ?

I Est-il TB-NMA ?

21
RSA textbook
Sécurité

I Est-il EF-CMA ? non

I Est-il EF-KMA ? non

I Est-il EF-NMA ? non

I Est-il SF-CMA ?

I Est-il TB-NMA ?

21
RSA textbook
Sécurité

I Est-il EF-CMA ? non

I Est-il EF-KMA ? non

I Est-il EF-NMA ? non

I Est-il SF-CMA ? non

I Est-il TB-NMA ?

21
RSA textbook
Sécurité

I Est-il EF-CMA ? non

I Est-il EF-KMA ? non

I Est-il EF-NMA ? non

I Est-il SF-CMA ? non

I Est-il TB-NMA ? oui

21
Signatures GHR
R. Gennaro, S. Halevi, T. Rabin : Secure Hash-and-Sign Signatures Without the Random Oracle.
Proc. of Eurocrypt 1999, Springer LNCS Vol. 1592, 123–139 (1999)

I Besoin de fonctions de hachage “division intractable”


Définition
Experiment Expdi
H,A (k)
h ∈R Hk
(X1 , X2 , . . . , Xn , Y ) ← A(h) Qn
Retourne 1 si Y 6= Xi ∀ i = 1, . . . , n et h(Y ) | i=1 h(Xi )
0 sinon
On définit le succès de A comme
h i
Succid di
H,A (k) = Pr ExpH,A (k) = 1 .

Une famille de fonctions de hachage est dite “division intractable” si


toute PPTM a un succès négligeable dans cette expérience aléatoire.

22
Signatures GHR
R. Gennaro, S. Halevi, T. Rabin : Secure Hash-and-Sign Signatures Without the Random Oracle.
Proc. of Eurocrypt 1999, Springer LNCS Vol. 1592, 123–139 (1999)

I Besoin de fonctions de hachage “division intractable”

Exemple :

h : {0, 1}∗ −→ P`

où P` = {nombres premiers de ` bits}

23
Signatures GHR
I GHR.Setup(k) = {k, H, M}
I GHR.KeyGen(P) = (pk, sk)
I p et q deux premiers tels que 2bk/2c−1 ≤ p, q ≤ 2bk/2c − 1 et
p = 2p 0 + 1, q = 2q 0 + 1
avec p 0 et q 0 premiers
I u ∈R (Z/NZ)∗

pk = (N, u) et sk = (p, q)

I GHR.Sign(P, m, sk = (p, q))


I e = h(m)
−1
I σ ≡ ue (mod N)

I GHR.Verify(P, pk = (N, u), m, σ)

24
Signatures GHR
I GHR.Setup(k) = {k, H, M}
I GHR.KeyGen(P) = (pk, sk)
I p et q deux premiers tels que 2bk/2c−1 ≤ p, q ≤ 2bk/2c − 1 et
p = 2p 0 + 1, q = 2q 0 + 1
avec p 0 et q 0 premiers
I u ∈R (Z/NZ)∗

pk = (N, u) et sk = (p, q)

I GHR.Sign(P, m, sk = (p, q))


I e = h(m)
−1
I σ ≡ ue (mod N)

I GHR.Verify(P, pk = (N, u), m, σ)


?
I σ h(m) ≡ u (mod N)

24
Signatures GHR
Preuve de sécurité
I La sécurité de GHR “repose” sur la difficulté de résoudre le
problème RSA flexible.

Définition (Générateur de clés RSA)


RSAGen est une PPTM prenant en entrée un entier k et retournant
2
(N, e, d) ∈ N × (Z/ϕ(N)Z)∗ avec

p et q deux premiers tels que 2bk/2c−1 ≤ p, q ≤ 2bk/2c − 1


N = pq
ed ≡ 1 (mod ϕ(N))

25
Signatures GHR
Preuve de sécurité

Problème RSA
Définition (Problème RSA)

Experiment Exprsa
A (k)
(N, e, d) = RSAGen(k)
params = (N, e)
y ∈R (Z/NZ)∗
x ← A(params, y )
Retourne 1 si x e ≡ y (mod N)
0 sinon

On définit le succès de A comme


h i
Succrsa
A (k) = Pr Exp RSA
A (k) = 1 .

Le générateur de clés RSA RSAGen produit un problème RSA dur si


toute PPTM a un succès négligeable dans cette expérience aléatoire.

26
Signatures GHR
Preuve de sécurité

Problème RSA flexible


Définition (Problème RSA flexible)

Experiment ExpfArsa (k)


(N, e, d) = RSAGen(k)
params = N // params = (N, e)
y ∈R (Z/NZ)∗
(x, e) ← A(params, y )
Retourne 1 si x e ≡ y (mod N)
0 sinon

On définit le succès de A comme


h i
SuccfArsa (k) = Pr ExpfArsa (k) = 1 .

Le générateur de clés RSA RSAGen produit un problème RSA flexible dur


si toute PPTM a un succès négligeable dans cette expérience aléatoire.

27
Signatures GHR
Preuve de sécurité

Un forgeur de signatures GHR :

Setup
C
pk ?
KeyGen

m
(sk ?, pk ?)
Σ F
σ

(m?, σ?)

On va montrer que l’on peut utiliser ce forgeur existentiel pour résoudre


le problème RSA flexible.

28
Signatures GHR
Preuve de sécurité
I On va construire une réduction R qui résout le problème RSA
flexible.

I Cet algorithme reçoit en entrée une instance aléatoire du problème


RSA flexible :
I RSAGen(k) (N, e, d)
I Le challenger de R tire aléatoirement y ∈ (Z/NZ)∗ et lui fournit
(N, y ) comme challenge

I Il va maintenant falloir que la réduction R mette en relation cette


instance du problème RSA avec notre forgeur :
I simulation du générateur de clés publiques
I simulation de signatures valides pour la clé publique challenge

29
Signatures GHR
Preuve de sécurité

Simulation de GHR.KeyGen
I R tire au hasard m0 ∈ M

I Il pose  Y

 E := h(m)

m∈M\{m0 }


u := y E (mod N)

I R donne pk ? = (u, N) à F comme clé publique challenge.

Cette simulation simule parfaitement la génération des clés publiques


(u aléatoire et N un entier RSA)

30
Signatures GHR
Preuve de sécurité

Simulation de GHR.Sign

Simulation de signatures valides pour pk ?

31
Signatures GHR
Preuve de sécurité

Simulation de GHR.Sign

Simulation de signatures valides pour pk ? ... sans connaı̂tre la clé secrète !

31
Signatures GHR
Preuve de sécurité

Simulation de GHR.Sign

Simulation de signatures valides pour pk ? ... sans connaı̂tre la clé secrète !


I Si m 6= m0 :
I R pose
σ := y E /h(m) (mod N)
0
I Si m = m :
I R s’arrête.

31
Signatures GHR
Preuve de sécurité

Simulation de GHR.Sign

Simulation de signatures valides pour pk ? ... sans connaı̂tre la clé secrète !


I Si m 6= m0 :
I R pose
σ := y E /h(m) (mod N)
0
I Si m = m :
I R s’arrête.
R a-t-elle bien simulé les signatures :
I si m = m0 :

31
Signatures GHR
Preuve de sécurité

Simulation de GHR.Sign

Simulation de signatures valides pour pk ? ... sans connaı̂tre la clé secrète !


I Si m 6= m0 :
I R pose
σ := y E /h(m) (mod N)
0
I Si m = m :
I R s’arrête.
R a-t-elle bien simulé les signatures :
I si m = m0 : non

31
Signatures GHR
Preuve de sécurité

Simulation de GHR.Sign

Simulation de signatures valides pour pk ? ... sans connaı̂tre la clé secrète !


I Si m 6= m0 :
I R pose
σ := y E /h(m) (mod N)
0
I Si m = m :
I R s’arrête.
R a-t-elle bien simulé les signatures :
I si m = m0 : non
I si m 6= m0 :

31
Signatures GHR
Preuve de sécurité

Simulation de GHR.Sign

Simulation de signatures valides pour pk ? ... sans connaı̂tre la clé secrète !


I Si m 6= m0 :
I R pose
σ := y E /h(m) (mod N)
0
I Si m = m :
I R s’arrête.
R a-t-elle bien simulé les signatures :
I si m = m0 : non
I si m 6= m0 : oui car cette signature est valide :
h(m)
σ h(m) ≡ y E /h(m) (mod N)
≡ y E (mod N)
≡ u

31
Signatures GHR
Preuve de sécurité

Exploitation de la forge

Au bout d’un certain temps, F renvoie une forge

(m? , σ ? )

avec une probabilité Succef-cma


GHR,F (k).

I si m? = m0
I alors 0 −1
σ? ≡ u h(m ) (mod N)
0 −1
≡ y Eh(m ) (mod N).

32
Signatures GHR
Preuve de sécurité

Exploitation de la forge

I or 3 pgcd(E , h(m0 )) = 1
R calcule (Bézout) a et b tels que

aE + bh(m0 ) = 1

et

0
y ≡ y aE +bh(m ) (mod N)

3. h est division intractable


33
Signatures GHR
Preuve de sécurité

Exploitation de la forge

I or 3 pgcd(E , h(m0 )) = 1
R calcule (Bézout) a et b tels que

aE + bh(m0 ) = 1

et

0
y ≡ y aE +bh(m ) (mod N)
0
≡ (y E )a × y bh(m ) (mod N)

3. h est division intractable


33
Signatures GHR
Preuve de sécurité

Exploitation de la forge

I or 3 pgcd(E , h(m0 )) = 1
R calcule (Bézout) a et b tels que

aE + bh(m0 ) = 1

et

0
y ≡ y aE +bh(m ) (mod N)
0
≡ (y E )a × y bh(m ) (mod N)
0 −1 0 0
≡ (y Eh(m ) )ah(m ) × (y b )h(m ) (mod N)

3. h est division intractable


33
Signatures GHR
Preuve de sécurité

Exploitation de la forge

I or 3 pgcd(E , h(m0 )) = 1
R calcule (Bézout) a et b tels que

aE + bh(m0 ) = 1

et

0
y ≡ y aE +bh(m ) (mod N)
0
≡ (y E )a × y bh(m ) (mod N)
0 −1 0 0
≡ (y Eh(m ) )ah(m ) × (y b )h(m ) (mod N)
0 0
≡ σ ?ah(m ) × (y b )h(m ) (mod N)

3. h est division intractable


33
Signatures GHR
Preuve de sécurité

Exploitation de la forge

I or 3 pgcd(E , h(m0 )) = 1
R calcule (Bézout) a et b tels que

aE + bh(m0 ) = 1

et

0
y ≡ y aE +bh(m ) (mod N)
0
≡ (y E )a × y bh(m ) (mod N)
0 −1 0 0
≡ (y Eh(m ) )ah(m ) × (y b )h(m ) (mod N)
0 0
≡ σ ?ah(m ) × (y b )h(m ) (mod N)
0
≡ (σ ?a y b )h(m ) (mod N)

3. h est division intractable


33
Signatures GHR
Preuve de sécurité

Exploitation de la forge

En posant
= σ ?a y b

x
e = h(m0 )
on a bien
xe = y (mod N)
i.e., (x, e) est une solution au problème RSA posé à R.

34
Signatures GHR
Preuve de sécurité

Coût de la réduction

Quelle est la probabilité de réussite de notre algorithme R ?

35
Signatures GHR
Preuve de sécurité

Coût de la réduction

Quelle est la probabilité de réussite de notre algorithme R ?

R gagne si
I F réussit sa forge

35
Signatures GHR
Preuve de sécurité

Coût de la réduction

Quelle est la probabilité de réussite de notre algorithme R ?

R gagne si
I F réussit sa forge
I F n’a pas interrogé Σ sur m0

35
Signatures GHR
Preuve de sécurité

Coût de la réduction

Quelle est la probabilité de réussite de notre algorithme R ?

R gagne si
I F réussit sa forge
I F n’a pas interrogé Σ sur m0
I F réussit sa forge sur m0

35
Signatures GHR
Preuve de sécurité

Coût de la réduction

Quelle est la probabilité de réussite de notre algorithme R ?

R gagne si
I F réussit sa forge
I F n’a pas interrogé Σ sur m0
I F réussit sa forge sur m0

SuccfRrsa (k) =

35
Signatures GHR
Preuve de sécurité

Coût de la réduction

Quelle est la probabilité de réussite de notre algorithme R ?

R gagne si
I F réussit sa forge
I F n’a pas interrogé Σ sur m0
I F réussit sa forge sur m0
   
qΣ 1
SuccfRrsa (k) = Succef-cma
GHR,F (k) × 1− ×
#M #M − qΣ

35
Signatures GHR
Preuve de sécurité

Coût de la réduction

Quelle est la probabilité de réussite de notre algorithme R ?

R gagne si
I F réussit sa forge
I F n’a pas interrogé Σ sur m0
I F réussit sa forge sur m0
   
qΣ 1
SuccfRrsa (k) = Succef-cma
GHR,F (k) × 1− ×
#M #M − qΣ

τR = τF + (1 + qΣ )Texp .

35
FDH
Le modèle de l’oracle aléatoire :

I Modèle “standard” insuffisant pour faire une preuve

I Besoin d’hypothèses supplémentaires


idéaliser certains objets

I Dans le modèle de l’oracle aléatoire :


I fonctions de hachage remplacées par des oracles aléatoires
accessibles par tout le monde

I si l’oracle est interrogé sur x,


I il renvoie la valeur précédemment déterminée si la requête existe déjà
I il renvoie une valeur tirée uniformément et aléatoirement

I H-liste

36
FDH
Le modèle de l’oracle aléatoire :

H Setup
m C
m pk ?
H(m) KeyGen
H(m)
m
(sk ?, pk ?)
Σ F
σ

(m?, σ?)

37
FDH
RSA-FDH : – paradigme “hash-and-sign” :
I RSAfdh .Setup(k) = {k}
I RSAfdh .KeyGen(k) :
I p et q sont 2 grands premiers tels que 2bk/2c−1 ≤ p, q ≤ 2bk/2c − 1
I N = pq
I e et d sont deux entiers premiers à ϕ(N) tels que ed = 1 mod ϕ(N)
I Finalement
I (N, e, H) est la clé publique pk
I (d, p, q) est la clé secrète sk
I où H est une famille de fonctions de hachage “Full-Domain Hash” :
h : {0, 1}∗ −→ (Z/NZ)∗

I RSAfdh .Sign(k, m, (d, p, q)) :

σ = h(m)d mod N
fdh
I RSA .Verify(k, (N, e), m, σ) :

σ valide ⇐⇒ h(m) = σ e mod N


38
FDH
RSA-FDH

Théorème (RSA-FDH)
Dans le modèle de l’oracle aléatoire, s’il existe un forgeur existentiel dans
une attaque à messages choisis F contre RSAfdh , de succès ε en temps τ ,
après qΣ requêtes à l’oracle de signature et qH à l’oracle aléatoire, alors il
existe un attaquant contre le problème RSA A avec un succès ε0 en
temps τ 0 tels que
( ε
ε0 '
qΣ + qH + 1
τ 0 = τ + (qΣ + qH )Texp .

(Résultat vrai pour toute permutation à sens-unique à trappe f )

39
Signatures GHR
Preuve de sécurité

Problème RSA
Définition (Problème RSA)

Experiment Exprsa
A (k)
(N, e, d) = RSAGen(k)
params = (N, e)
y ∈R (Z/NZ)∗
x ← A(params, y )
Retourne 1 si x e ≡ y (mod N)
0 sinon

On définit le succès de A comme


h i
Succrsa
A (k) = Pr Exp RSA
A (k) = 1 .

Le générateur de clés RSA RSAGen produit un problème RSA dur si


toute PPTM a un succès négligeable dans cette expérience aléatoire.

40
RSA-FDH
Preuve de sécurité
I On va construire une réduction R qui résout le problème RSA.

I Cet algorithme reçoit en entrée une instance aléatoire du problème


RSA :
I RSAGen(k) (N, e, d)
I Le challenger de R tire aléatoirement y ∈ (Z/NZ)∗ et lui fournit
(N, e, y ) comme challenge

I Il va maintenant falloir que la réduction R mette en relation cette


instance du problème RSA avec notre forgeur :
I simulation du générateur de clés publiques
I simulation de signatures valides pour la clé publique challenge
I simulation de l’oracle aléatoire

41
RSA-FDH
Preuve de sécurité
I Équation de vérification :

σ e ≡ h(m) (mod N)

I Idée : si e = e, N = N et h(m) = y : c’est gagné

I Soit
I qΣ le nombre de requêtes à l’oracle de signature
I qH le nombre de requêtes à l’oracle aléatoire

R commence par tirer aléatoirement i ? ∈ [[1, qΣ + qH + 1 ]] pari


| {z }
# requêtes à H

42
RSA-FDH
Preuve de sécurité

Simulation de RSAfdh .KeyGen

I R donne pk ? = (e, N) à F comme clé publique challenge.

Cette simulation simule parfaitement la génération des clés publiques

43
RSA-FDH
Preuve de sécurité

Simulation de H

I Pour i 6= i ? :
I R regarde si m a déjà été demandé à H
I si oui : il renvoie la valeur déjà retournée

44
RSA-FDH
Preuve de sécurité

Simulation de H

I Pour i 6= i ? :
I R regarde si m a déjà été demandé à H
I si oui : il renvoie la valeur déjà retournée

I si non : il tire ri ∈R Z/NZ et renvoie


H(mi ) = rie (mod N)

44
RSA-FDH
Preuve de sécurité

Simulation de H

I Pour i 6= i ? :
I R regarde si m a déjà été demandé à H
I si oui : il renvoie la valeur déjà retournée

I si non : il tire ri ∈R Z/NZ et renvoie


H(mi ) = rie (mod N)

I Pour i = i ? , R renvoie
H(mi ? ) = y
sinon non déjà demandé et sinon s’arrête

H-liste : (m, H(m), r ) et (mi ? , y , ??)

44
RSA-FDH
Preuve de sécurité

Simulation de RSAfdh .Sign

Simulation de signatures valides pour pk ?

45
RSA-FDH
Preuve de sécurité

Simulation de RSAfdh .Sign

Simulation de signatures valides pour pk ? ... sans connaı̂tre la clé secrète !

45
RSA-FDH
Preuve de sécurité

Simulation de RSAfdh .Sign

Simulation de signatures valides pour pk ? ... sans connaı̂tre la clé secrète !


I Pour m 6= mi ? , R fait appel à l’oracle aléatoire et obtient H(m) et r
tel que
H(m) = r e (mod N)
R renvoie r comme signature de m.

I si la forge se fait sur mi ? , il n’est pas demandé à Σ (si demande : R


s’arrête).

Simulation OK !

45
RSA-FDH
Preuve de sécurité

Exploitation de la forge :

Au bout d’un certain temps, F sort m? et σ ? tels que

σ ? e ≡ h(m? ) (mod N)

I si m? = mi ? , h(m? ) = y et c’est gagné :

σ? e ≡ y (mod N)

46
RSA-FDH
Preuve de sécurité

Exploitation de la forge :

Au bout d’un certain temps, F sort m? et σ ? tels que

σ ? e ≡ h(m? ) (mod N)

I si m? = mi ? , h(m? ) = y et c’est gagné :

σ? e ≡ y (mod N)

I Quelle réussite ?
1
Succrsa
R (k) = Succef-cma
RSAfdh ,F (k)
qΣ + qH + 1
I τ 0 = τ + (qΣ + qH )Texp

46
Sécurité du chiffrement.

47
Le chiffrement
Définition informelle

KG
Aida Brahim

kE kD

m E c c D m

4 Génération du couple de clés (sk, pk) (Key Generation)


4 Chiffrement d’un message (Encryption)
4 Déchiffrement d’un chiffré (Decryption)

48
Le chiffrement
Définition informelle

Propriété de sécurité : il doit être “impossible” de déchiffrer un chiffré


sans la clé secrète
Définition des buts et des moyens de l’attaquant.

Ses buts :
I retrouver la clé secrète
cassage total

49
Le chiffrement
Définition informelle

Propriété de sécurité : il doit être “impossible” de déchiffrer un chiffré


sans la clé secrète
Définition des buts et des moyens de l’attaquant.

Ses buts :
I retrouver la clé secrète
cassage total
I déchiffrement à volonté - sans avoir la clé secrète
attaque contre le “sens-unique”

49
Le chiffrement
Définition informelle

Propriété de sécurité : il doit être “impossible” de déchiffrer un chiffré


sans la clé secrète
Définition des buts et des moyens de l’attaquant.

Ses buts :
I retrouver la clé secrète
cassage total
I déchiffrement à volonté - sans avoir la clé secrète
attaque contre le “sens-unique”
I distinguer 2 messages clairs grâce au chiffré de l’un d’eux
sécurité sémantique/indistinguabilité

49
Le chiffrement
Définition informelle

Propriété de sécurité : il doit être “impossible” de déchiffrer un chiffré


sans la clé secrète
Définition des buts et des moyens de l’attaquant.

Ses buts :
I retrouver la clé secrète
cassage total
I déchiffrement à volonté - sans avoir la clé secrète
attaque contre le “sens-unique”
I distinguer 2 messages clairs grâce au chiffré de l’un d’eux
sécurité sémantique/indistinguabilité
I à partir d’un chiffré, en créer un autre, les 2 clairs étant “reliés”
malléabilité

49
Le chiffrement
Définition informelle

Ses moyens
I chiffrés de messages clairs de son choix (et pk)
attaque à clairs choisis
chosen plaintext attack - CPA

50
Le chiffrement
Définition informelle

Ses moyens
I chiffrés de messages clairs de son choix (et pk)
attaque à clairs choisis
chosen plaintext attack - CPA
I déchiffrement de messages de son choix
attaque à chiffrés choisis
chosen ciphertext attack- CCA1

50
Le chiffrement
Définition informelle

Ses moyens
I chiffrés de messages clairs de son choix (et pk)
attaque à clairs choisis
chosen plaintext attack - CPA
I déchiffrement de messages de son choix
attaque à chiffrés choisis
chosen ciphertext attack- CCA1
I déchiffrement de messages de son choix après le défi
attaque à chiffrés choisis adaptative
chosen ciphertext attack- CCA2

50
Le chiffrement
Définition informelle

Ses moyens
I chiffrés de messages clairs de son choix (et pk)
attaque à clairs choisis
chosen plaintext attack - CPA
I déchiffrement de messages de son choix
attaque à chiffrés choisis
chosen ciphertext attack- CCA1
I déchiffrement de messages de son choix après le défi
attaque à chiffrés choisis adaptative
chosen ciphertext attack- CCA2
( + oracle de vérification de chiffré)
( + oracle de vérification de couple clair/chiffré )

50
Le chiffrement
I Scénario minimal :
Sens unique sous une attaque à clairs choisis (OW-CPA)
I Scénario de référence :
Indistinguabilité sous une attaque à chiffrés choisis adaptative
(IND-CCA2)

IND-CCA1 : (lunch time attack) Public-key Cryptosystems Provably Secure against


Chosen Ciphertext Attacks. Moni Naor, Moti Yung, Proc. of STOC’90, ACM Press, pp. 427–437

IND-CCA2 : Non-Interactive Zero-Knowledge Proof of Knowledge and Chosen Ciphertext


Attack. Charles Rackoff, Daniel R. Simon, Proc. of Crypto’91, Springer LNCS 576, pp. 433–444

51
Le chiffrement
Définition formelle

Définition (Schéma de chiffrement)


Soit k ∈ N. Un schéma de chiffrement Π est défini par
I Setup : Π.Setup(k) (params)
I Génération des clés : Π.KeyGen(params) (sk, pk)
I Encrypt : Π.Encrypt(params, pk, m) c
I Decrypt : Π.Decrypt(params, sk, c) m ou ⊥
tels que
∀ k ∈ N, ∀ params = Π.Setup(k), ∀ (sk, pk) = Π.KeyGen(params),

Π.Decrypt(params, sk, Π.Encrypt(params, pk, m)) = m

52
Le chiffrement
Définition formelle

Le modèle de sécurité : INDistinguishability / semantic security

-atk I atk = cpa et


Experiment Expind
Π,A (k) I O1 = ∅
params ← Π.Setup(k) I O2 = ∅
(pk, sk) ← Π.KeyGen(params) I atk = cca1 et
(m0 , m1 , s) ← A1 O1 (params, pk) avec I O1 = Π.Decrypt(params, s
R
b? ←− {0, 1} I O2 = ∅
c ? ← Π.Encrypt(params, pk, mb? ) I atk = cca2 et
b ← A2 O2 (s, c ? ) I O1 = Π.Decrypt(params, s
Retourne b = b ? ∧ O2 non interrogé sur c ? I O2 = Π.Decrypt(params, s

53
Le chiffrement
Définition formelle

Le modèle de sécuité : INDistinguishability / semantic security

On dit que l’attaquant A = (A1 , A2 ) gagne ce jeu si

Advind-atk ? ?
Π,A (k) = |Pr(b = 1 | b = 1) − Pr(b = 1 | b = 0)|

est non-négligeable.

Notez que

ind-atk 1 1
= Advind-atk

Pr(ExpΠ,A (k) = 1) − Π,A (k)
2 2

54
Le chiffrement
Définition formelle

En effet 4 :

Pr(Expind -atk Pr(b = b ? )


Π,A (k) = 1) =

4. Pr(A ∧ B) = Pr(A | B) Pr(B) et Pr(A | B) = 1 − Pr(Ā | B)


55
Le chiffrement
Définition formelle

En effet 4 :

Pr(Expind -atk Pr(b = b ? )


Π,A (k) = 1) =
= Pr(b = 1 ∧ b ? = 1) + Pr(b = 0 ∧ b ? = 0)
= Pr(b = 1 | b ? = 1) Pr(b ? = 1)
+ Pr(b = 0 | b ? = 0) Pr(b ? = 0)
1   1
= · Pr(b = 1 | b = 1) + 1 − Pr(b = 1 | b ? = 0) ·
?
2 2

-atk 1 1
Pr(Expind
Π,A (k) = 1) − = Advind-atk
Π,A (k)
2 2

4. Pr(A ∧ B) = Pr(A | B) Pr(B) et Pr(A | B) = 1 − Pr(Ā | B)


55
Le chiffrement
Définition formelle

On parle d’attaquant (ε, τ, qD )-IND-atk si

4 son avantage Advind-atk


Π,A (k) = ε
4 son temps d’exécution est τ
4 son nombre de requêtes à l’oracle de déchiffrement est qD .

56
Le chiffrement
INDistinguishability under a Chosen Message Attack (IND-CCA2)

Setup k

pk KeyGen
c
D(sk, ·)
m ou ⊥ A1 (sk, pk)

m0, m1
b ? ∈R {0, 1}
c ? ← E (pk, mb? ) c?

c A2
D(sk, ·)
m ou ⊥
b

57
Le chiffrement
Remarques :

I A2 n’interroge pas D(sk, ·) sur c ? !

I Cette notion n’a de sens que pour des schémas probabilistes :

A1 propose m0 et m1 pour lesquels il a calculé les chiffrés c0 et c1


Son challenger qui lui renvoie c ? = c0 ou c1 !

58
Elgamal

I cryptosystème “basé” sur le problème du logarithme discret


I implanté dans GNU Privacy Guard (gpg)
I le Digital Signature Algorithm (standard US) est une variante du
schéma de signatures Elgamal.

A Public-Key Cryptosystem and a Signature Scheme Based on Discrete Logarithms. Taher


Elgamal. IEEE Transactions on Information Theory, v. IT-31, n. 4, pp. 469–472 (1985)

59
Elgamal
Description
I Elgamal.Setup(k) {k, G, g , q}

60
Elgamal
Description
I Elgamal.Setup(k) {k, G, g , q}
I G est un groupe cyclique d’ordre 2k−1 < q < 2k
I g est un générateur de G.

60
Elgamal
Description
I Elgamal.Setup(k) {k, G, g , q}
I G est un groupe cyclique d’ordre 2k−1 < q < 2k
I g est un générateur de G.
I Elgamal.KeyGen(params) (x, y )

60
Elgamal
Description
I Elgamal.Setup(k) {k, G, g , q}
I G est un groupe cyclique d’ordre 2k−1 < q < 2k
I g est un générateur de G.
I Elgamal.KeyGen(params) (x, y ) avec
I x ∈ [[1, q − 1]]
I y = gx

60
Elgamal
Description
I Elgamal.Setup(k) {k, G, g , q}
I G est un groupe cyclique d’ordre 2k−1 < q < 2k
I g est un générateur de G.
I Elgamal.KeyGen(params) (x, y ) avec
I x ∈ [[1, q − 1]]
I y = gx
I Elgamal.Encrypt(params, y , m) c = (u, v )

60
Elgamal
Description
I Elgamal.Setup(k) {k, G, g , q}
I G est un groupe cyclique d’ordre 2k−1 < q < 2k
I g est un générateur de G.
I Elgamal.KeyGen(params) (x, y ) avec
I x ∈ [[1, q − 1]]
I y = gx
I Elgamal.Encrypt(params, y , m) c = (u, v )
I r ∈R [[1, q − 1]]
I u = gr
I v = my r

60
Elgamal
Description
v
I Elgamal.Decrypt(params, x, (u, v )) m=
ux

61
Elgamal
Description
v
I Elgamal.Decrypt(params, x, (u, v )) m=
ux
En effet
v my r (g x )r
= = m =m
ux (g r )x (g r )x

61
Elgamal
Description
v
I Elgamal.Decrypt(params, x, (u, v )) m=
ux
En effet
v my r (g x )r
= = m =m
ux (g r )x (g r )x

Remarques :
I le chiffré est composé de 2 éléments dans G
I 2 exponentiations pour chiffrer (indépendantes du message) et 1
exponentiation pour déchiffrer
I Elgamal est probabiliste ! espoir d’indistinguabilité

61
Elgamal
Sécurité d’Elgamal
I Elgamal est malléable
Étant donné c1 = (u1 , v1 ) et c2 = (u2 , c2 ) un attaquant peut calculer
c = (u1 × u2 , v1 × v2 ) le chiffré de m1 × m2 :

c = (g r1 +r2 , m1 m2 y r1 +r2 )

62
Elgamal
Sécurité d’Elgamal
I Elgamal est malléable
Étant donné c1 = (u1 , v1 ) et c2 = (u2 , c2 ) un attaquant peut calculer
c = (u1 × u2 , v1 × v2 ) le chiffré de m1 × m2 :

c = (g r1 +r2 , m1 m2 y r1 +r2 )
I Elgamal n’est pas IND-CCA2 (il est malléable !)

L’attaquant choisit m0 et m1 à l’issue de la première phase.


Son challenger lui renvoie le chiffré de l’un des deux :

c ? = (g r , mb y r )

62
Elgamal
Sécurité d’Elgamal

INDistinguishability under a Chosen Message Attack (IND-CCA2)

Setup k

pk KeyGen
c
D(sk, ·)
m ou ⊥ A1 (sk, pk)

m0, m1
b ? ∈R {0, 1}
c ? ← E (pk, mb? ) c?

c A2
D(sk, ·)
m ou ⊥
b

63
Elgamal
Sécurité d’Elgamal
I Elgamal est malléable
Étant donné c1 = (u1 , v1 ) et c2 = (u2 , c2 ) un attaquant peut calculer
c = (u1 × u2 , v1 × v2 ) le chiffré de m1 × m2 :

c = (g r1 +r2 , m1 m2 y r1 +r2 )
I Elgamal n’est pas IND-CCA2 (il est malléable !)

L’attaquant choisit m0 et m1 à l’issue de la première phase.


Son challenger lui renvoie le chiffré de l’un des deux :
c ? = (g r , mb y r )
Dans la deuxième phase, l’attaquant demande le déchiffrement de
(u, v ) = (g r , g × mb y r )
qui est
g × mb y r
=g ×m retrouve m en divisant par g
(g r )x
64
Elgamal
Sécurité d’Elgamal
I Elgamal est OW-CPA sous l’hypothèse que le problème calculatoire
Diffie-Hellman est dur.

Problème CDH : étant donné g , g x et g y dans G, calculer g xy

65
Elgamal
Sécurité d’Elgamal
I Elgamal est OW-CPA sous l’hypothèse que le problème calculatoire
Diffie-Hellman est dur.

Problème CDH : étant donné g , g x et g y dans G, calculer g xy

I Théorème
Sous l’hypothèse que le problème décisionnel Diffie-Hellman est dur,
Elgamal est IND-CPA.

Problème DDH : étant donné g , g x , g y et g z dans G, décider si z = xy

65
Elgamal
Sécurité d’Elgamal

Experiment Expddh A (k)


(q, G, g ) = DLGen(k)
x ∈R [[1, q − 1]]
y ∈R [[1, q − 1]]
b ? ∈R {0, 1}
if b ? = 0 RAND
z ∈R [[1, q − 1]]
if b ? = 1 DH
z ≡ xy mod q
params = (q, G, g , g x , g y , g z )
b ← A(params, y )
Retourne b = b ?

Advddh ? ?
A (k) = |Pr(b = 1 | b = 1) − Pr(b = 1 | b = 0)|

66
Elgamal
Sécurité d’Elgamal

Preuve :
on suppose l’existence d’un attaquant (τ, ε)-IND-CPA A contre Elgamal et
on exhibe explicitement un attaquant (τ 0 , ε0 ) B contre DDH avec τ 0 et ε0
étant fonction (polynomiale) de τ et ε respectivement.

R Setup k
(G, q , g , g x , g y , g z )

pk KeyGen

A1 (sk, pk)

m0, m1
b ? ∈R {0, 1}
c ? ← E (pk, mb? ) c?

A2

b
bB

67
Elgamal
Sécurité d’Elgamal

Preuve :
On va construire R qui reçoit en entrée (G, q, g , g x , g y , g z ) et décide si
z = xy .

68
Elgamal
Sécurité d’Elgamal

Preuve :
On va construire R qui reçoit en entrée (G, q, g , g x , g y , g z ) et décide si
z = xy .

I R définit params = {G, q, g }


I R donne à A la clé publique y = g x

68
Elgamal
Sécurité d’Elgamal

Preuve :
On va construire R qui reçoit en entrée (G, q, g , g x , g y , g z ) et décide si
z = xy .

I R définit params = {G, q, g }


I R donne à A la clé publique y = g x
I R reçoit les deux messages m0 et m1 de la part de A

68
Elgamal
Sécurité d’Elgamal

Preuve :
On va construire R qui reçoit en entrée (G, q, g , g x , g y , g z ) et décide si
z = xy .

I R définit params = {G, q, g }


I R donne à A la clé publique y = g x
I R reçoit les deux messages m0 et m1 de la part de A
I R tire un bit b ? au hasard et renvoie comme chiffré challenge
c ? = (g y , g z mb? )

68
Elgamal
Sécurité d’Elgamal

Preuve :
On va construire R qui reçoit en entrée (G, q, g , g x , g y , g z ) et décide si
z = xy .

I R définit params = {G, q, g }


I R donne à A la clé publique y = g x
I R reçoit les deux messages m0 et m1 de la part de A
I R tire un bit b ? au hasard et renvoie comme chiffré challenge
c ? = (g y , g z mb? )
I A retourne un bit b
I R renvoie finalement bB = 1 si et seulement si

b = b?

68
Elgamal
Sécurité d’Elgamal

Preuve :
Notons
I Rand l’événement “z est tiré aléatoirement dans [[1, q − 1]]”
I DH l’événement “z = xy ”
On souhaite évaluer la probabilité

Advddh
R (k) = Pr[R = 1|DH] − Pr[R = 1|RAND]

On a
ind-cpa
1 AdvElgamal,A (k)
I Pr[R = 1|DH] = +
2 2

puisqu’alors c = (g y , g z mb? ) = (g y , g xy mb? ) est un chiffré valide de


mb? sous la clé publique g x .

69
Elgamal
Sécurité d’Elgamal

Preuve :
1
I Pr[R = 1|RAND] =
2
puisqu’alors la deuxième partie du chiffré est complètement
aléatoire, indépendante du message, et en particulier de b ? : A ne
1
peut donc prédire b ? avec une probabilité meilleure que .
2
Et finalement,
ddh
Advind-cpa
Elgamal,A (k)
AdvR (k) = .
2
R a le même temps d’exécution que A.

70
Elgamal
Un Elgamal IND-CCA2 : Fujisaki-Okamoto.
I Elgamal.Setup(k) {k, G, g , q, H}
I G est un groupe cyclique d’ordre 2k−1 < q < 2k
I g est un générateur de G.
I H : {0, 1}k −→ [[1, q − 1]] est une fonction de hachage
I Elgamal.KeyGen(params) (x, y )
avec
I x ∈ [[1, q − 1]]
I y = gx
I Elgamal.Encrypt(params, y , m) c = (u, v )
k0 k−k0
I r ∈R {0, 1} et m ∈ {0, 1}
I u = g H(m||r )
I v = (m||r )y H(m||r )

71
Elgamal
Un Elgamal IND-CCA2 : Fujisaki-Okamoto.
I Elgamal.Decrypt(params, x, (u, v )) m ou ⊥
x
h v ik−k0
I si u = g H(v /u )
alors m = x
u
I sinon ⊥

72
Elgamal
Un Elgamal IND-CCA2 : Fujisaki-Okamoto.
I Elgamal.Decrypt(params, x, (u, v )) m ou ⊥
x
h v ik−k0
I si u = g H(v /u )
alors m = x
u
I sinon ⊥

Théorème
Dans le modèle de l’oracle, le schéma Elgamal modifié précédent atteint
le niveau de sécurité IND-CCA2 si le problème décisionnel Diffie-Hellman
est dur.

How to Enhance the Security of Public-Key Encryption at Minimum Cost. Eiichiro Fujisaki and
Tatsuaki Okamoto. Proc. of PKC’99, Springer LNCS 1560, pp. 53–68 (1999)

72
Elgamal
Un Elgamal IND-CCA1 dans le modèle standard : Damgård
I Elgamal.Setup(k) {k, G, g , q}
I G est un groupe cyclique d’ordre 2k−1 < q < 2k
I g est un générateur de G.
 
I Elgamal.KeyGen(params) (x, z), (y , w )
avec
I x, z ∈ [[1, q − 1]]2
I y = gx, w = gz
I Elgamal.Encrypt(params, y , m) c = (c1 , c2 , c3 )
k0 k−k0
I r ∈R {0, 1} et m ∈ {0, 1}
I c1 = w r
I c2 = g r
I c3 = my r

73
Elgamal
Un Elgamal IND-CCA1 dans le modèle standard : Damgård
I Elgamal.Decrypt(params, (x, w ), (c1 , c2 , c3 )) m ou ⊥
c3
I si c1 = c2z alors m = x
c2
I sinon ⊥

74
Elgamal
Un Elgamal IND-CCA1 dans le modèle standard : Damgård
I Elgamal.Decrypt(params, (x, w ), (c1 , c2 , c3 )) m ou ⊥
c3
I si c1 = c2z alors m = x
c2
I sinon ⊥

Théorème
Dans le modèle standard, le schéma Elgamal modifié précédent atteint le
niveau de sécurité IND-CCA1 sous une hypothèse “non-standard”.

Towards Practical Public Key Systems Secure Against Chosen Ciphertext Attacks. Ivan Damgård.
Proc. of Crypto’91, Springer LNCS 576, pp. 445–456 (1992)

74
RSA
Rappel : RSA “textbook”
I RSA.Setup(k) {k}
 
I RSA.KeyGen(params) (d, p, q), (N, e)
avec
I p et q deux premiers tels que 2bk/2c−1 < p, q < 2bk/2c
I N = pq
I pgcd(e, ϕ(N)) = 1 et ed = 1 mod ϕ(N)

I RSA.Encrypt(params, (N, e), m) c = me mod N

I RSA.Decrypt(params, (d, p, q), c) m = c d mod N

75
RSA
Remarque : RSA et théorème des restes chinois

Accélération du déchiffrement :

76
RSA
Remarque : RSA et théorème des restes chinois

Accélération du déchiffrement :
I dp = d mod p et dq = d mod q
I mp = c dp mod p et mq = c dq mod q
I v = (mq − mp )p −1 mod q

m = mp + pv
déchiffrement 4 fois plus rapide ! (exponentiation : O(log(d) log(N)2 ))

Fast Decipherment Algorithm for RSA Public-Key Cryptosystem. Jean-Jacques Quisquater et


Chantal Couvreur, Electr. Letters, 18, pp. 905–907 (1982)

76
RSA
Sécurité de RSA
I RSA n’est pas indistinguable

I RSA est malléable :


étant donné c1 = m1e mod N et c2 = m2e mod N un attaquant
peut calculer
c1 c2 = (m1 m2 )e mod N
le chiffré de m1 m2 .

I RSA est OW-CPA sous l’hypothèse que le problème RSA est dur.

Problème RSA : étant donné y , N et e, trouver x tel que y = x e mod N

77
RSA
Sécurité de RSA
I Supposons qu’un attaquant A veuille obtenir le message clair
correspondant au chiffré c ? (= m? eA mod NA ).
I Cet attaquant peut accéder au mécanisme de déchiffrement 1 seule
fois, mais ne peut pas lui soumettre c ? .
I Comment alors obtenir m? ?

78
RSA
Sécurité de RSA
I Supposons qu’un attaquant A veuille obtenir le message clair
correspondant au chiffré c ? (= m? eA mod NA ).
I Cet attaquant peut accéder au mécanisme de déchiffrement 1 seule
fois, mais ne peut pas lui soumettre c ? .
I Comment alors obtenir m? ?
I A tire au hasard r ∈ Z/NA Z et calcule c̃ = r eA × c ? mod NA .

78
RSA
Sécurité de RSA
I Supposons qu’un attaquant A veuille obtenir le message clair
correspondant au chiffré c ? (= m? eA mod NA ).
I Cet attaquant peut accéder au mécanisme de déchiffrement 1 seule
fois, mais ne peut pas lui soumettre c ? .
I Comment alors obtenir m? ?
I A tire au hasard r ∈ Z/NA Z et calcule c̃ = r eA × c ? mod NA .
I il soumet c̃ à l’oracle de déchiffrement qui lui renvoie

m̃ = (r eA × c ? )dA mod NA
= r eA dA × c ?dA mod NA
= r × m? mod NA

A retrouve m? = m̃/r .

cf. signatures aveugles

78
RSA
Sécurité de RSA
I Attaque de Håstad :
Brahim1, Brahim2 , Brahim3 ont respectivement comme clé publique
(3, N1 ), (3, N2 ) et (3, N3 ).
Aida leur envoie le même message m, chiffré.

Un attaquant voit passer :



 c1 = m 3 mod N1
c2 = m 3 mod N2
c3 = m 3 mod N3

79
RSA
Sécurité de RSA
I Attaque de Håstad :
Brahim1, Brahim2 , Brahim3 ont respectivement comme clé publique
(3, N1 ), (3, N2 ) et (3, N3 ).
Aida leur envoie le même message m, chiffré.

Un attaquant voit passer :



 c1 = m 3 mod N1
c2 = m 3 mod N2
c3 = m 3 mod N3

Théorème des restes chinois m3 mod N1 N2 N3

Or m < Ni pour i = 1, 2, 3 =⇒ m3 < N1 N2 N3

Et m s’obtient par une extraction de racine cubique entière !

79
RSA
Sécurité de RSA

Attaque de Wiener :
I contexte : utiliser un petit exposant secret pour accélérer le
déchiffrement
I ed = 1 mod ϕ(N) =⇒ ed = 1 + kϕ(N) pour un k ∈ Z
I si p ≈ q, on peut obtenir la majoration

e
− k ≤ √3

N d N

Théorème
Supposons que pgcd(a, b) = pgcd(c, d) = 1, et
a c 1
− ≤ .

b d 2d 2
Alors c/d est l’une des réduites du développement en fractions continues
de a/b.
80
RSA
Sécurité de RSA
3 1
I Donc si √ ≤ 2
, soit
N 2d

N 1/4
d≤ √ ,
6
e
on retrouve d en calculant le développement en fraction continue de
N
(algorithme d’Euclide)

I Amélioration de cette attaque : Boneh-Durfee (EC’99)

d ≤ N 0,292
Recherche d’une “petite” racine du polynôme

f (x, y ) = x (N + 1 + y ) − 1 mod e

81
RSA
Sécurité de RSA

I Théorème (Howgrave-Graham)
Soit h(x, y ) ∈ Z[x, y ] un polynôme, somme d’au plus ω monômes.
Si
1. h(x0 , y0 ) = 0 mod e m pour m ∈ N, avec | x0 |< X0 et | y0 |< Y0 , et
2. kh(xX , yY )k < e m /ω
alors h(x0 , y0 ) = 0 dans les entiers.

recherche d’un polynôme de petite norme dont (x0 , y0 ) est une


racine modulo e m .

82
RSA
Sécurité de RSA

Stratégie :
I construire une famille échelonnée de polynômes dont (x0 , y0 ) est
racine
I construire un réseau grâce à ces polynômes
I utiliser LLL pour obtenir deux combinaisons linéaires de petite
norme de polynômes de cette famille
I si le réseau a un déterminant suffisamment petit, on se ramène à la
recherche de racines entières.

Small Solutions to Polynomial Equations, and Low Exponent RSA Vulnerabilities. Don
Coppersmith, J. Cryptology 10(4), pp. 233–260 (1997)
New RSA Vulnerabilities Using Lattice Reduction Methods, Alexander May, PhD thesis University
of Paderborn, 2003.

83
RSA

RSAcpa : un chiffrement RSA IND-CPA

84
RSA
I RSAcpa .Setup(k) {k, H}
 
I RSAcpa .KeyGen(params) (d, p, q), (N, e)
avec
I p et q deux premiers tels que 2bk/2c−1 < p, q < 2bk/2c
I N = pq
I pgcd(e, ϕ(N)) = 1 et ed = 1 mod ϕ(N)

I RSAcpa .Encrypt(params, (N, e), m) c = (y , z) avec


I x ∈R Z/NZ
I y = x e (mod N)
I z = h(x) ⊕ m

I RSAcpa .Decrypt(params, (d, p, q), c) m

85
RSA
I RSAcpa .Setup(k) {k, H}
 
I RSAcpa .KeyGen(params) (d, p, q), (N, e)
avec
I p et q deux premiers tels que 2bk/2c−1 < p, q < 2bk/2c
I N = pq
I pgcd(e, ϕ(N)) = 1 et ed = 1 mod ϕ(N)

I RSAcpa .Encrypt(params, (N, e), m) c = (y , z) avec


I x ∈R Z/NZ
I y = x e (mod N)
I z = h(x) ⊕ m

I RSAcpa .Decrypt(params, (d, p, q), c) m


I x = y d (mod N)
I m = z ⊕ h(x)

85
RSA

Théorème (RSA - CPA)


Dans le modèle de l’oracle aléatoire, s’il existe un attaquant
(τ, qH , ε)-IND-CPA contre RSAcpa , alors il existe un algorithme qui casse
le problème RSA avec une probabilité ε au bout d’un temps τ 0 , avec
τ 0 = τ + qH TExp .

86
RSA

Setup k

pk KeyGen
m
H
H(m) A1 (sk, pk)

m0, m1
b ? ∈R {0, 1}
c ? ← E (pk, mb? ) c?

m A2
H
H(m)
b

87
RSA
Preuve :
I Nous allons construire une réduction R qui reçoit en entrée un
challenge
(N, e, y )
I R donne A la clé publique (N, e)
I R reçoit les deux messages m0 et m1 de la part de A
I Le chiffré challenge est

c ? = (y ? , z ? )
avec
y ? = x ? e (mod N) pour un x ? ∈R Z/NZ

z ? = H(x ? ) ⊕ mb?

88
RSA

R Setup k
(N , e , y )

m
pk KeyGen

H
A1 (sk, pk)
H(m)

m0 , m1
b ? ∈R {0, 1}
c ? ← E (pk, mb? ) c?

m
A2
H

H(m) b
x

89
RSA
Preuve :

I Si A ne demande jamais à H le haché de x ? , H(x ? ) est une valeur


complètement aléatoire et z ? est un one-time pad de mb? .
donc c ? est indépendant de mb?

I La seule façon pour A d’avoir un avantage non nul est d’interroger


H sur x ? .

90
RSA
Preuve :

I Pour simuler l’oracle aléatoire, R maintient une H-liste :


I R produit r ∈R {0, 1}`x et renvoie cette valeur si la requête était
absente de la H-liste

I si x e = y (mod N), R s’arrête et retourne x.

I Pour simuler le chiffré challenge, R tire z ? aléatoirement dans


{0, 1}`x et pose
c ? = (y , z ? )

91
RSA
Preuve :

I Pour simuler l’oracle aléatoire, R maintient une H-liste :


I R produit r ∈R {0, 1}`x et renvoie cette valeur si la requête était
absente de la H-liste

I si x e = y (mod N), R s’arrête et retourne x.

I Pour simuler le chiffré challenge, R tire z ? aléatoirement dans


{0, 1}`x et pose
c ? = (y , z ? )

I Ce n’est pas un chiffré valide

91
RSA
Preuve :

I Pour simuler l’oracle aléatoire, R maintient une H-liste :


I R produit r ∈R {0, 1}`x et renvoie cette valeur si la requête était
absente de la H-liste

I si x e = y (mod N), R s’arrête et retourne x.

I Pour simuler le chiffré challenge, R tire z ? aléatoirement dans


{0, 1}`x et pose
c ? = (y , z ? )

I Ce n’est pas un chiffré valide


La seule façon pour A de s’en rendre compte est de demander
H(x ? ) pour x ? tel que
x ?e = y (mod N)
que R peut retrouver dans sa H-liste.
91
RSA
Preuve :

I Soit Q l’événement “A fait la requête sur x ? ”, alors

Succrsa
R (k) = Pr[Q].

92
RSA
Preuve :

I Soit Q l’événement “A fait la requête sur x ? ”, alors

Succrsa
R (k) = Pr[Q].

I Par ailleurs
Advind-cpa ?
RSAcpa ,A (k) = 2 Pr[b = b ] − 1

92
RSA
Preuve :

I Soit Q l’événement “A fait la requête sur x ? ”, alors

Succrsa
R (k) = Pr[Q].

I Par ailleurs
Advind-cpa ?
RSAcpa ,A (k) = 2 Pr[b = b ] − 1

I Or,

Pr[b = b ? ] = Pr[b = b ? |Q]. Pr[Q] + Pr[b = b ? |Q̄]. Pr[Q̄]

92
RSA
Preuve :

I Soit Q l’événement “A fait la requête sur x ? ”, alors

Succrsa
R (k) = Pr[Q].

I Par ailleurs
Advind-cpa ?
RSAcpa ,A (k) = 2 Pr[b = b ] − 1

I Or,

Pr[b = b ? ] = Pr[b = b ? |Q]. Pr[Q] + Pr[b = b ? |Q̄]. Pr[Q̄]

1
≤ Pr[Q] + (1 − Pr [Q])
2

92
RSA
Preuve :

parce que :

93
RSA
Preuve :

parce que :

Pr[b = b ? |Q] ≤ 1












93
RSA
Preuve :

parce que :

Pr[b = b ? |Q] ≤ 1







Pr[Q̄] = 1 − Pr [Q]





93
RSA
Preuve :

parce que :

Pr[b = b ? |Q] ≤ 1







Pr[Q̄] = 1 − Pr [Q]




 Pr[b = b ? |Q̄] =

93
RSA
Preuve :

parce que :

Pr[b = b ? |Q] ≤ 1







Pr[Q̄] = 1 − Pr [Q]


 Pr[b = b ? |Q̄] = 1



2

93
RSA
Preuve :

parce que :

Pr[b = b ? |Q] ≤ 1







Pr[Q̄] = 1 − Pr [Q]


 Pr[b = b ? |Q̄] = 1



2

Ainsi,
Pr[Q] ≥ 2 Pr[b = b ? ] − 1 = Advind-cpa
RSAcpa ,A (k)

soit
ind-cpa
Succrsa
R (k) ≥ AdvRSAcpa ,A (k)

et τ = τ 0 + qH TExp .

93
RSA

RSA-OAEP

94
RSA
OAEP

Optimal Asymmetric Encryption Padding

f : {0, 1}k −→ {0, 1}k est une permutation à sens-unique à trappe.


Son inverse est notée f −1 .

On considère 2 fonctions de hachage :


I G : {0, 1}k0 −→ {0, 1}k−k0
I H : {0, 1}k−k0 −→ {0, 1}k0
k = n + k0 + k1

Le schéma de chiffrement OAEP =(Setup, KeyGen, Encrypt, Decrypt)

95
RSA
OAEP
I Setup(k) {params, H, G}
I KeyGen(params) pk = f et sk = f −1
I Encrypt(params, f , m) c avec

96
RSA
OAEP
I Setup(k) {params, H, G}
I KeyGen(params) pk = f et sk = f −1
I Encrypt(params, f , m) c avec

r ∈R {0, 1}k0
s = (mk0k1 ) ⊕ G(r )
t = r ⊕ H(s)
c = f (s, t)

96
RSA
OAEP
I Setup(k) {params, H, G}
I KeyGen(params) pk = f et sk = f −1
I Encrypt(params, f , m) c avec

r ∈R {0, 1}k0
s = (mk0k1 ) ⊕ G(r )
t = r ⊕ H(s)
c = f (s, t)
I Decrypt(params, f −1 , c) m/Reject

96
RSA
OAEP
I Setup(k) {params, H, G}
I KeyGen(params) pk = f et sk = f −1
I Encrypt(params, f , m) c avec

r ∈R {0, 1}k0
s = (mk0k1 ) ⊕ G(r )
t = r ⊕ H(s)
c = f (s, t)
I Decrypt(params, f −1 , c) m/Reject

(s, t) = f −1 (c)
r = t ⊕ H(s)
M = s ⊕ G(r )
si [M]k1 = 0k1 retourner [M]n
sinon retourner Reject

96
RSA

m 0k1 r

s t

97
RSA
Sécurité de OAEP
Notion de sens unique partiel.
Soit f une permutation de {0, 1}k qui peut s’écrire, si k = n + k0 + k1

f : {0, 1}n+k1 × {0, 1}k0 −→ {0, 1}n+k1 × {0, 1}k0

I f est (τ, ε)-one-way si tout attaquant A fonctionnant en temps au


plus τ vérifie

Succow
f (A) := Pr (A(f (s, t)) = (s, t)) ≤ ε

I f est (τ, ε)-partial-domain-one-way si tout attaquant A fonctionnant


en temps au plus τ vérifie

Succpd-ow
f (A) := Pr (A(f (s, t)) = s) ≤ ε

98
RSA
I f est (`, τ, ε)-set-partial-domain-one-way si tout attaquant A
fonctionnant en temps au plus τ et renvoyant un ensemble de `
éléments, vérifie
 
Succs-pd-ow
f (A) := Pr s ∈ A(f (s, t)) ≤ ε

Théorème (Sécurité de OAEP)

Soit A un adversaire (ε, τ, qD , qG , qH )-IND-CCA2 d’un schéma de


chiffrement OAEP. Alors, dans le modèle de l’oracle aléatoire, il existe un
(qH , τ 0 )-adversaire B contre la partial one-wayness de f tel que :

ε 2(qD + 2)(qD + 2qG ) 3qD


Succs-pd-ow
f (B) ≥ − − k1
2 2k0 2
τ0

≤ τ + qG qH Tf + O(1)
ou Tf représente le temps d’évaluation de f .

99
Cramer-Shoup

Chiffrement de Cramer-Shoup

100
Cramer-Shoup
Un schéma de chiffrement IND-CCA2 dans le modèle standard :
Cramer-Shoup.

I CS.Setup(k) {k, G, q, H}

101
Cramer-Shoup
Un schéma de chiffrement IND-CCA2 dans le modèle standard :
Cramer-Shoup.

I CS.Setup(k) {k, G, q, H}
I G est un groupe cyclique d’ordre 2k−1 < q < 2k
I H : {0, 1}k −→ [[1, q − 1]] est une famille de fonctions de hachage
résistantes aux collisions

101
Cramer-Shoup
Un schéma de chiffrement IND-CCA2 dans le modèle standard :
Cramer-Shoup.

I CS.Setup(k) {k, G, q, H}
I G est un groupe cyclique d’ordre 2k−1 < q < 2k
I H : {0, 1}k −→ [[1, q − 1]] est une famille de fonctions de hachage
résistantes aux collisions
 
I CS.KeyGen(params) (x1 , x2 , y1 , y2 , z), (g1 , g2 , c, d, h, H)

101
Cramer-Shoup
Un schéma de chiffrement IND-CCA2 dans le modèle standard :
Cramer-Shoup.

I CS.Setup(k) {k, G, q, H}
I G est un groupe cyclique d’ordre 2k−1 < q < 2k
I H : {0, 1}k −→ [[1, q − 1]] est une famille de fonctions de hachage
résistantes aux collisions
 
I CS.KeyGen(params) (x1 , x2 , y1 , y2 , z), (g1 , g2 , c, d, h, H)
avec
I g1 et g2 sont deux générateurs distincts de G
I (x1 , x2 , y1 , y2 , z) ∈ [[1, q − 1]]5
I c = g1 x1 g2 x2 , d = g1 y1 g2 y2 et h = g1 z
I H∈H

101
Cramer-Shoup
I CS.Encrypt(params, (g1 , g2 , c, d, h, H), m) (u1 , u2 , e, v )

102
Cramer-Shoup
I CS.Encrypt(params, (g1 , g2 , c, d, h, H), m) (u1 , u2 , e, v )
I r ∈R [[1, q − 1]]
I u1 = g1 r , u2 = g2 r ,
I e = mhr
I α = H(u1 , u2 , e)
I v = cr d rα

102
Cramer-Shoup
I CS.Encrypt(params, (g1 , g2 , c, d, h, H), m) (u1 , u2 , e, v )
I r ∈R [[1, q − 1]]
I u1 = g1 r , u2 = g2 r ,
I e = mhr
I α = H(u1 , u2 , e)
I v = cr d rα
I CS.Decrypt(params, (x1 , x2 , y1 , y2 , z), (u1 , u2 , e, v )) m ou ⊥
I α = H(u1 , u2 , e)
I si
u1 x1 +y1 α u2 x2 +y2 α = v
renvoyer
e
m=
u1 z
I sinon renvoyer ⊥

102
Cramer-Shoup

Théorème
Le schéma Cramer-Shoup atteint le niveau de sécurité IND-CCA2 si le
problème décisionnel Diffie-Hellman est dur et si H est tirée au hasard
dans une famille de fonctions “universal one-way”.

I 1er schéma sûr dans le modèle standard


I relativement inefficace mais hypothèse raisonnable

A practical public key cryptosystem provably secure against adaptive chosen ciphertext attack.
Ronald Cramer and Victor Shoup. Proc. of Crypto’98, Springer LNCS 1462, pp. 13–25

103
Paillier

Chiffrement de Paillier

104
Paillier
Un schéma basé sur la résiduosité : Paillier.

I Paillier.Setup(k) {k}
 
I Paillier.KeyGen(params) (λ, p, q), (N, g )
avec
I N = pq avec p et q deux grands premiers
I g ∈ (Z/N 2 Z)∗ dont l’ordre est divisible par N
I λ = ppcm(p − 1, q − 1)
On définit la fonction

L : SN −→ SN
u−1
u 7−→ L(u) =
avec N

SN = {u < N 2 |u = 1 mod N}

105
Paillier
I Paillier.Encrypt(params, (N, g ), m) c = g m r N mod N 2
I r ∈R [[1, N − 1]]

106
Paillier
I Paillier.Encrypt(params, (N, g ), m) c = g m r N mod N 2
I r ∈R [[1, N − 1]]
L(c λ mod N 2 )
I Paillier.Decrypt(params, (λ, p, q), c) m=
L(g λ mod N 2 )

106
Paillier
I Paillier.Encrypt(params, (N, g ), m) c = g m r N mod N 2
I r ∈R [[1, N − 1]]
L(c λ mod N 2 )
I Paillier.Decrypt(params, (λ, p, q), c) m=
L(g λ mod N 2 )

Definition
Soit g ∈ (Z/N 2 Z)∗ d’ordre divisible par N. Pour tout ω ∈ (Z/N 2 Z)∗ , on
appelle classe de N résiduosité de ω par rapport à g , l’unique entier
x ∈ Z/NZ pour lequel il existe un y ∈ (Z/NZ)∗ tel que

gxyN mod N 2 = ω.

On note [[ω]]g cette classe.

106
Paillier
Remarque : [[ω]]g1 = [[ω]]g2 [[g2 ]]g1 mod N et donc [[g1 ]]g2 = [[g2 ]]−1
g1
mod N

Lemme
Pour tout ω ∈ (Z/N 2 Z)∗ , L(ω λ mod N 2 ) = λ[[ω]]1+N mod N.
Preuve : N + 1 ∈ (Z/N 2 Z)∗ a un ordre divisible par N
=⇒ ∃!(a, b) ∈ Z/NZ × (Z/NZ)∗ tel que ω = (1 + N)a b N mod N 2 .
(a = [[ω]]N+1 )
Alors ω λ = (1 + N)aλ b Nλ = (1 + N)aλ = 1 + aλN mod N 2

Et finalement :

L(c λ mod N 2 ) λ[[c]]1+N


= = [[c]]g = m
L(g λ mod N 2 ) λ[[g ]]1+N

107
Paillier
I Théorème
Sous l’hypothèse que le problème décisionnel de résiduosité composite est
dur, Paillier est IND-CPA.

D-Class[N] : étant donné ω ∈ (Z/N 2 Z)∗ , g ∈ B et x ∈ Z/NZ, décider si


x = [[ω]]g
λ
[
B= Bα avec Bα ⊂ (Z/N 2 Z)∗ est l’ensemble des éléments d’ordre nα.
α=1

Remarque :
Paillier est homomorphique additivement et multiplicativement.

Public-Key Cryptosystems Based on Composite Degree Residuosity Classes . Pascal Paillier. Proc.
of Eurocrypt’99, Springer LNCS 1592, pp. 223–238 (1999)

108

Vous aimerez peut-être aussi