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

Langage Perl Discussion :

Chiffrement par décalage avec Perl


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 4
    Par défaut Chiffrement par décalage avec Perl
    Salut à tous je suis etudiant en sécurité informatique.
    Je me tournes vers vous et sollicite votre aide parce que je suis bloqué dans un exercice où je dois faire un chiffrement par decalage avec Perl.
    En effet il faut créer un programme dans lequel on demande à un utilisateur de rentrer le message à chiffrer puis puis un nombre compris entre 1 et 25 pour faire le decalage par ex: il entre hello puis 2 le programme doit renvoyer JGNNQ. Donc chaque lettre du texte est décalée suivant sa position dans l'alphabet 2 fois.
    À votre disposition si la question n'est pas claire.
    En esperant que quelqu'un ait une solution.
    Merci d'avance pour vos réponses.

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    La fonction ord donne la valeur ascii d'une lettre et la fonction chr donne la lettre correspondant à une valeur ascii. Il suffit de les combiner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $perl -e 'my $c = "hello"; my @a = split "", $c; $_ = chr(ord($_)+2) for @a; $d = join "", @a; print "$d\n"'
    jgnnq

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 4
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    La fonction ord donne la valeur ascii d'une lettre et la fonction chr donne la lettre correspondant à une valeur ascii. Il suffit de les combiner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $perl -e 'my $c = "hello"; my @a = split "", $c; $_ = chr(ord($_)+2) for @a; $d = join "", @a; print "$d\n"'
    jgnnq
    Merci pour la reponse.
    Je voulais utiliser ORD mais sans penser a utiliser le SPLIT c'est pourquoi je n'avancais pas encore merci.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    La fonction ord donne la valeur ascii d'une lettre et la fonction chr donne la lettre correspondant à une valeur ascii. Il suffit de les combiner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $perl -e 'my $c = "hello"; my @a = split "", $c; $_ = chr(ord($_)+2) for @a; $d = join "", @a; print "$d\n"'
    jgnnq
    j'avais pas vu ta réponse mais j'aime l'idée de passer par le code ascii
    j'y aurais pas pensé mais très malin/rapide

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Par défaut
    une solution vraiment pas la plus jolie pourrais être

    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
    my @alphabet = ('a' .. 'z');
    my $liste = "@alphabet";
    $liste =~ s/\s+//g;
     
    # Variable en dure mais faire la recup de ce que tape l'utilisateur
    my $texte = "azerty";        # Attention il faudra verifier qu'il n'y a pas d'espace, de caracteres speciaux ...
    my $decalage = 3;
    my $texte_modif = '';
     
    my @Liste_lettres = split( '', $texte);
    foreach my $lettre ( @Liste_lettres ){
     
            my $index = index($liste, $lettre) + $decalage;
            $index -= 26 if ( $index > 25 );
         # insertion de la nouvelle lettre dans le nouveau texte
            $texte_modif .= substr($liste,$index,1);
    }
    print "Texte initiale: $texte\n";
    print "Texte final   : $texte_modif\n";
    Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    -bash-3.00$ perl test.pl
    Texte initiale: azerty
    Texte final   : dchuwb
    Attention, solution à améliorer car "my @alphabet = ('a' .. 'z');" ne fonctionne pas avec le use strict et il n'est pas très bien de l'enlever

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 4
    Par défaut
    Citation Envoyé par 6ril23 Voir le message
    une solution vraiment pas la plus jolie pourrais être

    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
    my @alphabet = ('a' .. 'z');
    my $liste = "@alphabet";
    $liste =~ s/\s+//g;
     
    # Variable en dure mais faire la recup de ce que tape l'utilisateur
    my $texte = "azerty";        # Attention il faudra verifier qu'il n'y a pas d'espace, de caracteres speciaux ...
    my $decalage = 3;
    my $texte_modif = '';
     
    my @Liste_lettres = split( '', $texte);
    foreach my $lettre ( @Liste_lettres ){
     
            my $index = index($liste, $lettre) + $decalage;
            $index -= 26 if ( $index > 25 );
         # insertion de la nouvelle lettre dans le nouveau texte
            $texte_modif .= substr($liste,$index,1);
    }
    print "Texte initiale: $texte\n";
    print "Texte final   : $texte_modif\n";
    Résultat:
    [CODE]-bash-3.00$ perl test.pl
    Attention, solution à améliorer car "my @alphabet = ('a' .. 'z');" ne fonctionne pas avec le use strict et il n'est pas très bien de l'enlever
    formidable boulot. je vais tester en modifiant pour recuperer le text et le decalage par l'utilisateur.
    vraiment merci beaucoup pour l'aide.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 4
    Par défaut
    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
     
    use strict;
    use warnings;
    my @alphabet = ('a' .. 'z');
    my $liste = "@alphabet";
    $liste =~ s/\s+//g;
     
    # Variable en dure mais faire la recup de ce que tape l'utilisateur
    print("Entrer un mot pas d'espaces ou caracteres speciaux please: ");
    chomp(my $texte = <STDIN>);
    print("Entrer le nombre de decalage: ");
    chomp(my $decalage =<STDIN>);
    my $texte_modif = '';
     
    my @Liste_lettres = split( '', $texte);
    foreach my $lettre ( @Liste_lettres ){
     
            my $index = index($liste, $lettre) + $decalage;
            $index -= 26 if ( $index > 25 );
         # insertion de la nouvelle lettre dans le nouveau texte
            $texte_modif .= substr($liste,$index,1);
    }
    print "Vous avez tapez : $texte\n";
    my $ch = uc($texte_modif);
    print "Le resultat du chiffrement par decalage de $decalage donne : $ch\n";
    merci les amis voici le code final.

  8. #8
    Invité de passage
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2012
    Messages : 1
    Par défaut amelioration
    Citation Envoyé par danecr7 Voir le message
    formidable boulot. je vais tester en modifiant pour recuperer le text et le decalage par l'utilisateur.
    vraiment merci beaucoup pour l'aide.
    on prend en compte le modulo...on obtient quelque chose de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    print "Quel est votre texte ? ";
    chomp($c = <STDIN>);
    print "entrer le decalage? ";
    chomp($decalage = <STDIN>);
    my @a =split("", $c);
    $_ = chr(((ord($_)-97+$decalage)%26)+97) 
    for @a;
     $d = join("", @a);
     print "$d\n"

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    S'il faut revenir au début de l'alphabet quand on dépasse z, je ferais personnellement plutôt ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    perl -e 'my $c = "azerty"; my @a = split "", $c; $_ = chr(ord($_)+2 > 122 ? ord($_)-24 : ord($_)+2) for @a;
    cbgtva
    ou encore, un peu plus long maissans douteun peu plus rapide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $perl -e  'my $c = "azerty"; my @a = split "", $c; $ord = ord($_) + 2 and $_ = chr($ord > 122? $ord - 26: $ord) for @a ; print join "", @a, "\n";'
    cbgtva

  10. #10
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Si le texte à chiffrer est long, alors le processus consistant à découper le texte en lettres individuelles, à les convertir puis à les recoller sera très lent.

    Il existe en Perl une fonction très pratique et extraordinairement rapide pour ce genre de choses, tr///. Par exemple, pour faire un décalage de 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ perl -e '$c = "azerty"; $c =~ tr/a-z/c-zab/; print $c;'
    cbgtva
    Voici l'exécution d'un encodage en rot13 (décalage de 13, pratique car il a propriété que si on le lance une seconde fois, le décalage devient 26, donc 0, autrement dit le même programme sert à la fois a coder et à décoder) d'une traduction française de la bible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ time perl -pe 'tr/A-Za-z/N-ZA-Mn-za-m/' Bible_Second.txt > Bible_crypted.txt
     
    real    0m0.159s
    user    0m0.062s
    sys     0m0.062s
    Le mini programme uni-ligne ci-dessus a chiffré le texte entier de la Bible (ancien plus nouveau testaments, plus de 400 kilo-octets) en moins de 0,16 seconde!

    Voici le début du fichier résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Trarfr 1
    Nh pbzzraprzrag, Qvrh pern yrf pvrhk rg yn greer.
    Yn greer rgnvg vasbezr rg ivqr: vy l ninvg qrf graroerf n yn fhesnpr qr y'norzr, rg y'rfcevg qr Qvrh fr zbhinvg nh-qrffhf qrf rnhk.
    Le problème est que cette commande ne permet pas de gérer un décalage susceptible changer. Du coup, je n'en ai pas parlé dans mes posts précédents car elle me paraissait inutilisable.

    Mais en y repensant dans les transports en commun rentrant du boulot ce soir, je me suis soudain aperçu qu'il y avait moyen de s'en servir, à condition de construire dynamiquement la commande à exécuter en fonction du décalage voulu. L'astuce consiste ensuite à l'exécuter à l'aide de la fonction eval, qui compile et exécute une chaîne de caractère comme du code Perl (à condition que ce soit du code valide).

    Voici le programme:

    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
    use strict;
    use warnings;
     
    my $decalage = shift;
    chomp $decalage;
    $decalage = 13 unless defined $decalage; # valeur par défaut si l'utilisateur a omis de passer le décalage en paramètre
    my $phrase = shift;
    $phrase = "voyez le brick geant que j'examine pres du wharf" unless defined $phrase;
     
    my $let_a = chr(ord("a") + $decalage);
    my $last_let = chr(ord("a") + $decalage - 1);
     
    my $command = '$phrase =~ ' . "tr/a-z/${let_a}-za-$last_let/;";
    print "$command\n"; # affiche la commande qui sera exécutée
    eval ($command);
    print "$phrase\n";
    Voici un exemple d'exécution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ perl chiffrement.pl 3
    $phrase =~ tr/a-z/d-za-c/;
    yrbhc oh eulfn jhdqw txh m'hadplqh suhv gx zkdui
    Et un exemple de rot13, montrant comment le même programme chiffre et déchiffre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ perl chiffrement.pl 13
    $phrase =~ tr/a-z/n-za-m/;
    iblrm yr oevpx trnag dhr w'rknzvar cerf qh junes
     
    ~
    $ perl chiffrement.pl 13 "iblrm yr oevpx trnag dhr w'rknzvar cerf qh junes"
    $phrase =~ tr/a-z/n-za-m/;
    voyez le brick geant que j'examine pres du wharf
    Je pense que ça donne une bonne idée. Pour un programme réel, il faudrait au minimum ajouter le traitement des majuscules et des lettres accentuées.

    Je reste à disposition s'il y a des questions.

Discussions similaires

  1. [AC-2010] Chiffrement par blocs pas compatible avec le verrouillage des lignes
    Par Daejung dans le forum Sécurité
    Réponses: 7
    Dernier message: 18/02/2015, 22h45
  2. Connexion a un site Web par POST avec perl ?
    Par SmoZy dans le forum Langage
    Réponses: 6
    Dernier message: 30/06/2014, 17h49
  3. [Turbo Pascal] Chiffrement par décalage (chiffre de César)
    Par tessafadel10 dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 14/06/2010, 22h43
  4. Réponses: 2
    Dernier message: 08/09/2006, 11h04

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