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

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : juillet 2012
    Messages : 10
    Points : 6
    Points
    6

    Par défaut SHA1 - résultats différents entre script PERL windows et logiciels tiers.

    Bonjour à tous,

    J'utilise PERL 5 dans un environnement Windows 10 avec Strawberry.
    J'ai un petit script qui détermine le SHA1 d'un fichier à l'aide du module Digest::SHA et du code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $sha1 = Digest::SHA->new;
    $sha1->addfile(handle de mon fichier);
    my $somme = $sha1->hexdigest;

    Tout fonctionne parfaitement bien !
    Pour un même contenu de fichier, j'obtiens invariablement la même somme de contrôle.
    Par contre, j'ai voulu vérifié mon résultat en le rapprochant de ceux produits par l'application portable "RapidCRCUnicodePortable" et la fonctionnalité "CRC SHA" du logiciel 7-zip.
    Pour un même fichier, ces deux applications sont en phase et produisent la même valeur SHA1.
    En revanche, le SHA1 généré par mon script PERL est toujours différent hormis un seul cas de figure, celui où le fichier ne contient qu'une seule ligne.
    Le caractère CR (retour chariot) semble perturber mon script, mais je ne comprend pas pourquoi.

    Merci d'avance pour vos lumières.

    Bonne fin de week-end.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    février 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2017
    Messages : 22
    Points : 27
    Points
    27

    Par défaut

    Bonjour bryotin

    Avez vous le même problème avec le module Digest::SHA1 ?

    [EDIT]
    Il serait intéressant d'avoir les éléments du problème:

    - Script perl
    - Fichier problématique ou équivalent
    - Somme de contrôle obtenu par les divers moyens

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : juillet 2012
    Messages : 10
    Points : 6
    Points
    6

    Par défaut

    Merci Puppet_Master !
    Oui, le problème est le même avec Digest::SHA1.
    Voici mon code PERL créant deux fichiers et éditant les SHA1.

    -----------------------------------------------------
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Digest::SHA1;
     
    my $fic1 = "uneligne.txt";
    my $fic2 = "deuxlignes.txt";
    my $fh1;
    my $fh2;
     
    open($fh1, ">$fic1") || die "Erreur E/S:$!\n";
    print $fh1 "azerty";
    close ($fh1);
    open($fh2, ">$fic2") || die "Erreur E/S:$!\n";
    print $fh2 "azerty\nazerty";
    close ($fh2);
     
    open $fh1, $fic1;
    my $sha1 = Digest::SHA1->new;
    $sha1->addfile($fh1);
    my $somme1 = $sha1->hexdigest;
    print "SHA1 fichier une ligne : $somme1\n";
    close $fh1;
     
    open $fh2, $fic2;
    my $sha2 = Digest::SHA1->new;
    $sha2->addfile($fh2);
    my $somme2 = $sha2->hexdigest;
    print "SHA1 fichier 2 lignes  : $somme2\n";
    close $fh2;
    --------------------------------------------------

    Et le résultat de l'exécution de ce script :

    SHA1 fichier une ligne : 9cf95dacd226dcf43da376cdb6cbba7035218921
    SHA1 fichier 2 lignes : 248e51fc941ea0895ede07c7111c983d36391c5f

    ---------------------------------------------------

    Les 2 logiciels dont je parlais (7-zip et RapidCRCUnicodePortable) me donnent les SHA1 suivants :

    SHA1 fichier une ligne : 9cf95dacd226dcf43da376cdb6cbba7035218921
    SHA1 fichier 2 lignes : d5aee516525b311a391bfa2bdee479410b545e46

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    février 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2017
    Messages : 22
    Points : 27
    Points
    27

    Par défaut

    Je suis sous Linux.

    J'ai testé le script. Comme prévu, il me retourne la même chose que vous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     $ perl test.pl 
    SHA1 fichier une ligne : 9cf95dacd226dcf43da376cdb6cbba7035218921
    SHA1 fichier 2 lignes  : 248e51fc941ea0895ede07c7111c983d36391c5f
    J'ai ensuite fait un sha1sum sur les deux fichiers créés par le script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     $ sha1sum *.txt
    248e51fc941ea0895ede07c7111c983d36391c5f  deuxlignes.txt
    9cf95dacd226dcf43da376cdb6cbba7035218921  uneligne.txt
    Même résultat.

    Je suis allé ensuite sur le site dcode.fr qui me retourne les mêmes sommes de contrôle.

    Nom : Capture du 2019-03-10 23-00-36.png
Affichages : 31
Taille : 102,0 Ko
    Nom : Capture du 2019-03-10 23-41-40.png
Affichages : 32
Taille : 100,5 Ko

    Pour obtenir, la somme de contrôle 'd5aee516525b311a391bfa2bdee479410b545e46' il faut modifier le code comme suit:

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Digest::SHA1;
     
    my $fic1 = "uneligne.txt";
    my $fic2 = "deuxlignes.txt";
    my $fh1;
    my $fh2;
     
    open($fh1, ">$fic1") || die "Erreur E/S:$!\n";
    print $fh1 "azerty";
    close ($fh1);
    open($fh2, ">$fic2") || die "Erreur E/S:$!\n";
    print $fh2 "azerty\r\nazerty";
    close ($fh2);
     
    open $fh1, $fic1;
    my $sha1 = Digest::SHA1->new;
    $sha1->addfile($fh1);
    my $somme1 = $sha1->hexdigest;
    print "SHA1 fichier une ligne : $somme1\n";
    close $fh1;
     
    open $fh2, $fic2;
    my $sha2 = Digest::SHA1->new;
    $sha2->addfile($fh2);
    my $somme2 = $sha2->hexdigest;
    print "SHA1 fichier 2 lignes  : $somme2\n";
    close $fh2;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ perl test.pl 
    SHA1 fichier une ligne : 9cf95dacd226dcf43da376cdb6cbba7035218921
    SHA1 fichier 2 lignes  : d5aee516525b311a391bfa2bdee479410b545e46
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ sha1sum *.txt
    d5aee516525b311a391bfa2bdee479410b545e46  deuxlignes.txt
    9cf95dacd226dcf43da376cdb6cbba7035218921  uneligne.txt
    Donc la différence vient de la fin de ligne standard du système d'exploitation:

    pour info:
    \n : Linux
    \r : O$X
    \r\n : Window$

    Votre intuition était la bonne.

    [EDIT]
    Il y a 1000 façons d’écrire un même script Perl, voici une variante de votre script:
    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
    use Modern::Perl;
    use Digest::SHA1;
     
    my $file1 = 'une_ligne.txt';
    my $file2 = 'deux_lignes.txt';
     
    say sha1( wfile( $file1, 'azerty' )), ' '.$file1;
    say sha1( wfile( $file2, 'azerty', 'azerty' )), ' '.$file2;
     
    # fonction ouverture -> ecriture -> fermeture
    # retourne le handle en lecture du fichier
    sub wfile
    {
        my $f  = shift;
        my @t  = @_;
        my $el = "\r\n";
        my $lines = join $el, @t;
     
        open my $hf, '>', $f || die $f." Erreur E/S:$!\n";
        print $hf $lines;
        close $hf;
     
        open my $h, '<', $f || die $f." Erreur E/S:$!\n";
        $h;
    }
     
    # returne le SHA1 du handle_file passé en argument
    sub sha1
    {
        my $f    = shift;
        my $sha1 = Digest::SHA1->new();
     
        $sha1->addfile( $f );
        $sha1->hexdigest();
    }
    retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    perl test1.pl 
    9cf95dacd226dcf43da376cdb6cbba7035218921 une_ligne.txt
    d5aee516525b311a391bfa2bdee479410b545e46 deux_lignes.txt

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : juillet 2012
    Messages : 10
    Points : 6
    Points
    6

    Par défaut

    Merci Puppet_Master pour ce long développement.
    Je vais peut-être préciser un peu les choses.
    Mon script cible, si je puis dire, ne génèrera pas de fichiers.
    Il devra, entre autres fonctions, déterminer le SHA1 de tous les fichiers présents dans une arborescence windows.
    J'ai trouvé plus simple de déposer sur ce site quelques lignes de code illustrant mon problème et intégrant la génération de fichiers. Peut-être ai-je eu tort de procéder ainsi...
    Cela étant, je viens de me rendre compte, que les fichiers générés par ce code ne sont pas identiques, suivant l'environnement d'exécution. Le "\n" de la commande print file, génère un seul caractère LF (x'0A') sous linux et deux caractères sous windows CR + LF (x'0D0A'). Petit test effectué avec un live cd.
    Les deux logiciels windows cités plus haut, prennent bien l'intégralité des fichiers pour en déterminer la somme de contrôle. Ce qui n'est visiblement pas le cas de mon code PERL s'exécutant dans un environnement windows.
    Tout se passe comme si les séquences de caractères (CRLF) étaient remplacées par le caractère (LF) lors du addfile. D'où un SHA1 différent ! puisque tous les caractères CR sont omis.
    Et je viens finalement de régler mon problème en demandant au script de considérer les fichiers en entrée dans leur intégralité lors des lectures.
    J'ai ajouté le code suivant en début de script :
    Et j'ai enfin les bons SHA1 quelque soit le contenu de mes fichiers !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : juillet 2012
    Messages : 10
    Points : 6
    Points
    6

    Par défaut

    Merci encore Puppet_Master !
    Vous m'avez mis sur la voie en testant mon code côté linux.
    J'ai finalement repris votre fonction de calcul du sha1, en lui passant le nom du fichier à traiter en argument.
    Et c'est à ce niveau et à ce niveau seulement que j'ouvre mon fichier en mode RAW.
    Je n'utilise donc pas la fonction "use" en début de script comme mentionné dans mon message précédent.
    Et ce afin de ne pas affecter d'autres fonctionnalités de mon programme où le mode de lecture par défaut (CRLF) répond mieux au besoin.
    Voici la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sub sha1
    {
        my $filename = shift;
        open (my $fh, "<:raw", $filename)
            or die "Can't open $filename : $!"; 
        my $sha1 = Digest::SHA1->new; 
        $sha1->addfile($fh);
        close $fh;
        $sha1->hexdigest;
    }
    Bonne journée à vous !

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    février 2017
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2017
    Messages : 22
    Points : 27
    Points
    27

    Par défaut

    Ravi d'avoir pu vous aider !

    Topic ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage différent entre apple et windows
    Par lecra dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 28/08/2009, 16h38
  2. [CR XI] résultat différent entre aperçu et viewer
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 20/06/2008, 15h11
  3. [XI]Pb Serialisation différente entre linux et window
    Par lazarel dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 02/07/2007, 14h50
  4. Réponses: 1
    Dernier message: 20/07/2006, 16h21
  5. Résultats différent entre une requête SQL, et la même en VBA
    Par thetaps dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2005, 13h05

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