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.
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
La fonction
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
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)
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.
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).
Afin de brouiller les statistiques d'apparition des caractères