suivant: Chiffrement affine : deuxième
monter: Chiffrement affine : premier
précédent: Traduction Algorithmique
Table des matières
Index
On dispose de :
- char la fonction qui à un nombre n associe le caractère de
code ASCII n et, qui a une liste de nombres associe la chaîne des
caractères dont les codes correspondent aux nombres de la liste.
- asc la fonction qui à une chaîne de caractères
associe la liste des codes ASCII des caractères composant la chaîne.
Attention asc("A")=[65] et donc (asc("A"))[0]=65.
Voici le codage d'une lettre par la fonction cod1 :
cod1(c,a,b):={
local n;
n:=(asc(c))[0]-32;
n:=irem(a*n+b,96);
return(char(n+32));
}
Voici le codage du message par la fonction codm1 :
codm1(m,a,b):={
local r,c,s;
r:="";
s:=size(m);
for (k:=0;k<s;k++){
c:=m[k];
r:=concat(r,cod1(c,a,b));
}
return(r);
}
On peut aussi coder directement le message mess : en effet avec
Xcas les fonctions asc
et char gérent les chaînes et les listes.
On transforme donc le message (i.e une chaîne de caractères)
en une liste l de nombres avec asc(mess), puis on transforme cette
liste de nombres par l'application
affine
f (n) = a×n + b ( mod 96) en la liste mc, puis on transformer la liste lc
des nombres ainsi obtenus en une chaîne de caractères
(avec char(lc), c'est ce que fait la fonction codm).
Dans ce qui suit on a écrit les fonctions :
bonpara(para) (avec para=[a,b]) renvoie la liste des paramètres
de décodage si le paramètre a est premier avec 96.
Cette fonction utilise la fonction decopara(para) qui calcule les paramètres
de décodage.
decopara(para):={
//decopara permet de trouver les parametres de decodage
local bez,a,b;
a:=para[0];
b:=para[1];
bez:=bezout(a,96);
a:=irem(bez[0],96);
if (a<0) a:=a+96;
b:=irem(-b*a,96);
if (b<0) b:=b+96;
return([a,b]);
};
bonpara(para):={
//teste si a est premier avec 96
if (pgcd(para[0],96)==1) return(decopara(para)); else return(false);
};
codm(mess,para):={
//codage par chiffrement affine de parametres para=[a,b] mod 96
//codm code le message mess (="....") avec para=[a,b]
local l,lc,sl,a,b,c;
a:=para[0];
b:=para[1];
l:=asc(mess);
sl:=size(l);
for (k:=0;k<sl;k++){
//les caracteres codes entre 0 et 31 ne sont pas lisibles
l[k]:=l[k]-32;
}
lc:=[];
for (j:=0;j<sl;j++){
c:=irem(a*l[j]+b,96);
lc:=concat(lc,32+c);
}
return(char(lc));
}
suivant: Chiffrement affine : deuxième
monter: Chiffrement affine : premier
précédent: Traduction Algorithmique
Table des matières
Index
Documentation de giac écrite par Renée De Graeve