Exemples chiffres classiques

Fonctions utiles

encodez26(s) = [ c-97 | c <- Vec(Vecsmall(s)), 97<=c && c<= 122 ];
decodez26(v) = Strchr([ c+97 | c <- v]);
clair = encodez26("une grenouille vit un boeuf qui lui sembla de belle taille")

Cesar

cesar(m,k,n) = [ (x+k) % n | x<-m ];
k = encodez26("k")[1]
chiffre = cesar(clair,k,26)
\\ le déchiffrer

Vigenère

vigenere(m,k,n) = vector(#m,i,(m[i] + k[(i-1) % #k + 1]) % n);
clef = encodez26("crypto");
chiffre = vigenere(clair,clef,26)
\\ le déchiffrer

Chiffre de Hill

blocks(v,l) = {
  my(n=ceil(#v/l));
  my(v=Vec(v,l*n));
  [ v[l*k+1..l*k+l] | k <- [0..n-1]];
}

On suppose à présent que le module n est contenu dans la clef

clef = matrix(3,3,i,j,random(Mod(1,26)))
hill(m,k) = concat([ lift(b*k) | b <- blocks(m,#k) ]);
hill(clair,clef)
\\ peut-on le déchiffrer ?

Exercices

Chiffre de Hill

Retrouver la clef correspondant au chiffré ci-dessous, le clair est le message en clair initial, les blocs sont de taille 3 et le module est \(n=29\).

connu = [15, 6, 25, 6, 5, 5, 19, 21, 8]
\\dechiffrer

Module perdu

On a intercepté le chiffré suivant, obtenu à l’aide d’un chiffre de Hill de longueur 2 mais dont on ignore le module \(n\).

c = [11, 3, 12, -10, 12, 4, 11, 14, -8, -1, 3, -10]

ainsi que les premiers mots en clair

m = [2, 7, 0, 15, 4, -14]

Le déchiffrer.

\\ determiner A tq m[1..4] -> c[1..4]
\\ meme chose avec m[3..6]
\\ terminer

Et sur un corps

On décide de réaliser la cryptographie sur 27 lettres pour inclure l’espace.

encodez27(s) = [ if(c==32,0,c-96) | c <- Vec(Vecsmall(s)), c==32 || (97<=c && c<= 122) ];
decodez27(v) = Strchr([ if(c,c+96,32) | c <- v]);

On a deux possibilités : faire la crypto dans l’anneau \(\Z/27\Z\) ou dans le corps \(\F_{27}\).

Pour travailler dans \(\Z/27\Z\) on utilise la syntaxe modulaire Mod

clair = encodez27("une grenouille vit un boeuf qui lui sembla de belle taille");
clairZ27 = clair * Mod(1,27)

Pour travailler dans \(\F_{27}\) il faut construire le corps. On choisit de prendre un élément primitif \(a\), et de représenter l’espace par 0 et les autres éléments par la puissance correspondante de \(a\).

x = ffgen(27)
a = ffprimroot(x)
clairF27 = [ if(x,a^x,0) | x <- clair ]

Quel est le nombre de clefs dans \(\Gl_2(\Z/27\Z)\) ? et dans \(\Gl_2(\F_{27})\) ?