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

Traduction Xcas

Voici la fonction decopara3(para) qui donne les paramètres de décodage quand les paramètres sont corrects.
On prend comme chiffrement affine a*n + b  mod 963 car on veut mettre le message codé dans une chaîne et donc transformer un paquet de 3 lettres en un paquet d'exactement 3 lettres.
decopara3(para):={
//=le parametrage de decodage du parametrage para (liste).
local a,b,l;
a:=para[0];
b:=para[1];
l:=bezout(a,96^3);
if (l[2]!=1) return(false);
a:=l[0];
if (a<0) a:=a+96^3;
b:=-irem(b*a,96^3)+96^3;
return([a,b]);
}
Voici la transformation d'un mot s d'au moins 3 lettres en un nombre entier par la fonction mot2n :
mot2n(s):={
//transforme un mot s de 3 lettres en n 
//n a pour ecriture s en base 96 
local l,n;
l:=asc(s);
n:=(l[0]-32)*96^2+(l[1]-32)*96+l[2]-32;
return(n);
}

Voici la transformation d'un nombre entier n en son écriture en base 96 (c'est à dire en un mot d'au moins 3 lettres) par la fonction n2mot : cette fonction utilise la fonction ecritu96 qui écrit n dans la base 96 comme un mot de 1,2,3 etc caractères. Pour obtenir un mot d'au moins 3 lettres il suffit de rajouter des espaces devant le mot puisque le code ASCII de l'espace vaut 32, cela revient à rajouter des zéros devant l'écriture de n.

ecritu96(n):={
//transforme l'entier n en la chaine s
//s est l'ecriture de n en base 96
local s,r;
// n est un entier et b=96
// ecritu96 est une fonction iterative 
//ecritu96(n)=l'ecriture de n en base 96 
s:="";
while (n>=96){
r:=irem(n,96);
r:=char(r+32);
s:=r+s;
n:=iquo(n,96);
}
n:=char(n+32);
s:=n+s;
return(s);
};

n2mot(n):={
local mot,s;
mot:=ecritu96(n);
s:=size(mot);
//on suppose n<96^3 on transforme n en un mot de 3 caracteres
//on rajoute des espaces si le mot n'a pas 3 lettres
if (s==2) {mot:=" "+mot;}
else {
if (s==1) {mot:="  "+mot;}
}
return(mot); 
}

Voici le codage d'un mot d'au moins 3 lettres par la fonction codmot3 : en prenant toujours $ \tt p=96^3$

codmot3(mot,para):={
//codage d'un mot de 3 lettres avec le parametrage para=[a,b]
local n,m,a,b;
//para:[569,2] mod 96^3
//decopara3=[674825, 419822]
a:=para[0];
b:=para[1];
n:=mot2n(mot);
m:=irem(a*n+b,96^3);
return(n2mot(m));
}
Le décodage d'un mot codé avec codmot3 se fait aussi avec la fonction codmot3.
Voici le codage d'un message par la fonction codmess3 :
codmess3(mess,para):={
//code le message mess,parametrage para et paquet de 3 lettres 
  local s,messcod,mess3;
  s:=size(mess);
  if (irem(s,3)==2){ 
    mess:=mess+" ";
    s:=s+1;
  }
  else {
    if (irem(s,3)==1) { 
       mess:=mess+"  ";
       s:=s+2;
    }
  } 
  messcod:="";
  for (k:=0;k<s;k:=k+3){
    mess3:=mess[k..k+2];
    mess3:=codmot3(mess3,para);
    messcod:=messcod+mess3;
  }
return(messcod);
}
Le décodage du message se fait aussi par la fonction codmess3
next up previous contents index
suivant: Devoir à la maison monter: Chiffrement affine : deuxième précédent: Traduction Algorithmique   Table des matières   Index
Documentation de giac écrite par Renée De Graeve