2 votes

En Perl, en utilisant RC4, je ne parviens pas à récupérer le texte chiffré

J'ai un fichier avec des informations d'identification chiffrées avec RC4, Le morceau de code chargé d'écrire de telles informations d'identification dans le fichier est le suivant :

sub fonctionBidon() {
    # Choses inutiles pour le problème
    # ...
    my $dbHost = "localhost";
    my $passphrase = "123"; # À des fins d'exemple, la logique est différente.
    my $cipher = Crypt::RC4->new($passphrase);
    return unpack('H*',$cipher->RC4($dbHost));
}

Ainsi, ce morceau de code renverrait quelque chose comme : 3F9FDCE3891C6B8851 mais si j'essaie le suivant :

sub uneAutreFonctionBidon() {
    my $texteChiffré = &fonctionBidon();
    my $passphrase = "123";
    my $cipher = Crypt::RC4->new($passphrase);
    print $cipher->RC4(pack('H*',$texteChiffré));
}

Je m'attends à voir localhost mais au lieu de cela, j'obtiens une série d'octets, comment puis-je récupérer le texte original ?

J'ai déjà vérifié avec un déchiffreur RC4 en ligne, avec mon passphrase et ma chaîne hex encodée et le déchiffreur RC4 en ligne renvoie bien localhost donc je suis certain que la chaîne chiffrée est correcte.

Merci !

P.S. : L'exemple ci-dessus fonctionne dans un environnement isolé, mais dans mon script cela ne fonctionne pas. Je ne peux pas obtenir le texte original.

0voto

AlanChavez Points 1393

Si quelqu'un rencontre à nouveau ceci :

Si vous avez quelque chose comme :


TEST.PL


 #!/usr/bin/perl
 use strict;
 use warnings;
 use Crypt::RC4;

 my $cipher = Crypt::RC4->new("passphrase123");
 print unpack('H*',$cipher->RC4("encrypt-me"))."\n";
 print unpack('H*',$cipher->RC4("encrypt-me"))."\n";

Vous remarquerez que vous obtiendrez deux chaînes encodées différentes :

 ./test.pl
 25d2aa557cccc3951074
 1e87a5db7830a0b1cabd

Pour éviter ce comportement, j'ai fait :

undef $cipher

Juste avant d'essayer de chiffrer une autre chaîne, et ensuite j'ai réinstancié l'objet.

Si vous essayez ceci :

 my $cipher = Crypt::RC4->new("passphrase123");
 print unpack('H*',$cipher->RC4("encrypt-me"))."\n";
 undef($cipher);
 $cipher = Crypt::RC4->new("passphrase123");
 print unpack('H*',$cipher->RC4("encrypt-me"))."\n";

Vous obtiendrez la même chaîne :

./test.pl
25d2aa557cccc3951074
25d2aa557cccc3951074

ceci peut également être enveloppé dans un sous-procédure, pour éviter de définir et d'annuler l'objet encore et encore.

sub encryptString()
{
    my ($string,$passphrase) = @_;
    my $cipher = Crypt::RC4->new($passphrase);
    return unpack('H*',$cipher->RC4($string));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X