Vous êtes sur la page 1sur 39

Manuel de cours :

CRYPTOGRAPHY
Prof. Yassine Maleh

Adopté du Livre Cryptography, de son


auteur. Prof Buchanan William
Support de Cours : Cryptographie

Introduction

L'internet que nous avons créé est souvent indigne de confiance et plein de
risques. Cela est dû en partie au manque de sécurité intégré dans les services
et les protocoles que nous utilisons. Au 21e siècle, par exemple, nous ne
pouvons toujours pas savoir si le courrier électronique que nous avons reçu
provient réellement de la personne qui le dit et si personne n'a lu notre
courrier en cours de route. En fait, nous ne pouvons même pas savoir si le
courrier électronique a été falsifié. La prochaine génération de l'internet et de
ses services doit être construite de manière fiable, et c'est la cryptographie
qui fournit les techniques de base permettant de garder les choses secrètes,
d'identifier les choses et de valider la fiabilité. Malheureusement, il n'existe
pas de technique unique permettant d'obtenir tous ces éléments, et nous
devons souvent entrelacer les méthodes afin de créer des systèmes fiables.
Ainsi, nous verrons que nous utilisons souvent le chiffrement à clé secrète
pour protéger le contenu d'un message, et le chiffrement à clé publique pour
prouver l'identité de l'expéditeur et du destinataire. Nous utilisons ensuite des
méthodes de hachage pour assurer la validité des messages, et des signatures
de messages pour prouver l'identité de l'expéditeur et le contenu des
messages. Malheureusement, nous sommes encore loin de construire un
monde où nous utiliserons les signatures numériques de la même manière
que nous signons notre nom, mais avec l'impact toujours croissant des
piratages de données et de la cybercriminalité, il ne peut y avoir qu'une seule
voie à suivre.

1
Support de Cours : Cryptographie

1
Ciphers et principes de base

1.1 Introduction
L'avenir de l'internet, notamment en ce qui concerne l'élargissement de la
gamme d'applications, implique une compréhension beaucoup plus
approfondie de la confidentialité, de la vérification de l'intégrité et de
l'authentification. Sans cela, l'internet ne peut pas se développer correctement
et être fiable dans sa fourniture de services. L'un des meilleurs moyens de
préserver la vie privée, de vérifier l'intégrité et de prouver l'identité est le
cryptage des données, connu sous le nom de science de la cryptographie.
Dans le cadre du cryptage, on définit souvent le concept de Bob et Alice,
qui sont impliqués dans les communications, et Eve, qui pourrait écouter ou
même modifier leurs communications, ou qui pourrait même se faire passer
pour eux. Bob et Alice communiquent donc sur un canal de communication
et auquel Eve est susceptible d'avoir accès. Dans un environnement sécurisé,
Bob et Alice doivent pouvoir communiquer librement, et s'identifier l'un à
l'autre, sans qu'Eve ne puisse jamais révéler aucun des messages impliqués,
ni se faire passer pour eux (figure 1.1). Le processus consiste généralement
à prendre un texte en clair, à le convertir en texte chiffré, qu'Eve ne doit pas
pouvoir interpréter, puis à le reconvertir en texte en clair. Normalement, la
conversion d'un texte en clair en texte chiffré est appelée cryptage, et l'inverse
est appelé décryptage.
Afin de garder le secret, les deux principales méthodes que Bob et Alice
peuvent utiliser sont les suivantes :
• Un algorithme unique. Il s'agit d'un algorithme que Bob et Alice
connaissent, mais qu'ils ne disent pas à Eve. L'algorithme de codage et
de décodage est donc tenu secret.
• Utiliser un algorithme bien connu. Dans cette méthode, Eve connaît
l'algorithme, mais où Bob et Alice utilisent une clé électronique spéciale
pour définir de manière unique la façon dont le message est converti en
texte chiffré, puis à nouveau.
2
Support de Cours : Cryptographie

3
Figure 1.1 Bob, Alice et Eve.

Un problème particulier, quel que soit le type de cryptage, est la transmission


des informations permettant de définir le secret, par exemple pour
l'algorithme à utiliser ou pour une clé électronique, car Eve peut écouter leurs
communications.
Ce chapitre examine certains des principes de base du cryptage. Les chapitres
suivants étudient l'utilisation des méthodes à clé secrète (cryptage
symétrique) et à clé publique (asymétrique). Dans le cas du cryptage à clé
secrète, nous utilisons une clé électronique unique pour crypter le texte en
clair, et la même clé est ensuite utilisée pour décrypter (ce qui implique
normalement une inversion du processus de cryptage). Pour les méthodes à
clé publique, nous générons deux clés électroniques, dont l'une est utilisée
pour chiffrer le texte en clair et l'autre pour le déchiffrer. Le concept de
cryptage à clé secrète peut être comparé à Bob et Alice utilisant une boîte
verrouillable dont eux seuls ont la clé. Malheureusement, ni Bob ni Alice ne
savent si Eve a pris une copie de leur clé. Avec le cryptage à clé publique,
Bob peut créer un certain nombre de cadenas identiques, dont lui seul a la clé
pour les ouvrir. Ensuite, si Alice veut lui envoyer quelque chose, elle utilisera
l'un de ses cadenas et verrouillera la boîte. Eve ne pourra donc pas ouvrir la
boîte, car elle n'aura pas la clé nécessaire. Bob doit évidemment garder la clé
du cadenas en sécurité, afin qu'Eve ne puisse pas y avoir accès. Le cadenas
peut sera alors définie comme sa clé publique, et l'autre clé comme sa clé
privée.
4
Comme nous le verrons, les méthodes à clé publique et à clé secrète
fonctionnent souvent en parfaite harmonie, les méthodes à clé secrète assurant
le cryptage de base et les méthodes à clé publique permettant d'authentifier
les identités et de transmettre les clés de cryptage.

1.2 Méthodes de chiffrement simples


Une méthode de conversion d'un message en texte chiffré consiste pour Bob
et Alice à se mettre d'accord sur un algorithme que Bob utilisera pour
brouiller son message, puis pour Alice de faire l'inverse afin de débrouiller
le message brouillé. Ainsi, tant qu'Eve ne connaît pas la méthode de
brouillage, le texte chiffré sera sécurisé. Par exemple, si Bob et Alice sont
assis dans une pièce où Eve est présente, et que Bob tape sur la table avec
une série de coups courts (di) ou longs (dit), Bob peut alors transmettre un
message secret à Alice, à condition qu'ils se soient mis d'accord sur ce que
les codes identifient. Il peut ainsi taper di-di-di-dit, puis faire une pause et
taper di-dit, et là, il transmet le message dans un alphabet standard du code
Morse. De cette façon, Alice décode le message comme "hi". Eve peut
éventuellement voir que Bob transmet un message à Alice, mais elle a besoin
de connaître le type de codage qu'ils utilisent. De cette façon, Bob et Alice se
mettent d'accord sur leur méthode avant de coder leurs messages, mais Eve
peut les avoir entendus discuter de la méthode qui sera utilisée. Eve pourrait
également analyser leurs transmissions et déterminer les codes en examinant
les modèles communs.
Avec les méthodes de chiffrement, nous pouvons utiliser un code mono-
alphabétique, où nous créons une seule correspondance entre notre alphabet et un
alphabet de chiffrement. Ce type de codage alphabétique reste constant, alors
qu'un polyalphabet peut modifier sa correspondance en fonction d'un mot clé
variable.

1.2.1 Morse Code


À une époque où il n'était possible d'envoyer que des impulsions sonores par le
biais d'un canal de communication, Samuel F. B. Morse a créé une
cartographie du code qui envoyait des impulsions de courant électrique le long
de fils avec un silence entre les deux. Le code Morse est donc une méthode
de codage, plutôt qu'un chiffrement, et fonctionne en traduisant les caractères
en séquences de points (.) et de tirets (-). Lorsqu'il est transmis sous forme de
motif sonore, le tiret dure environ trois fois plus longtemps qu'un point, et le
délai entre les mots est aussi long que celui entre les lettres. Le code a été conçu
de telle sorte que la longueur de chacun des caractères varie
approximativement en fonction de l'occurrence de la lettre en anglais courant
(figure 1.2). Par exemple, il existe un code court pour le "e" (point)
5
et un code plus long pour le "e" (point).
une pour une lettre moins courante, telle que 'j' (point dash dash dash dash).
Pendant de nombreuses années, le code Morse a été utilisé par les opérateurs
radio, et a fourni la séquence standard d'un navire en détresse : Dot Dot Dot
. . . Dash Dash Dash . . Dot Dot Dot (ou SOS).

Figure 1.2 Le code morse.

En tant qu'extension, le chiffrement Morse fractionné utilise une clé de 26


caractères et convertit un texte en clair en code Morse. Il le convertit ensuite
en morceaux de longueur fixe de code Morse, qui sont ensuite convertis en
lettres de texte chiffré. Pour convertir le texte en clair en code morse, il utilise
des "x" entre les caractères et des "xx" entre les mots. Par exemple, "Hello
World" est en code Morse :

Nous pouvons ensuite en faire une chaîne de caractères avec un "x" entre les
caractères :

6
Nous pouvons maintenant utiliser des correspondances à trois caractères pour
les reconvertir en texte :

et où se trouve la cartographie :

Nous pouvons alors utiliser cette correspondance (par exemple, A est défini
comme ' ', B comme '..-' et C comme '..x'. Ensuite, nous pouvons les
reconvertir avec :

AGTCDHOTQODTCJ

Pour "Peter Piper a choisi", on obtient :

1.2.2 Pigpen
Dans le cadre du chiffrement, il est utile que Bob et Alice puissent créer un
mappage de chiffrement facile à mémoriser. L'une des meilleures méthodes
consiste à utiliser une méthode graphique, car l'œil humain trouve souvent
plus facile de représenter des caractères graphiques que des caractères
alphabétiques. Le chiffrement Pigpen en est un bon exemple et utilise une
méthode de substitution mono-alphabétique.
Pour le chiffrement Pigpen, nous avons d'abord créé quatre grilles en
forme de carré et de diagonale, avec un point placé dans la deuxième version
de la grille (figure 1.3). Ensuite, les caractères de l'alphabet sont disposés en
séquence dans les grilles. Figure
1.4 décrit le mappage de la chaîne en clair de "biométrique".
Le problème avec Pigpen est qu'une fois le mappage connu, il est difficile
de garder le message secret. Bob pourrait cependant l'intégrer dans un
graphique d'apparence valide et l'envoyer à Alice. Eve, alors, pourrait ne pas
être en mesure de voir les symboles Pigpen intégrés, mais où Alice sait où
regarder.

7
Figure 1.3 Cartographie des codes.

Figure 1.4 Cartographie des codes.

1.2.3 Codage César et alphabet brouillé


Le problème des méthodes de codage est qu'elles peuvent souvent être
déchiffrées par une simple consultation entre la valeur du texte en clair et le
code de chiffrement équivalent. Pour rendre les choses plus difficiles, nous
devons créer un code chiffré qui possède un secret partagé, que seuls Bob et
Alice connaissent. Le texte chiffré change alors par rapport à ce secret. Un
exemple de ceci est le chiffrement César, qui a été créé par Jules César (en
utilisant un décalage de 3 lettres). Bob et Alice conviennent alors simplement
du nombre de décalages dont l'alphabet doit être déplacé.
Dans l'exemple de la figure 1.6, les lettres du chiffrement ont été avancées
de deux positions, le "c" devenant un "A". Ainsi, "le" sera codé comme
"RFC". Ce type de codage pose toutefois plusieurs problèmes. Le principal
est qu'il n'est pas sûr car il n'y a que 25 codages uniques, et il sera donc assez
facile pour quelqu'un de trouver la correspondance.
Une amélioration consiste à brouiller le mappage en utilisant un mappage
de code (figure 1.7), et où un mappage aléatoire est utilisé pour déterminer
les mappages de chiffrement. Pour le premier caractère à mapper ('a'), nous
aurions 26 mappages possibles. Si nous passons ensuite au mappage du
caractère suivant ('b'), il nous reste 25 mappages possibles. Nous pouvons
alors continuer et nous obtiendrons :
26 ! mappings, ce qui donne environ 4,03×1026 mappings

8
Comme nous avons maintenant beaucoup plus de correspondances possibles,
le code devient plus sûr, car il est probable qu'Eve doive chercher dans de
nombreuses correspondances jusqu'à ce qu'elle trouve la bonne. Ce type
d'approche est connu sous le nom de méthode de force brute, Eve essayant
toutes les correspondances de code possibles jusqu'à ce qu'elle trouve une
solution. Dans le pire des cas, elle cherchera toutes les correspondances
possibles, mais elle peut aussi trouver la solution du premier coup. En
moyenne, cependant, elle cherchera à travers la moitié des mappings
possibles pour trouver la bonne solution.
Pour calculer le temps qu'il lui faudra, nous pouvons supposer qu'en
moyenne, il cherchera dans la moitié des mappings de code. Donc, si elle
prend une seconde pour vérifier chaque correspondance, le temps pris, en
moyenne, sera le suivant :

TTaverage= (4.03×1026)/2 secondes

qui est d'environ 6,4 ×1018 ans (plus de 6 400 000 000 000 000 000 d'années).
Le code alphabétique brouillé semble donc sûr du point de vue de la force
brute. Malheureusement, il peut être craqué assez rapidement en utilisant
l'analyse de fréquence. Pour le code de la figure 1.7, nous pouvons voir que
le "A" apparaît le plus souvent dans le chiffrement, et comme le "e" est la
lettre anglaise la plus populaire, il est probable qu'il corresponde à un "e" en
clair. Ensuite, nous pouvons voir que "Q" apparaît quatre fois, et qu'il est
donc plus probable qu'il corresponde à un "t", qui est la lettre suivante la plus
probable dans l'alphabet anglais.
Une analyse plus formelle des probabilités est présentée dans le tableau
1.2, où l'on constate que la lettre "e" est la plus probable, suivie du "t", puis
du "o", et ainsi de suite. Outre l'analyse des occurrences d'une seule lettre, il
est également possible d'examiner les occurrences de deux lettres
(digrammes), voire de trois lettres (trigrammes). Nous pouvons également
analyser les occurrences des mots (séparés par des espaces), et où "le" est le
mot le plus courant.
Un schéma de chiffrement à alphabet brouillé est facile à mettre en
œuvre, mais, malheureusement, une fois qu'il a été "craqué", il est facile de
déchiffrer les données chiffrées. Normalement, pour améliorer le processus
de chiffrement, le chiffrement comporte des paramètres supplémentaires qui
modifient la correspondance. Il peut s'agir de modifier la correspondance
dans le temps, par exemple pour l'heure du jour ou la date. De cette façon, Bob
et Alice connaissent les correspondances du code pour une heure et/ou une
date donnée, par exemple en ayant une correspondance différente pour
chaque jour de la semaine. La machine Enigma a été utilisée pendant la
9
guerre, où les opérateurs reconfiguraient les machines chaque jour à l'aide
d'un livre de codes (ou feuille de clés).

Chaque feuille de code contenait les réglages quotidiens de la machine


Enigma sur une période d'un mois, et l'endroit où la machine était
reconfigurée chaque jour.

Figure 1.6 Le code de César.

Tableau 1.2 Probabilité d'occurrences


Lettres (%) Digrammes (%) Trigrammes (%) Mots (%)
E 13.05 TH 3.16 LE 4.72 LE 6.42
T 9.02 DAN 1.54 ING 1.42 DE 4.02
S
O 8.21 ER 1.33 ET 1.13 ET 3.15
A 7.81 RE 1.30 ION 1.00 À 2.36
N 7.28 AN 1.08 ENT 0.98 A 2.09
I 6.77 HE 1.08 POUR 0.76 DANS 1.77
R 6.64 AR 1.02 TIO 0.75 QUE 1.25
S 6.46 FR 1.02 ERE 0.69 IS 1.03
H 5.85 TI 1.02 SON 0.68 I 0.94
D 4.11 TE 0.98 ATE 0.66 IT 0.93
L 3.60 AT 0.88 VER 0.63 POUR 0.77
C 2.93 ON 0.84 TER 0.62 AS 0.76
F 2.88 HA 0.84 THA 0.62 AVEC 0.76
U 2.77 OU 0.72 ATI 0.59 WAS 0.72
M 2.62 IT 0.71 CHAP 0.55 HIS 0.71
EAU
P 2.15 ES 0.69 ERS 0.54 HE 0.71
Y 1.51 ST 0.68 HIS 0.52 BE 0.63
W 1.49 OU 0.68 RES 0.50 PAS 0.61
G 1.39 NT 0.67 PEB 0.47 PAR 0.57
B 1.28 HI 0.66 SONT 0.46 MAIS 0.56

10
V 1.00 EA 0.64 CON 0.45 HAVE 0.55
K 0.42 VE 0.64 RCE 0.43 VOUS 0.55
X 0.30 CO 0.59 TOUT 0.44 POURQ 0.53
ES UOI
J 0.23 DE 0.55 EVE 0.44 SONT 0.50
Q 0.14 RA 0.55 ITH 0.44 ON 0.47
Z 0.09 RO 0.55 TED 0.44 OU 0.45

1.2.4 Vigenère Cipher


Un code amélioré par rapport à l'approche de l'alphabet brouillé a été
développé par Vigenère, où un mappage différent, basé sur un mot clé, est
utilisé pour chaque caractère du chiffrement. C'est ce qu'on appelle un code
polyalphabétique, car il utilise un certain nombre d'alphabets de chiffrement.
Bob et Alice conviennent de la manière dont le chiffrement change. L'une
des méthodes les plus populaires consiste à utiliser un mot de code sur lequel
ils se mettent d'accord, puis à modifier la correspondance en fonction des
caractères du mot clé.
Par exemple, si nous utilisons le mappage du tableau 1.3, et si le mot de
code est "VERT", les lignes utilisées sont les suivantes : Ligne 6 (G), Ligne
17 (R), Ligne 4 (E), Ligne 4 (E), Ligne 13 (N), Ligne 6 (G) et Ligne 17 (R).
Le message de "hellohowareyou" est donc converti comme suit :

Mot clé GREENGREENGREE


Plaintext hellohowareyou
Texte chiffré NVPPBNFAEEKPSY

Le grand avantage de ce type de chiffrement est que le même caractère en


clair est susceptible d'être codé selon différentes correspondances, en
fonction de la position du mot clé. Par exemple, pour un mot clé VERT, "e"
peut être codé comme "K" (pour G), "V" (pour R), "I" (pour E) et "R" (pour
N). Cette méthode a été découverte par le major Friedrich Wilhelm Kasiski,
un officier d'infanterie allemand. Il a été le premier à proposer une méthode
pour attaquer les chiffres de substitution polyalphabétique et, en 1863, il a
publié un livre de 95 pages sur la cryptographie :

Die Geheimschriften und die Dechiffrir-Kunst


"L'écriture secrète et l'art du déchiffrage".

Il s'est principalement concentré sur le chiffrement de Vigene`re et a


développé une méthode connue sous le nom d'examen Kasiski. Dans cette
méthode, il a analysé les intervalles entre les fragments répétés du texte
chiffré, afin d'obtenir un indice sur la longueur de la clé. Dans cette méthode,
nous prenons le message chiffré et nous analysons les motifs répétés, et qui

11
donne un indice sur la taille de la clé. Par exemple, si nous avons un message
de "theywillnotkeeptheburningdeck" et ensuite avec une clé de "abc", nous
obtenons :

theywillnotkeeptheburningdeck
abcabcabcabcabcabcabcabcabcab
TIGYXKLMPOUMEFRTIGBVTNJPGEGCL

On peut voir que le mot "le" s'est aligné sur la clé :


the ywillnotkeep the burningdeck
abc abcabcabcabc abc abcabcabcab
TIG YXKLMPOUMEFR TIG BVTNJPGEGCL

On peut donc penser que la taille de la clé pourrait être de trois. Normalement,
cependant, nous avons besoin d'une quantité considérable de texte chiffré
pour deviner avec précision la taille de la clé. Nous pouvons alors utiliser une
méthode d'analyse de fréquence pour obtenir une liste restreinte des valeurs
de clé possibles.
Pour améliorer la sécurité, plus la taille du mot de code est grande, plus le
nombre de lignes pouvant être incluses dans le processus de chiffrement est
important. On est également à l'abri de l'analyse des occurrences courantes
de deux ou trois lettres, si la taille de la clé est relativement longue. Par
exemple, "ee" peut être chiffré avec "KV" (pour GR), "VI" (pour RE), "II"
(pour EE), "IR" (pour EN) et "RK" (pour NG).

1.2.5 One-Time Pad (OTP)


Le problème avec les codes définis précédemment est qu'une fois que Eve
connaît la méthode, elle peut normalement craquer tous les codes créés. De
plus, si Bob et Alice utilisent un mot clé, Eve peut essayer de nombreux mots
clés différents pour voir si l'un d'eux fonctionne. De cette façon, la plupart
des codes peuvent être cassés, et ce n'est qu'une question de temps avant qu'ils
ne le soient. Si la pertinence temporelle du message est supérieure au temps
moyen de craquage, la provenance du message peut être préservée. Par
exemple, si une armée envoie un message "ATTAQUE" à ses troupes, le
message doit rester secret jusqu'au moment de l'attaque. Une fois qu'ils ont
attaqué, il n'y a plus d'importance si leur cryptogramme a été craqué.

12
Si l'on veut un code inviolable, il faut utiliser un tampon à usage unique,
c'est-à-dire un code de chiffrement qui n'est utilisé qu'une seule fois. Le
mappage à un temps est
Tableau 1.3 Codage

est ensuite partagé entre Bob et Alice, et est utilisé une fois pour envoyer un
message, et où un autre pad est créé pour un autre message (figure 1.8).
Par exemple, on peut d'abord créer un livre de codes, que seuls Bob et
Alice connaissent :

yehq medlg yaqif xygfs vlznx


llyyk ikbsy tvoon nvtuq qzvvn
ucyio nftsj bffbx ozxkl ckrsf
asfxg mqdlp gltek obvfm hqrxc
rbljl jlgcn vzwlw kctlq cftzx
bpmgy kaiup lftaf ufqrp ofjib
fwfgz lilmk uzaed urbwl eitgw
xpbji wfees oubvd dthpk vfmnv
wdnww xczkb wgcdo pvvlp zpfti
ladva scool sshhv lvrtg wrebv

13
Dans ce cas, il y a 25 caractères sur chaque ligne du tampon à usage unique,
et nous allons donc de [0] à [24] sur la première ligne, puis de [25] à [49] sur
la deuxième ligne, et ainsi de suite. Ensuite, si Bob veut envoyer un message,
il choisira une clé en fonction de la position des lettres :
[5][92 ][ 4][2 32 ][ 20 3][7 0][2 25][ 19 5]

Si nous recherchons les positions pour cela, la clé


devient :
mvvowclv
Ensuite, nous prenons notre mot secret, tel que "newhampshire", et déplaçons
chaque lettre en fonction de la position de notre clé. Dans ce cas, nous
déplaçons un "n" vers la ligne "m" et obtenons un "z" (ce qui correspond à
un décalage de 12 caractères ... n[opqrstuvwxy]z :).
a b c d e f g h i j k l m n o p q r s t u v w x y z
. . .
10 k l m n o p q r s t u v w x y z a b c d e f g h i j
11 l m n o p q r s t u v w x y z a b c d e f g h i j k
12 m n o p q r s t u v w x y z a b c d e f g h i j k l

Le chiffrement devient alors : "zzrvwoantdms", que Bob enverra à Alice, et


Alice fera l'opération inverse de celle de Bob, sur la base de la clé secrète
partagée. Malheureusement, le chiffrement OTP souffre du fait qu'il faut
régénérer le tampon à chaque fois, ou, au moins, régénérer une nouvelle clé.

Figure 1.8 Blocage à usage unique.

14
1.3 Encodage Méthodes
Sur un système informatique, le code et les données sont représentés sous
forme binaire, mais l'homme a du mal à traiter les formats binaires, c'est
pourquoi d'autres formats sont utilisés pour représenter les valeurs binaires.
Deux formats typiques utilisés pour représenter les caractères sont l'ASCII et
l'UTF-16. Avec l'ASCII, nous avons des valeurs de 8 bits et il peut donc
supporter jusqu'à 256 caractères différents (28 ). L'UTF-16 étend les
caractères à des valeurs de 16 bits, ce qui donne un total de 65 536 caractères
(216 ). Dans le codage ASCII, les caractères imprimables, tels que "a" et "b",
sont associés à des valeurs décimales, binaires et hexadécimales :

Il existe également d'autres caractères "non imprimants" qui ont


généralement une certaine fonction de contrôle. Il s'agit des caractères CR
(Carriage Return), LF (Line Feed) et HT (Horizontal Tab) :

ASCII Binaire Décimal Représentation


des caractères
CR 0110 0101 0x0D 13 \ r
LF 0100 0101 0x0A 10 \ n
HT 0000 0111 0 x07 7 \ t

Normalement, lorsque nous chiffrons un texte chiffré, cela produit un


flux binaire qui contient des caractères non imprimables, et nous devons donc
représenter le chiffrement d'une manière imprimable. Nous pouvons
également être amenés à représenter nos clés de chiffrement dans un format
imprimable et/ou distribuable. Pour cela, nous utilisons souvent un format
hexadécimal ou Base-64, qui nous permet de représenter le code dans un
format imprimable (Figure 1.9).

15
Figure 1.9 Conversion du binaire en hexadécimal ou en base 64.

Le format le plus courant pour représenter les caractères anglais standard est
l'ASCII. Dans sa forme standard, il utilise un code binaire de 7 bits pour
représenter les caractères (lettres, avec une plage de 0 à 127), mais sa portée
est plutôt limitée car il ne prend pas en charge les symboles tels que les lettres
grecques. Pour augmenter le nombre de symboles pouvant être représentés,
on utilise l'ASCII étendu, dont le code est de 16 bits. L'annexe A présente le
jeu de caractères ASCII standard (en binaire, décimal, hexadécimal et
également sous forme de caractère).
Certains caractères ASCII non imprimables importants sont : Nouvelle
ligne (0x13) ; Carriage Return (0x10) ; Tab (0x07) ; et Backspace (0x08),
tandis que l'espace est représenté par 0x20. Les représentations de 'A' et 'B'
sont les suivantes :
Char Décimal UTC-16 ASCII Hexa Oct HTML

A 65 00000000 01000001 01000001 41 101 A


B 66 00000000 01000010 01000010 42 102 B

1.3.1 Hexadécimal et Base- 64


La conversation vers un format hexadécimal implique de diviser le flux
binaire en groupes de quatre bits (figure 1.10) et, pour la base 64, en groupes
de six bits (figure 1.11). Avec un format hexadécimal, nous avons des valeurs
de 0 à 15, et

16
qui sont représentés par des valeurs de quatre bits allant de 0000 à 1111. Pour
la base 64, nous prenons six bits à la fois. Par exemple, si nous prenons
l'exemple de "fred", nous obtenons :

ASCII f r e d
Binaire 01100110 01110010 01100101 01100100

Pour convertir en Base-64, nous regroupons en 6-bits :

Binaire 011001 100111 001001 100101 011001 00

Et ensuite les mettre en correspondance avec une table Base-64 :

Binaire 011001 100111 001001 100101 011001 00


Décimal 25 39 9 37 25 0
Base-64 Z n J l Z A

Le résultat est ZnJlZA

Avec la base 64, nous créons des groupes de quatre caractères de base 64, et
nous remplissons les valeurs de six bits avec des zéros, puis nous utilisons le
caractère "=" pour remplir les groupes de quatre caractères de base 64 :

test -> 01110100 01100101 01110011 01110100


test -> 011101 000110 010101 110011 011101 00[0000] = =
test - > d G V z d A = =

aide -> 01101000 01100101 01101100 01110000


aide -> 011101 000110 010101 110011 011101 00[0000] = =
aide -> a G V s c A = =

Malheureusement, certains caractères se ressemblent lorsqu'ils sont imprimés,


par exemple si nous avons un zéro ('0') ou un 'O'. Pour éviter cela, nous
pouvons convertir le format en base 64, mais il y a des lettres qui se
ressemblent : 0 (zéro), O (o majuscule), I (i majuscule) et l (L minuscule), et
des caractères non alphanumériques de + (plus) et / (barre oblique). La
solution est le Base-58, utilisé dans les applications Bitcoin, et où l'on
supprime les caractères qui se ressemblent.

17
Figure 1.10 Conversion en hexagone.

Figure 1.11 Conversion en base-64.

Pour la base 58, nous convertissons les caractères ASCII en binaire, puis nous
continuons à diviser par 58 et convertissons le reste en un caractère de la base
58. L'alphabet devient :

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz".

18
Si nous prenons l'exemple de 'e', où e a une valeur décimale de 101, nous
divisons par 58 pour obtenir :

1 reste 43

et ensuite on divise 1 par 58 et on obtient.. :

0 reste 1

Nous prenons ensuite le caractère à la position 1 et à la position 43, pour


donner :

123456789 ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

et ensuite obtenir :

2k

Si nous prenons maintenant 'ef', nous obtenons×958 (102 + 101 256), où nous
déplaçons chaque caractère d'un octet. En fait, nous prenons la valeur binaire
de la chaîne, puis nous la divisons par 58 et nous prenons le reste. Donc 'ef'
est '01100101 01100110'.

1.4 Introduction à la théorie des probabilités et des


nombres
Le cryptage nécessite une connaissance de certains principes mathématiques
de base, notamment pour l'utilisation des nombres entiers et de certaines
opérations de base.

1.4.1 Combinaisons et Permutations


Nous avons souvent des calculs qui impliquent un certain nombre de
combinaisons ou de permutations. Dans le cas des combinaisons, l'ordre des
sélections n'a pas d'importance. Par exemple, si nous avons quatre pays :
Royaume-Uni, France, Allemagne et Irlande, il existe quatre combinaisons
de trois pays :

[{UK, France, Allemagne}, {UK, France, Irlande}, {France, Allemagne,


Irlande} et {UK, Allemagne, Irlande}].

19
La formule pour cela est la suivante :
n!
=
nCk
k !(n - k) !
Où ! est l'opérateur factoriel, n est le total à choisir, et k est le nombre
d'options à choisir. Par exemple, 5 ! correspond à 5 ×3×2×1. Donc, pour notre
exemple, nous obtenons :
4! 4×3×2×1
4 C3 = = = 4
3!(4 − 3)! 3×2×1

Avec les permutations, nous examinons toutes les options, y compris leur
ordre. Par exemple, le nombre de permutations pour trois pays avec notre
exemple est :
{UK, France, Allemagne}, {UK, France, Irlande}, {UK, Allemagne, France},
{UK, Allemagne, Irlande}, {UK, Irlande, France}, {UK, Irlande, Allemagne},
... {France, Allemagne, Irlande}]
La formule pour cela est la suivante :
n!
P = ( n − k )!
n k

Donc, pour notre exemple,


nous obtenons :
4! 4×3×2×1
4 P3 = = = 24
(4 − 3)! 1

20
1.4.2 Probabilité Théorie
Avec la théorie des probabilités, nous déterminons la probabilité qu'un
événement se produise, généralement en comprenant les chances
d'interaction de chacun des éléments impliqués dans un événement, et la
probabilité qu'ils se produisent. Dans le cas d'un dé, chacun des chiffres du
dé a la même probabilité, ainsi la probabilité que nous obtenions une valeur
spécifique de n est :
1
P(n) = 0,167
6 ≈
Si nous avons deux événements (A et B) qui sont indépendants, la
probabilité que les deux se produisent est :
P(A et B) = P(A). P(B)
Si les événements sont mutuellement exclusifs, par exemple, si nous lançons
une pièce de monnaie, et si elle est face, elle ne peut pas être aussi pile. Donc,
pour les événements exclusifs par mutualité :

P(A et B) = 0

Si nous voulons déterminer la probabilité qu'un des deux événements (A ou


B) se produise :
P(A ou B) = P(A) + P(B)
Par exemple, la probabilité de lancer un deux ou un trois sur un dé, la
probabilité sera :
P(2 ou 3) = 1/6 + 1/6 = 1/3
Si nous lançons deux les chances que deux 1 soient lancés sont de 1/6
multiplié par 1/6, ce qui donne 1/36.
Si les événements sont dépendants, nous devons comprendre cette
dépendance. Par exemple, quelle est la probabilité de tirer deux As dans un
paquet de 52 cartes ? Le premier tirage a une probabilité de 4/52 (1/13), mais
si nous avons choisi un As en premier, il ne restera que 3 As sur 51 cartes, et
les chances de tirer un autre As seront donc de 3/51. Au total, la probabilitéde
tirer deux As sera donc de :
1 3 3
P ( A and A ) = = = 0.0045
13 51 663

21
En général, pour deux événements dépendants (A et B), on a :

P(A et B) = P(A) - P(B|A)

Où P(B|A) est la probabilité que B se produise si A se produit.

1.4.3 Nombre Représentations


Bon nombre des concepts importants en cryptographie sont basés sur la
théorie des nombres autour de l'étude des nombres entiers, avec un accent
particulier sur la divisibilité. Les principales classifications des nombres sont
: les nombres entiers, les nombres rationnels, les nombres réels et les nombres
complexes. En mathématiques, nous les définissons comme suit :
• Les nombres entiers peuvent être positifs ou négatifs et n'ont pas de
partie fractionnaire. Ils sont représentés par le symbole Z {. . . -2, -1, 0,
+1, +2,. . .}.
• Les nombres rationnels sont des fractions (Q).
• Les nombres réels (R) comprennent les nombres entiers et les nombres
rationnels, ainsi que tout autre nombre pouvant être utilisé dans une
comparaison.
• Les nombres premiers (P) représentent les nombres entiers qui ne
peuvent être divisés que par eux-mêmes et par l'unité.
• Les nombres naturels (N) représentent les nombres positifs qui sont des
nombres entiers.
{1,2. . . }.

1.4.4 Logarithmes
Il existe certaines méthodes de cryptographie qui se basent sur les
logarithmes. Ils ont été découverts par John Napier, qui a été le premier à
proposer que nous puissions multiplier deux nombres ensemble (a, b), en
trouvant le logarithme de a et en l'ajoutant au logarithme de b. Nous pouvons
ensuite prendre le logarithme inverse pour déterminer le résultat. Cela a
changé la face des calculs, puisque nous pouvions multiplier de grands
nombres ensemble, simplement en consultant une table pour la valeur du
logarithme, et en additionnant les résultats, puis appliquer l'inverse à travers
une table de consultation. Pour multiplier, on obtient :
a × b = Inverse Log (Log (a)+ Log (b))
La base du logarithme est importante pour le calcul. Pour notre système
décimal, nous utilisons une base de 10 (log10 (x) et 10x ), mais pour de
nombreuses opérations mathématiques, nous utilisons une base
logarithmique naturelle (Loge (x) ou ex , où e a une valeur d'environ 2,718).
22
La base de e est utilisée dans de nombreux changements naturels, comme
dans les circuits électriques. Les règles sont donc les suivantes :
g = a.b
log(g) = log(a)+log(b)
g = Inverse Log (log(a)+log(b))
g = a/b
log(g) = log(a)-log(b)
g = Inverse Log (log(a)-log(b))
g = ax
log(g) = x.log(a)
g = Inverse Log (x.log(a))
Par exemple :

g= 103
log10 (g) = 3.log10
(10) g= 10(3×1) =
1,000

1.7 Nombres premiers


Un nombre premier est une valeur qui n'a pour facteurs que 1 et lui-même. Il
est utilisé dans des domaines tels que l'échange de clés et le cryptage à clé
publique. Ils sont utilisés dans des domaines tels que l'échange de clés et le
cryptage à clé publique. Leur principale protection est qu'il est très difficile
pour un ordinateur de factoriser le résultat de la multiplication de deux
nombres premiers. Le test le plus simple pour déterminer si un nombre est
premier consiste à diviser la valeur de tous les entiers de 2 à la valeur divisée
par 2. Si l'un des résultats ne laisse aucun reste, la valeur n'est pas première,
sinon elle est composite.
On peut évidemment améliorer cela en se débarrassant des nombres pairs qui
sont supérieurs à 2, et aussi que la valeur la plus élevée à tester soit la racine
carrée de la valeur.
Donc si n = 37, notre valeur maximale sera √n vers le bas est 6. Donc on
peut essayer : 2, 3 et 5, dont aucun ne se divise exactement en 37, il s'agit
donc d'un nombre premier. Essayons maintenant 55, où nous allons alors
essayer 2, 3, 5 et 7. Dans ce cas, 5 se divise exactement en 55, la valeur n'est
23
donc pas première.

Une autre amélioration que nous pouvons apporter est que les nombres
premiers (à l'exception de 2 et 3) entrent dans l'équation de :
6k ± 1

où k=0 donne 0 et 1, k=1 donne 5 et 7, k=2 donne 11 et 13, k=3 donne


17 et 19, et ainsi de suite. Ainsi, nous pouvons tester si nous pouvons diviser
par 2 puis par 3, puis vérifier tous les nombres de 6k ± 1 jusqu'à √n

1.8 Opérateurs de chiffrement (mod, EX-OR et shift)


Il est important que les opérateurs utilisés pour le cryptage ne perdent aucune
information au cours du processus de cryptage et que les opérations soient
réversibles d'une manière ou d'une autre. En outre, le processus de cryptage
est souvent assez complexe.
Les opérateurs doivent donc être assez simples dans leur approche afin d'être
rapides pour Bob et Alice, mais impliquer un traitement important pour Eve.
Les principaux opérateurs qui correspondent le mieux à ce profil sont : la
rotation de bits (<< ou >> ) ; le OU ex⊕clusif (X-OR - ) ; et les opérations
mod. Ces opérations peuvent généralement être réalisées en une seule fois,
et peuvent donc être utilisées pour un cryptage et un décryptage rapides. En
outre, les fonctions rotation et X-OR sont assez faciles à inverser.

1.8.1 Mod Opérateur


L'opérateur mod fournit le reste d'une division d'un nombre entier. Par
exemple pour 31 divisé par 8 donne le résultat de 3 reste 7. Ainsi, 31 (mod
8) est égal à 7. Souvent, en cryptographie, l'opération mod utilise un nombre
premier, tel que :
Résultat = valeurx mod (nombre premier)
Par exemple, si nous avons un nombre premier de 269, et une valeur de 8
avec un x
valeur de 5, le résultat de cette opération sera :

Résultat = 85 (mod 269) = 32, 768 (mod 269) = 219

Avec les nombres premiers, si nous connaissons le résultat, il est difficile de


trouver la valeur de x qui a été utilisée, même si nous avons les autres valeurs,
car il peut y avoir de nombreuses valeurs de x qui peuvent produire le même

24
résultat. C'est cette caractéristique qui rend difficile la détermination d'une
valeur secrète (dans ce cas, le secret est x). En Python, Java et C#, l'opérateur
mod est "%".

1.8.2 Opérateurs de l'équipe


Les opérateurs de décalage de bits peuvent être des opérateurs de décalage
vers la gauche ou vers la droite (ou plus précisément des opérateurs de rotation
vers la gauche ou vers la droite), où le processus de décalage prend normalement
les bits qui sortent d'une extrémité, et les met dans l'autre extrémité. Ce
processus est normalement défini comme une rotation - où nous pouvons
avoir une rotation à gauche ou une rotation à droite. Un processus de cryptage
peut donc fonctionner en prenant un octet à la fois et en le faisant pivoter vers
la gauche de quatre positions binaires :

Entrée 1010 1000 1111 0000 0101 1100 0000 0001


Sortie 1000 1010 0000 1111 1100 0101 0001 0000
Ainsi, le processus de décryptage consiste simplement à faire tourner chacun
des bits des octets de quatre places vers la droite.

1.8.3 Entiers et grands Entiers


Dans les systèmes informatiques, les entiers sont représentés par un certain
nombre de bits. Normalement, en cryptographie, nous utilisons des entiers
non signés afin d'appliquer des opérations simples sur les valeurs. Une
représentation typique des nombres entiers est la suivante :

Type de données C# Représentation de la gamme


byte byte uses 8 bits and ranges from 0 to
255
ushort unsigned short uses 16 bits and ranges from 0
to 65,535
uint unsigned int uses 32 bits and ranges from 0
to 42,949,67,295
ulong unsigned long uses 64 bits and ranges from 0
to
18,446,744,073,709,551,615

Ainsi, lorsque nous utilisons l'opérateur shift, les variables sont


25
automatiquement coulées par rapport à leurs types de variables. En C,
l'opérateur "<< " décale vers la gauche, et l'opérateur ">> " décale vers la
droite. Malheureusement, dans la plupart des langages de développement de
logiciels, il n'existe pas d'opérateur de rotation, de sorte que les bits qui se
déplacent de l'extrémité doivent être repoussés à l'autre extrémité. En C, une
fonction permettant de produire une rotation vers la droite pour une variable
(v) de n bits est la suivante :

var ror(var v,unsigned int b) {


return (v>>n)|(v<<(8*sizeof(var)-n));
}

Le nombre de bits utilisés pour définir un nombre entier est souvent défini
par la taille des registres utilisés dans le processeur. Dans la plupart des cas,
la taille maximale est de 64 bits - et est représentée par une valeur longue non
signée (ulong). En cryptographie, nous avons souvent des valeurs bien plus
grandes que cela et nos valeurs entières peuvent avoir 2 048 bits ou plus.
Ainsi, les types de données entières normaux ne supporteront pas ces
opérateurs, et il peut y avoir un débordement dans les opérations. Nous
utilisons donc des Big Integers pour effectuer les opérations, et qui stockent
leurs valeurs comme des entités de type chaîne de caractères, et non comme
des valeurs numériques. Cela peut donc supporter presque tous les nombres
que nous devons générer. Lorsque les valeurs sont traitées, les chaînes sont
converties en format numérique, les opérations sont effectuées et le résultat
est replacé dans un format de chaîne.
Une mise en œuvre populaire des grands nombres entiers est la bibliothèque
Bouncy Castle, où, en C#, la suite calcule 2 à la puissance d'un nombre donné
(i) :
BigInteger b = new BigInteger(''2'');
BigInteger c = b.Pow(i);

Les valeurs sont ensuite déclarées en tant qu'objets Big Integers et peuvent
être affichées en les convertissant en chaîne de caractères. Par exemple, si
nous voulons calculer :

A = gx mod (n)
B = gy mod (n)

k1 = Bx mod (n)
k2 = Ay mod (n)

nous pouvons mettre en œuvre ce qui suit (où x et y sont des valeurs
aléatoires comprises entre 0 et 90, et g et n sont des valeurs constantes) :

26
int x = Global.random(90);
int y = Global.random(90);
BigInteger g = new BigInteger("153d5d6172adb4cb9a428cc", 16);
BigInteger n = new BigInteger("9494fec095f3b8ca98cdf3b", 16);
BigInteger A = g.Pow(x).Mod(n);
BigInteger B = g.Pow(y).Mod(n);
BigInteger k1=B.Pow(x).Mod(n);
BigInteger k2=A.Pow(y).Mod(n);
String k1value = g.ToString();
String k2value = n.ToString();

Le tableau suivant définit la valeur maximale qui peut être représentée pour
différentes tailles de bits entiers :
Taille Int Nombre de valeurs
16 65,536
32 4,294,967,296
48 281,474,976,710,656
64 18,446,744,073,709,551,616
80 1,208,925,819,614,629,174,706,176
96 79,228,162,514,264,337,593,543,950,336
112 5,192,296,858,534,827,628,530,496,329,220,096
128 340,282,366,920,938,463,463,374,607,431,768,211,456
144 22,300,745,198,530,623,141,535,718,272,648,361,505,980,416
160 1,461,501,637,330,902,918,203,684,832,716,283,019,655,932,542,97 6
176 95,780,971,304,118,053,647,396,689,196,894,323,976,171,195,136,4 75,136
192 6,277,101,735,386,680,763,835,789,423,207,666,416,102,355,444,46 4,034,512,896
208 411,376,139,330,301,510,538,742,295,639,337,626,245,683,966,408, 394,965,837,152,256
224 26,959,946,667,150,639,794,667,015,087,019,630,673,637,144,422,5 40,572,481,103,610,249,216
240 1,766,847,064,778,384,329,583,297,500,742,918,515,827,483,896,87 5,618,958,121,606,201,292,
619,776

1.8.4 X- OU
Avec les opérateurs de décalage, un autre opérateur important est l'opération X-
OR au sens des bits (!). Sa fonction de base est la suivante :

Bit1 Bit2 Sortie


0 0 0

27
1 0 1
0 1 1
1 1 0
Voici un exemple d'opération avec un X-OR de 0101 0101 pour chaque octet :

Entrée 1010 1000 1111 0000 0101 1100 0000 0001


X-OR 0101 0101 0101 0101 0101 0101 0101 0101
Sortie 1111 1101 1010 0101 0100 1001 0101 0100
Le grand avantage de l'opération binaire X-OR est que, comme les opérateurs
de rotation de bits, elle préserve l'information dans la sortie traitée et peut
être annulée en opérant simplement sur la sortie avec la même valeur que
celle utilisée pour générer le résultat. Par exemple :

Output 1111 1101 1010 0101 0100 1001 0101 0100


X-OR 0101 0101 0101 0101 0101 0101 0101 0101
Input 1010 1000 1111 0000 0101 1100 0000 0001
L'exemple suivant montre un exemple de conversion, où nous avons une
chaîne ("Test") et appliquons une clé, avec un format encodé résultant de
"IBEHAA==" :

ASCII Hex Hex (Base-64) Hex (Binaire)


(Résultat) Hex
Entrée Test 54657374 VGVzdA== 01010100 01100101 01110011 01110100
Clé 01110100 01110100 01110100 01110100
Encodé 20110700 IBEHAA== 00100000 00010001 00000111 00000000

Un processus de cryptage simple pourrait être :


• Prenez 32 bits à la fois.
• Décalez les bits de quatre espaces vers la gauche.
• X-OR la valeur par 1010 1000.
• Décale les bits de deux espaces vers la droite.
• X-OR la valeur par 1010 1000.
28
Ensuite, le processus de décryptage serait (lecture de 32 bits à la fois) :
• X-OR la valeur par 1010 1000
• Décalez les bits de deux espaces vers la gauche.
• X-OR la valeur par 1010 1000.
• Décalez les bits de quatre espaces vers la droite.
1.8.5 Modulo-2 Opérations
En cryptographie, nous essayons d'éviter les opérations mathématiques
complexes qui impliquent des reports de bits. Ce type d'opération est connu
sous le nom de Modulo-2, ou GF(2) - qui est un champ de Galois à deux
éléments - et est utilisé dans de nombreux domaines, notamment pour les
sommes de contrôle et les chiffrages.

La fonction de multiplication consiste à multiplier les valeurs binaires et à


ignorer le reste de chaque report. Ce type d'opération simplifie la mise en
œuvre et est rapide dans son fonctionnement. Il s'agit essentiellement de
quelques décalages de bits et d'une fonction EX- OR, ce qui rend le calcul de
la multiplication rapide.
Les opérations de base sont les suivantes :

0+0=0 1+1=0
0+1=1 1+0=1
Elle effectue l'opération équivalente à une fonction OU exclusif (XOR). Pour
l'arithmétique modulo-2, la soustraction est la même opération que l'addition:

0-0=0 1-1=0
0-1=1 1-0=1
La multiplication s'effectue de la manière suivante :

0×0=0 0×1=0
1×0=0 1×1=1
qui est une opération équivalente à une opération logique ET.
La représentation numérique binaire, telle que 101110, est souvent
difficile à utiliser lors de la multiplication et de la division. Une
représentation typique consiste donc à manipuler la valeur binaire comme un
polynôme de puissances de bits. Cette technique représente chaque bit
comme un x à la puissance de la position du bit, puis additionne chacun des
bits, par exemple :
10111 x4 +x2 +x+1
1000 0001 x7 + 1
1111 1111 1111 1111 x11 +x10 +x9 +x8 +x7 +x6 +x5 +x4 +x3 +x2 +x+1
29
10101010 x7 +x5 +x3 +x

Par exemple : 101×110


est représenté par : (x2 +1)×(x2 +x)
ce qui équivaut à : x4 +x3 +x2 +x
qui est donc : 11110

L'addition des bits est traitée comme une addition modulo-2, où deux
variables ayant les mêmes puissances sont égales à zéro (1+1=0). Par
exemple :
x4 + x4 + x2 + 1 + 1

est égal à x2 car x4 +x4 est égal à zéro et 1+1 est égal à 0 (en modulo-2). Un
exemple qui le montre est la multiplication de 10101 par 01100.

Ainsi: 10101× 01110


est représenté par : (x4 +x2 + 1 × (x3 +x2 +x)
ce qui équivaut à x7 +x6 +x5 +x5 +x4 +x3 +x3 +x2 +x
ce qui équivaut à : x7 +x6 +x4 +x2 +x
qui est donc : 11010110

Le processus de division utilise une opération OU exclusif au lieu de la


soustraction et peut être mis en œuvre avec un registre à décalage et quelques
portes OU exclusif. Par exemple, 101101 divisé par 101 est implémenté
comme suit :

Ainsi, la division modulo-2 de 101101 par 100 est donc 1011 reste 1. Comme
pour la multiplication, cette division modulo-2 peut également être
représentée par des valeurs polynomiales.

30
1.10 GCD
Le PGCD est connu sous le nom de plus grand diviseur commun ou plus
grand facteur commun (GCD). Il s'agit du plus grand nombre entier positif
qui se divise en deux nombres sans reste. Il s'agit du plus grand nombre entier
positif qui divise deux nombres sans reste. Par exemple, le PGCD de 9 et de
15 est 3. C'est une opération qui est utilisée dans de nombreux algorithmes
de cryptage, et voici un exemple de code permettant de calculer le PGCD
pour deux valeurs (a et b) :
static int GCD(int a, int b)
{
int Remainder;
while( b != 0 )
{
Remainder = a % b;
a = b;
b = Remainder;
}
return a;
}

Si on prend une valeur de 54 et 8, on obtient :


a:54, b:8, Reste:6
a:8,b:6, Reste:2
a:6, b:2, Reste:0
Valeur de retour:2

1.11 Générateurs de nombres aléatoires


En cryptographie, les nombres aléatoires sont utilisés pour générer des éléments
tels que les clés de cryptage. Si la génération de ces clés peut être prédite
d'une manière ou d'une autre, il peut être possible de les deviner. Les deux
principaux types de générateurs de nombres aléatoires sont :
• Générateurs de nombres pseudo-aléatoires (PRNG). Cette méthode
répète les nombres aléatoires après un temps donné (périodique). Ils sont
rapides et également déterministes, et sont utiles pour produire un
ensemble répétable de nombres aléatoires.
• Générateurs de nombres aléatoires vrais (TRNG). Cette méthode
génère un véritable nombre aléatoire, et utilise une certaine forme de
processus aléatoire. Une approche consiste à surveiller les mouvements
du pointeur d'une souris sur un écran ou les pauses entre les frappes au
clavier. Globalement, cette méthode est généralement lente, surtout si
elle implique une interaction humaine, mais elle est non déterministe et
apériodique.

31
Normalement, les applications de simulation et de modélisation utilisent des
PRNG, afin que les valeurs générées puissent être répétées pour différentes
exécutions, tandis que la cryptographie, les loteries, les jeux d'argent et les
jeux utilisent des TRNG, car chaque valeur ne doit pas se répéter ou être
prévisible. Si la génération de la clé était déterministe, Eve pourrait
éventuellement deviner la clé créée. Ainsi, lors de la génération de clés de
chiffrement pour le chiffrement à clé publique, il est souvent demandé aux
utilisateurs de générer une activité aléatoire, et un nombre aléatoire est
ensuite généré sur la base de cette activité. Ce nombre aléatoire est ensuite
utilisé pour générer les clés de cryptage.
Cependant, les programmes informatiques ont souvent du mal à générer
des nombres véritablement aléatoires. C'est pourquoi des générateurs
matériels sont souvent utilisés dans des applications hautement sécurisées.
Une méthode consiste à générer un nombre aléatoire basé sur des signaux de
bruit de bas niveau, statistiquement aléatoires. Cela inclut des éléments tels
que le bruit thermique et l'effet photoélectrique.

1.11.1 Nombres aléatoires linéaires congruentiels


Une méthode pour créer un générateur de nombres aléatoires simple consiste
à utiliser un générateur de séquence de la forme :
Xi+1 ←(a × Xi + c) mod m
Où a, c et m sont des entiers, et où X0 est la valeur de départ de la série. Si
nous prenons les valeurs de a=21, X0 =35, c=31 et m=100, nous obtenons
une série de :

(21×35+31) mod 100 donne 66


(21×66+31) mod 100 donne 17
(21×17+31) mod 100 donne 88
et ainsi de suite.

66 17 88 79 90 21 72 43 34 45 76 27 98 89 0 31 82 53

En cryptographie, il est important de générer des valeurs aussi aléatoires que


possible, afin que Eve ne puisse pas deviner les nombres aléatoires que Bob
et Alice ont utilisés. Avec le caractère aléatoire, nous ne pouvons pas
déterminer le degré d'aléa des valeurs en prenant simplement quelques
échantillons. Pour cela, nous avons besoin d'un grand nombre d'échantillons
et d'une estimation du caractère aléatoire global.
Il existe différents tests pour déterminer le caractère aléatoire. Par
exemple, nous pouvons définir une valeur moyenne qui se situe à mi-chemin
de la fourchette de chiffres, puis déterminer le rapport entre les valeurs
supérieures et inférieures à ce point. Cela fonctionnera, mais ne nous
montrera pas si les valeurs sont bien distribuées. En outre, nous pourrions
32
déterminer la moyenne arithmétique des valeurs et la faire correspondre à la
valeur centrale de la plage de chiffres.
Une méthode améliorée pour tester la distribution des valeurs est le test
de la valeur de Monte Carlo pour Pi. Avec cette méthode, nous prenons nos
nombres aléatoires et les mettons à l'échelle entre -1,0 (échelle de la valeur
minimale) et 1,0 (échelle de la valeur maximale). Ensuite, nous prenons deux
valeurs à la fois et nous calculons :

!𝑥 ! + 𝑦 !
Si cette valeur est inférieure ou égale à un, on se place dans le cercle (de
rayon 1), sinon on sort du cercle. L'estimation de PI est alors égale à quatre
fois le nombre de points dans le cercle (M) divisé par le nombre total de
points (N). Dans la figure 1.14, les points bleus sont à l'extérieur du cercle et
les points jaunes sont à l'intérieur.

Figure 1.14 Analyse du texte chiffré par rapport aux probabilités normales.

Une autre méthode pour déterminer le caractère aléatoire consiste à mesurer


l'entropie des données. L'entropie a été définie par Claude E. Shannon dans son
article de 1948. L'entropie maximale se produit lorsqu'il y a une distribution
égale de tous les octets dans les données. Normalement, nous les définissons
en termes d'octets. La méthode que nous utilisons consiste à prendre les
fréquences des valeurs d'octets et à calculer combien de bits sont utilisés :
"#!$$

E" = ' f𝑛 log2 (𝑓𝑛)


" #%

où fn se rapporte à la fréquence des valeurs d'octet. L'entropie maximale est


de 8 bits (pour une valeur d'octet). Pour les valeurs de 0 à 255, on s'attendrait
à un résultat d'environ 8 bits si les valeurs sont aléatoires.

33
1.11 Analyse de la fréquence
Enfin, nous ferons un peu d'analyse de fréquence, car elle est souvent utilisée
dans le décryptage des codes, notamment pour repérer les variations dans les
codes probables. La meilleure façon de l'illustrer est de prendre un exemple.
Si notre texte chiffré est :

34
LQ A EAOONM WC A CNI UNHAUNZ OKN IWMRU KAZ HKAQDNU CMWE AQ
LQUSZOMLAR ADN LQOW AQ LQCWMEAOLWQ ADN. LO LZ WQN IKLHK,
SQRLPN NAMRLNM ADNZ, NQHATZSRAONZ FLMOSARRB OKN IKWRN IWMRU.
LO LZ ARZW WQN IKLHK ARRWIZ OKN QNI LQUSZOMLNZ OW XN XAZNU
LQ AQB RWHAOLWQ ILOKWSO MNVSLMLQD AQB QAOSMAR MNZWSMHNZ,
WM OW XN LQ AQB AHOSAR TKBZLHAR RWHAOLWQZ. OBTLHARRB ARR OKAO
LZ MNVSLMNU LZ A MNRLAXRN QNOIWMP HWQQNHOLWQ. WSM IWMRU LZ
HKAQDLQD XB OKN UAB, AZ OMAULOLWQAR CWMEZ WC XSZLQNZZ AMN
XNLQD MNTRAHNU, LQ EAQB HAZNZ, XB EWMN MNRLAXRN AQU CAZONM
IABZ WC WTNMAOLQD. WSM TWZOAR ZBZONE, IKLRN ZOLRR SZNU
CWM EAQB SZNCSR ATTRLHAOLWQZ, KAZ XNNQ RAMDNRB MNTRAHNU XB
NRNHOMWQLH EALR. ILOK FWOLQD, OKN ZRWI AQU HSEXNMZWEN OAZP WC
EAMPLQD FWOLQD TA-TNMZ ILOK OKN TMNCNMMNU HAQULUAON, LZ
QWI XNLQD MNTRAHNU XB NRNHOMWQLH FWOLQD. OKN OMAULOLWQAR
ZBZONEZ,OKWSDK, KAFN XNNQ AMWSQU CWM KSQUMNUZ LC QWO
OKWSZAQUZ WC BNAMZ, AQU OBTLHARRB SZN INRR OMLNU-AQU-ONZONU
ENHKAQLZEZ. CWM OKN EWZO TAMO, CWM NJAETRN, IN OMSZO
A TATNM-XAZNU FWOLQD ZBZONE, NFNQ OKWSDK LO LZ INRR PQWIQ
OKAO A HWSQO WC OKN FWONZ ILOKLQ AQ NRNHOLWQ ILRR WCONQ
TMWUSHN ULCCNMNQO MNZSROZ NAHK OLEN OKAO OKN FWON LZ HWSQONU,
AQU OKNQ MNHWSQONU. AQ NRNHOMWQLH ENOKWU ILRR, WQ OKN
WOKNM KAQU, EWZO RLPNRB KAFN A ZSHHNZZ MAON WC 100%.

Nous pouvons maintenant déterminer la fréquence des caractères :

a b c d e f g h i j k l m
90 23 22 18 21 10 0 37 24 1 43 75 61
[8.5%] [2.2%] [2.1%] [1.7%] [2.0%] [0.9%] [0.0%] [3.5%] [2.3%] [0.1%] [4.1%] [7.1%] [5.8%]
n o p q r s t u v w x y z
119 90 6 76 59 31 19 38 2 73 16 0 67
[11.2%] [8.5%] [0.6%] [7.2%] [5.6%] [2.9%] [1.8%] [3.6%] [0.2%] [6.9%] [1.5%] [0.0%] [6.3%]

Et nous pouvons tracer l'occurrence en fonction de la façon dont les


caractères se rapportent aux probabilités des caractères anglais standard
(figure 1.15).
Le tableau suivant montre comment le texte correspond à la probabilité
normale du texte (où "E" a le plus haut niveau d'occurrence et "Z" le plus
bas). Les lignes en minuscules montrent ce que l'on attend de l'ordre, et les
lignes en majuscules montrent ce que le texte chiffré donne pour l'ordre :

e t a o i n s h r d l c u
N O A Q L W Z M R K U H S
m w f g y p b v k x j q z
I B C E T D X F P V J G Y

35
Figure 1.15 Analyse du texte chiffré par rapport aux probabilités normales.

A partir de là, nous prédisons :


• Que N dans le texte chiffré correspond à e dans le texte en clair.
La meilleure solution suivante consiste à analyser les caractères à une,
deux et trois lettres :

Un Deux lettres (Most pop.) Trois lettres (Most Pop : le, et,
lettre de, à, dans, il, est, être, pour, sont, mais, pas, vous, tout,
(Most comme, à, n'importe, peut, avait, elle, était, un,
pop : donc, nous, il, par, ou, notre, out, jour, obtenir, a, lui, son,
a, I) sur, faire, comment, homme, nouveau,
si, moi, mon, up, an, go, maintenant, vieux, voir, deux, façon,
non, nous, am) qui, garçon, fait, son, laisser, mettre,
dire, elle, aussi, utiliser)
a [90] lq [20] wc [8] aq [20] lo cni [1] okn [13] kaz [2] adn [3] wqn
[9] lz [9] ow [3] xn [7] [2] qni [1] aqb [5] arr [5] wsm [3]
wm [12] xb [4] az [8] lc amn [1] aqu [8] cwm [6] qwi [2] qwo
[2] dans [3] wq [15] [1] szn [3]

36
La meilleure hypothèse est probablement qu'un "A" est un "a", et nous
pouvons localiser "the" avec "OKN", qui est le plus populaire pour les mots
de trois lettres. Ainsi, nous avons "O" associé à "t", "K" à "h". Si nous avons
mis en correspondance "T" avec "a", alors "AQU" semble être "et", et nous
donne donc "Q" en correspondance avec "n" et "U" en correspondance avec
"d". Ce qui donne :
Ln a EatteM WC a CeI deHadeZ the IWMRd haZ HhanDed CMWE an
LndSZtMLaR aDe LntW an LnCWMEatLWn aDe. Lt LZ Wne IhLHh,
SnRLPe eaMRLeM aDeZ, enHaTZSRateZ FLMtSaRRB the IhWRe
IWMRd. Lt LZ aRZW Wne IhLHh aRRWIZ the neI LndSZtMLeZ tW Xe
XaZed Ln anB RWHatLWn ILthWSt MeVSLMLnD anB natSMaR MeZWSMHeZ,
WM tW Xe Ln anB aHtSaR ThBZLHaR RWHatLWnZ. tBTLHaRRB aRR that
LZ MeVSLMed LZ a MeRLaXRe netIWMP HWnneHtLWn. WSM IWMRd LZ
HhanDLnD XB the daB, aZ tMadLtLWnaR CWMEZ WC XSZLneZZ aMe
XeLnD MeTRaHed, Ln EanB HaZeZ, XB EWMe MeRLaXRe and CaZteM
IaBZ WC WTeMatLnD. WSM TWZtaR ZBZteE, IhLRe ZtLRR SZed CWM
EanB SZeCSR aTTRLHatLWnZ, haZ Xeen RaMDeRB MeTRaHed XB
eReHtMWnLH EaLR. ILth FWtLnD, the ZRWI and HSEXeMZWEe taZP
WC EaMPLnD FWtLnD Ta-TeMZ ILth the TMeCeMMed HandLdate, LZ
nWI XeLnD MeTRaHed XB eReHtMWnLH FWtLnD. the tMadLtLWnaR
ZBZteEZ, thWSDh, haFe Xeen aMWSnd CWM hSndMedZ LC nWt
thWSZandZ WC BeaMZ, and tBTLHaRRB SZe IeRR tMLed-and-teZted
EeHhanLZEZ. CWM the EWZt TaMt, CWM eJaETRe, Ie tMSZt a
TaTeM-XaZed FWtLnD ZBZteE, eFen thWSDh Lt LZ IeRR PnWIn
that a HWSnt WC the FWteZ ILthLn an eReHtLWn ILRR WCten
TMWdSHe dLCCeMent MeZSRtZ eaHh tLEe that the FWte LZ
HWSnted, and then MeHWSnted. an eReHtMWnLH EethWd ILRR,
Wn the WtheM hand, EWZt RLPeRB haFe a ZSHHeZZ Mate WC 100%.

Cela devient maintenant facile en balayant du regard, où "nWt" ressemble à


"W" qui est un "o", et "Xe" ressemble à "be", donc "X" devient un "b", "Ln"
ressemble à "In", ce qui fait un "L" correspondant à "i". Si on regarde juste
la première ligne, on obtient :
in a EatteM oC a CeI deHadeZ the IoMRd haZ HhanDed CMoE an
indSZtMiaR aDe into an inCoMEation aDe. it iZ one IhiHh,
SnRiPe eaMRieM aDeZ, enHaTZSRateZ FiMtSaRRB the IhoRe IoMRd.
it iZ aRZo one IhiHh aRRoIZ the neI indSZtMieZ to be baZed
in anB RoHation IithoSt MeVSiMinD anB natSMaR MeZoSMHeZ,
oM to be in anB aHtSaR ThBZiHaR RoHationZ.
Et nous pouvons repérer... "EatteM" correspond à "matière" et "oC" à "de",
"inCoMEation" correspond à "information" :
in a matter of a feI deHadeZ the IorRd haZ HhanDed from an
indSZtriaR aDe into an information aDe. it iZ one IhiHh,
SnRiPe earRier aDeZ, enHaTZSRateZ FirtSaRRB the IhoRe IorRd.
it iZ aRZo one IhiHh aRRoIZ the neI indSZtrieZ to be baZed
in anB RoHation IithoSt reVSirinD anB natSraR reZoSrHeZ,
or to be in anB aHtSaR ThBZiHaR RoHationZ.

37
"feI" correspond alors à "peu", "worRd" à "monde", "indSZtriaR" à
"industriel" pour donner
in a matter of a few deHades the world has HhanDed from an
industrial aDe into an information aDe. it is one whiHh,
unliPe earlier aDes, enHaTsulates FirtuallB the whole world.

Et il n'y a pas besoin de beaucoup de suppositions pour y arriver :

1.12 Laboratoire/tutorial

Le laboratoire et le tutoriel relatifs à ce chapitre sont disponibles en ligne à


l'adresse suivante : http://asecuritysite.com/crypto01.
Quelques défis de chiffrement sont disponibles à l'adresse suivante :
http://asecuritysite.com/challenges.

38

Vous aimerez peut-être aussi