funcprot(0);

function chiffre=Cesar(k, mess)
  // fonction  qui effectue le chiffrement de César
  // arguments:
  // k: le paramètre de décalage de l'alphabet, entier
  // mess: chaine de caractères qui représente le message à coder
  
  // on transforme le message en tableau de codes ascii des caractères 
  // Qui le composent 
  // ensuite on applique le décalage de k caractères
  // comme dans la table ascii les codes des caractères se suivent dans 
  // l'ordre alphabétique
  // il suffit d'ajouter k aux codes
  // mais avant il faut s'assurer que la valeur de k est modulo 26
  k=modulo(k,26)
  tabAscii=ascii(mess)+k;
  
  for i=1:length(tabAscii)

    // on corrige le décalage pour les espaces
    // le code ascii de l'espace est 32. On annule le décalage pour les espaces
    if(tabAscii(i)==32+k)
      tabAscii(i)=tabAscii(i)-k;
    end
    // on doit également introduire l'effet circulaire de la clé ; les lettres qui se retrouvent en dehors de [0-25], il faut les ramener dans l'intervalle, au début de [0-25]
    if(tabAscii(i)>90)
      tabAscii(i)=tabAscii(i)-26;
    end
  end
  
  chiffre=ascii(tabAscii);
endfunction

function mess=DecodeCesar(k, chiffre)
  // fonction  qui effectue le déchiffrement de César
  // arguments:
  // k: le paramètre de décalage  de l'alphabet, entier
  // chiffre: chaine de caractères qui représente le message chiffré
  
  // on transforme le message en tableau de codes ascii des caractères 
  // Qui le composent 
  // ensuite on applique le décalage de k caractères
  // comme dans la table ascii les codes des caractères se suivent dans 
  // l'ordre alphabétique
  // il suffit d'enlever k aux codes 
  // mais avant il faut s'assurer que la valeur de k est modulo 26
  k=modulo(k, 26)
  tabAscii=ascii(chiffre)-k;
  
  for i=1:length(tabAscii)
      
  // on corrige le décalage pour les espaces
  // le code ascii de l'espace est 32. On annule le décalage pour les espaces
    if(tabAscii(i)==32-k)
      tabAscii(i)=tabAscii(i)+k;
    end
    // on doit également introduire l'effet circulaire de la clé ; les lettres qui se retrouvent en dehors de [0-25], il faut les ramener dans l'intervalle, au début de [0-25]
    if(tabAscii(i)<65 & tabAscii(i)<>32)
      tabAscii(i)=tabAscii(i)+26;
    end
  end
  
  mess=ascii(tabAscii);
endfunction



mess="LE FRERE DE ZOE Y VA AUSSI AVEC XAVIER"
cle=3
disp('*****  Codage - Décodage du chiffre de César  *****')
disp('on code :');
ch=Cesar(cle,mess)

disp(ch);
disp('maintenant on décode :');
messDechiffre=DecodeCesar(cle,ch)

disp(messDechiffre)

disp('***************************************************')



toto=1
tabFrecFR=[8.40 1.06 3.03 4.18 17.26 1.12 1.27 0.92 7.34 0.31 0.05 6.1 2.96 7.13 5.26 3.01 0.99 6.55 8.08 7.07 5.74 1.32 0.04 0.45 0.3 0.12]/100

alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
AsciiAlpha=ascii(alphabet)
//function tab=AnalyseFreq(mess, tabRef)
mess='HIER J AI VU UN BEL OISEAU QUI S EST POSE SUR LA TETE DE XAVIER FRERE DE ZOE'
mess2='JLI CR KIZSLEV SLJKVIZVLIV U LE SLJ HLZ KIREJYRSLKRZK MVIJ LE SLK GVL SLTFCZHLV UVJ SLIVRLTIRKVJ RSLKZJ LE SLICVJHLV WLERDSLCV R CR SLTTLCV CFZE UL SLJKV VK RL XZSLJ JREJ SLIRE WZK SILJHLVDVEK UL XIRSLXV TFEKIV LE SLIXIRMV HLZ CV SFLJTLCRZK SLKFI P R UV C RSLJ J RKKIZSLREK LE KRSLIVK ZC J P TLCSLKR KVC LE FLIJ UREJ LEV TRDSLJV SLCKVIZVLIVDVEK VE LE TFETZCZRSLCV ZC SLKZERZK TVKKV JKZSLCRKZFE SLJV TV XCFSLCVLO SLKFE SLTYV DRC KFE SLIEFLJ'

cle=9;
ch=Cesar(cle,mess)
disp(ch);

function cle=analyseFrequentielle(ch,tabFrecFR)
  tabAscii=ascii(ch)// on transforme en ascii
  tabOccurences=nfreq(tabAscii)// fonction scilab qui calcule les occurences des éléments d'un tableau
  indices=find(tabOccurences(:,1)<> 32);// on cherche à éliminer l'espace; pour cela on repère les indices de tous les élements qui ne sont pas l'espace

  tabFreq=tabOccurences(indices,2)'/length(tabAscii);  //On transforme les occurences en fréquences  et on élimine l espace aussi
  tabA=tabOccurences(indices,1)';// on récupère la table des caractères présents dans le message
  
// on complète la table des caractères par ceux qui manquent, en leur attribuant une fréquence nulle
  for i=1:26
    test=find(tabA==AsciiAlpha(i))
    if(length(test)==0)
      tabA=[tabA AsciiAlpha(i)];
      tabFreq=[tabFreq 0];
    end
  end

  [m,indice]=max(tabFreq);// on récupère l'indice  du plus fréquent element du message
  [mRef, indiceRef]=max(tabFrecFR);// indice du plus frequent element de l'alphabet en français
  cle=-AsciiAlpha(indiceRef)+tabA(indice); // l'écart entre les codes ascii des deux plus fréquents représente le décalage 
  disp(cle)
endfunction

k=analyseFrequentielle(ch,tabFrecFR);
messDechiffre=DecodeCesar(k,ch)
disp(k)
disp(messDechiffre)  