Algorithmes de cryptographie 1

(version du 15/04/03) - pg en Lisp

Généralités

D'une façon générale, on considère qu'une chaîne de caractères est un tableau à une dimension de caractères. Ce n'est pas aussi simple en Java.

On dispose dans tous es algorithmes de ALPHA, une chaîne de caratères désignant notre alphabet :

ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

Le message d'origine est désigné par M, le message codé par C, et la clé par K. Pour chaque méthode de codage, on cherchera à écrire l'algorithme de codage, de décodage, de génération de clé (si besoin est), et on considérera dans quelles mesures il est facile de casser ce codage.

Code de César

Lé clé K est un entier. Le principe est de décaler chaque caractères de M de K position dans l'alphabet. Par exemple avec K = 3, le message "BONJOUR" devient "ERQMRXU".

fonction coder-cesar (M : chaîne de caratères ; K : entier)
--> C : chaîne de caratères
C <-- nouveau chaîne de caractères de longueur longueur(M)
pour i de 0 à longueur(M)-1 faire
C[i] <-- ALPHA[(rechercher-element(M[i], ALPHA)+ K)mod(longueur(ALPHA))]
finpour
retourner C
fin

avec

fonction rechercher-element (O : objet ; T : tableau)
--> entier
pour i de 0 à longueur(T)-1 faire
si T[i] = O alors
retourner i
finpour
retourner -1
fin

La fonction rechercher-element retourner l'indice du premier élément de T égal à O, et -1 si un tel élément n'existe pas.

La fonction de décodage consister à coder en sens inverse :

fonction decoder-cesar (M : chaîne de caratères ; K : entier)
--> C : chaîne de caratères
retourner coder-cesar(M, -K)
fin

Le code de césar est facile à casser, il suffit d'essayer toutes les K possibles (26 dans le cas de ALPHA)

Codage par substitution

La codage par susition consister à remplacer une lettre de l'alphabet par une autre. par exemple si K = "LEZBUOITAVDMNPHYRCFGJKQSWX" alors le message "BONJOUR" devient "EHPVHJC".

fonction coder-subst (M : chaîne de caratères ; K : chaîne de caratères)
--> C : chaîne de caratères
C <-- nouveau chaîne de caractères de longueur longueur(M)
pour i de 0 à longueur(M)-1 faire
C[i] <-- K[rechercher-element(M[i], ALPHA]
finpour
retourner C
fin

Pour décoder, il suffit d'échanger l'alphabet et la clé.

fonction decoder-subst (M : chaîne de caratères ; K : chaîne de caratères)
--> C : chaîne de caratères
C <-- nouveau chaîne de caractères de longueur longueur(M)
pour i de 0 à longueur(M)-1 faire
C[i] <-- ALPHA[rechercher-element(M[i], K]
finpour
retourner C
fin

Il est pénible d'avoir à mémoriser les 26 lettrres de l'alphabet dans un ordre particulier (aussi éloigné que possbile de l'ordre alphabétique). Il est nécessaire d'être capable de se générer K à partir d'un texte facilement mémorisable. L'idée de parcourir de texte et de construire la clé en ajoutant chaque caractère rencontré pas encore présent dans la clé. On ajoute les lettres de l'alphabet manquant à la fin. Par exemple, le texte "MAITRECORBEAUSURUNARBREPERCHE", génére la clé "MAITRECOBUSNPHDFGJKLQVWXYZ" .

fonction generer-cle-subst (TEXTE : chaîne de caractères)
--> K : chaîne de caractères
K <-- nouveau chaîne de caractères de longueur longueur(ALPHA)
entier ik <-- 0
//
// on ajoute les caractères de TEXTE
//
pour i de 0 à longueur(TEXTE)-1 faire
si rechercher-element(TEXTE[i],K) = -1 alors
K[ik] <-- TEXTE[i]
ik <-- ik + 1
finsi
finpour
//
// on ajoute le reste de ALPHA
//
pour i de 0 à longueur(ALPHA)-1 faire
si rechercher-element(ALPHA[i],K) = -1 alors
K[ik] <-- ALPHA[i]
ik <-- ik + 1
finsi
finpour
retourner K
fin

En faisant quelques statistique sur les fréquences d'apparition des caratères dans un texte normal et le message, on peut reconstituer le clé. La méthode n'est donc pas très robuste.

Codage Vigenère

Il s'agit d'un codage à décalages où chaque caractères de la clé donné la valeur de décalage. Par exemple, la lettre C donne un décalage de 2 (cad A est transformé en C), J donne un décalage de 9. Par exemple le Message M = "APPELERNORDTROUPESVILLE" devient "RDJKPVFHUVUHLUYGSMBMCZY" avec K = "ROUGE"

fonction coder-vignere (M : chaîne de caratères ; K : chaîne de caractères)
--> C : chaîne de caratères
C <-- nouveau chaîne de caractères de longueur longueur(M)
entier ik <-- 0
entier posc, posk
pour i de 0 à longueur(M)-1 faire
posc <-- rechercher-element(M[i], ALPHA)
posk <-- rechercher-element(K[ik], ALPHA)
C[i] <-- ALPHA[(posc + posk)mod(longueur(ALPHA))]
ik <-- (ik+1)mod(longueur(K))
finpour
retourner C
fin

La fonction de décodage consiste à soustraire le décalage.

fonction decoder-vignere (M : chaîne de caratères ; K : chaîne de caractères)
--> C : chaîne de caratères
C <-- nouveau chaîne de caractères de longueur longueur(M)
entier ik <-- 0
entier posc, posk
pour i de 0 à longueur(M)-1 faire
posc <-- rechercher-element(M[i], ALPHA)
posk <-- rechercher-element(K[i], ALPHA)
C[i] <-- ALPHA[(posc - posk)mod(longueur(ALPHA))]
ik <-- (ik+1)mod(longueur(K))
finpour
retourner C
fin

Pour casser ce code, il faut essayer de deviner la clé et sa longueur l. On peut faire des statistique sur le fréquence des caractères toutes les tranches de l caractères (qui ont le même décalage).

Codage par carré de substitution

Afin de brouiller les statistiques d'apparition des caractères