{************************************************
                 Hugo Eti‚vant
     http://www.multimania.com/cyberzoide/
      e-mail : cyberzoide@multimania.com
      (pour une aide en Turbo Pascal 7.0)
*************************************************}

program cryptographie; {nom du programme}
uses crt,dos;          {unit‚s utilis‚e}
var s,clef,source,destination:string;  {d‚claration de variables}
    l,i,j,u,choix,iclef:integer;
    f,h:text;
{D‚tail des variables :
s               : chaŒne de caractŠres correspondant … une mˆme ligne
                  des 2 fichiers
clef            : clef secrŠte
source          : nom et chemin du fichier source
destination     : nom et chemin du fichier destination
l,i,j,u,choix   : variables temporaires
iclef           : taille de la clef+1, utile pour le modulo
f               : fichier source
h               : fichier destination}


procedure crypt;   {procedure pour l'encodage}
begin
while not eof(f) do  {boucle tant que le pointeur n'a pas atteint la fin
                      du fichier texte}
    begin
    readln(f,s);   {lit la ligne et en fait une variable 'string'}
    for i:=1 to length(s) do  {boucle pour chaque caractŠre de la ligne}
        begin
        if int(i/iclef)=(i/iclef) then j:=1; {modulo taille de la clef+1}
        u:=ord(s[i])+ord(clef[j]);          {algorythme de cryptage, simple!}
        if u>255 then dec(u,256);          {modulo taille de la table ASCII}
        s[i]:=chr(u);       {modifie la variable 'string'}
        end;
    writeln(h,s);       {‚crit la variable 'string' modifi‚e, dans
                        le fichier destination}
    end;
end;

procedure decrypt;     {proc‚dure de d‚cryptage, inverse de la pr‚c‚dente}
begin
while not eof(f) do
    begin
    readln(f,s);
    for i:=1 to length(s) do
        begin
        if int(i/iclef)=(i/iclef) then j:=1;
        u:=ord(s[i])-ord(clef[j]);
        if u<0 then inc(u,256);
        s[i]:=chr(u);
        end;
    writeln(h,s);
    end;
end;

begin
write('Crypter ou d‚crypter ? [1/2] : '); readln(choix); {choix de proc‚dure}
writeln('Entrez le nom et le chemin du fichier source :');
readln(source);         {lecture du nom du fichier source}
writeln('Entrez le nom et le chemin du fichier destination :');
readln(destination);    {lecture du nom du fichier destination}
assign(f,source); {affectation du nom du fichier source … la variable 'f'}
reset(f); {pointage du curseur au d‚but de fichier}
assign(h,destination); {affectation du nom du fichier destination … 'h'}
rewrite(h); {efface le contenu du fichier destination}
write('Entrez votre clef secrŠte : '); readln(clef); {lecture de la clef}
iclef:=length(clef)+1; {lecture de la taille de la clef}
case choix of     {bloc conditionnel, renvoi … l'une des 2 proc‚dures}
     1:crypt;
     2:decrypt;
end;
close(f); close(h);  {fermeture des 2 fichiers : IMPERATIF}
writeln('Termin‚.');
readln;
end.
