next up previous contents index
suivant: Chiffrement affine : deuxième monter: Chiffrement affine : premier précédent: Traduction Algorithmique   Table des matières   Index

Traduction Xcas

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));
}


next up previous contents index
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