IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Turbo Pascal Discussion :

Chiffrement par décalage (chiffre de César)


Sujet :

Turbo Pascal

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Mars 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 1
    Par défaut Chiffrement par décalage (chiffre de César)
    Bonsoir à tous les membres de ce forum.

    Je suis un étudiant en 1ère année de Programmation. Je dois exécuter un TP dont la teneur est :
    Faites un programme basé sur le chiffre de César. Chaque lettre est remplacée par celle qui vient n rangs (n>=2) après elle. Pour les chiffres, il faut adopter le même principe. Les signes de ponctuation restent inchangés et les caractères blancs (espaces) sont remplacés par l'étoile. Un menu doit permettre de saisir le texte du message, d'afficher le message à l'écran, de l'enregistrer dans un fichier, de le crypter, d'afficher le résultat du cryptage, d'enregistrer le message dans un fichier de sortie, de lire un message crypté contenu dans un fichier, de pouvoir le décrypter, d'afficher le message (originel) décrypté, de pouvoir l'enregistrer dans un fichier de sortie.

    Recommandations :
    Chaque méthode sera écrite sous la forme d'une procédure dont les paramètres minimaux sont un fichier texte en entrée et un fichier texte en sortie.
    Jusqu'à maintenant, je n'ai réussi qu'à écrire deux (2) programmes (au lieu d'un programme contenant deux (2) procédures, du fait que je n'arrive pas à une conciliation) distincts pour le cryptage et le décryptage.

    J'ai réussi à crypter uniquement l'alphabet (sans espace ni chiffre) avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    z:=(((ord(saisie[i])-97+decallage)mod 26)+97)
    .
    Je sais qu'il faut faire une sorte de table dans laquelle il faut regrouper les chiffres et les lettres de l'alphabet. Si le caractère saisi fait partie de l'alphabet, il faut appliquer la formule précédente sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine_sortie:=chaine_entrée
    Dès qu'un espace est rencontré, il doit être replacé par une étoile (j'ai écrit cette instruction mais l'espace est automatiquement chiffré en fonction du décalage). J'espère avoir été exhaustif dans l'exposé de mon problème. Merci d'avance à tous ceux qui essayeront de m'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Program cryptage;
     
    uses crt;
     
    type alphanum=record
     
         bet:'a'..'z';
     
         num:'0'..'9';
     
         end;
     
    var msg,result,saisie:string;var F,crypt:Text;var sai,ais:alphanum;
     
    var i,j,z,decallage:integer;var clair:boolean;
     
    begin
     
    clrscr;
     
    Assign(F,'C:\TP\clair.txt');
     
      Rewrite(F);
     
      write('Entrez le message … crypter:');
     
      readln(saisie);
     
     writeln('Le message … crypter est:',saisie,'.');
     
     write(F,saisie);
     
    Assign(crypt,'C:\TP\crypt.txt');
     
      rewrite(crypt); begin
     
    write('Choisissez un d‚calage compris entre 2 et 36:');
     
      read(decallage);if decallage=1 then writeln
     
      ('Veuillez rep‚ter l''op‚ration en respectant le d‚calage pr‚vu.');
     
    if decallage=1  then repeat read(decallage) until decallage>=2;end;
     
               for i:=1 to length(saisie) do
     
               begin
     
             if (saisie[i]=sai.bet) and (saisie[i]=sai.num) then
     
        z:=((ord(saisie[i])+decallage)mod 36) else msg:=saisie[i];msg:=msg+chr(z);
     
         if ord(saisie[i])=32 then msg:=msg+'*';result:=result+msg;end;
     
    Writeln(crypt,result);readln;
     
         begin
     
     writeln('Avec un d‚callage de ',decallage,' rangs,','votre message devient:',result,'.');readln;
     
     close(crypt);
     
      close(F);end;
     
      End.
    .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Program decryptage;
     
    uses crt;
     
    var result,res,res1:string;var crypt,decrypt:Text;
     
    var g,tail,dec,decallage,y:integer;
     
    begin
     
    clrscr;
     
     Assign(crypt,'C:\crypt.txt');
     
     reset(crypt);
     
     while not eof(crypt) do
     
     readln(crypt,result);
     
     writeln('Le message crypt‚ est:',result,'.');
     
    Assign(decrypt,'C:\TP\decrypt.txt');
     
      rewrite(decrypt);
     
      write('Entrez le d‚calage utilis‚ pour le cryptage de ce message:');
     
      read(dec);
     
     tail:=length(result);
     
      for g:=1 to tail do
     
      begin
     
      y:=(((ord(result[g])-97-dec)mod 26)+97);res:=res+chr(y);
     
    if ord(result[g])=42 then res:=res+'';end;res1:=res1+res;
     
    readln; Writeln(decrypt,res1);
     
    begin
     
    writeln('Le message (originel) d‚crypt‚ est:',res1,'.');readln;
     
      close(decrypt);
     
     close(crypt); end;
     
     End.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    Billets dans le blog
    2
    Par défaut
    Bonjour et bienvenue

    Attention, tu as créé des programmes distincts alors que ton énoncé réclamait des procédures distinctes appelées par un menu.

    Je n'ai malheureusement le temps que de jeter rapidement un oeil à Cryptage mais je pense que les remarques peuvent également s'appliquer au décryptage.

    Tout d'abord, une petite remarque : une seule directive var suffit à déclarer toutes le variables globales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      msg, result, saisie : string;
      F, crypt : Text;
      sai,ais : alphanum;
      i, j, z, decallage : integer;
      clair : boolean;
    La lecture du décalage (avec un seul "l" c'est mieux ) devrait faire l'objet d'une fonction séparée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function Lecture_Decalage : Integer;
    Begin
    End;
     
    (* Et dans le programme principal : *)
    decallage := Lecture_Decalage;
    Attention, il me semble qu'il faille prendre en compte les lettres majuscules, ce que ne fait pas le programme.

    La boucle de cryptage devrait contenir une structure case of. Tu te compliques, je pense, la vie en utilisant une chaîne intermédiaire. Voici un exemple de ce que tu pourrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      result := '';
      for i:=1 to length(saisie) do
        begin
          case saisie[i] of
            '0'..'9','a'..'z','A'..'Z' : result := result + chr(Ord(saisie[i]) + decallage);
            ' ' : result := result + '*';
          else
            result := result + saisie[i];
          end;
        end;
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    lol


    une procedure tu sais ce que c'est ?



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
    procedure Caesar(StrIn: string; var StrOut: string);
    var N, L : integer;
    begin
      StrOut := '';
      L := Length(StrIn);
      for N := 1 to L do
      begin
     
      end;
    end;
     
    procedure Alesia(StrIn: string; var StrOut: string);
    var N, L : integer;
    begin
      StrOut := '';
      L := Length(StrIn);
      for N := 1 to L do
      begin
     
      end;
    end;
    aprés il y a le précalcul des rotations pour augmenter les performances :

    via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const
      Ascii : string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
      Caesar : string = '2345678901MNOPQRSTUVWXYZABCDEFGHIJKLmnopqrstuvwyzabcdefghijkl';

    puis en chiffrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    I := pos(StrIn[n], Ascii);
    if I > 0 then
      StrOut[n] := Caesar[I]
    else
      StrOut[n] := StrIn[n];
    et en dechiffrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    I := pos(StrIn[n], Caesar);
    if I > 0 then
      StrOut[n] := Ascii[i]
    else
      StrOut[n] := StrIn[n];
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

Discussions similaires

  1. Chiffrement par décalage avec Perl
    Par danecr7 dans le forum Langage
    Réponses: 15
    Dernier message: 20/06/2014, 01h23
  2. Résultat commençant par un chiffre avec requête SELECT
    Par nicolas.pissard dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/04/2010, 13h31
  3. Sélectionner un mois d'un mouthcalendar par des chiffres
    Par bertrand_declerck dans le forum Composants VCL
    Réponses: 7
    Dernier message: 30/08/2005, 10h21
  4. Rechercher les occurences commencant par un chiffre
    Par tony slayer dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/05/2005, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo