J'ai un programme crypté avec Blowfish dans un fichier et un second programme perl qui demande une phrase de passe utilisée pour le décrypter en une chaîne de caractères. J'aimerais ne jamais avoir à écrire la source décryptée sur le disque dur, bien que l'avoir en mémoire ne soit pas vraiment un problème puisque ceux qui exécutent le programme connaissent déjà la source. Je pensais utiliser eval mais le programme que je dois exécuter a beaucoup d'entrées/sorties en utilisant des Curses et d'autres choses, donc eval ne fonctionnera pas car il ne renvoie que la dernière valeur... Quelqu'un a-t-il une idée de la façon dont cela pourrait être réalisé ?
Réponses
Trop de publicités?Vous pouvez utiliser un @INC
pour effectuer le décryptage. Ensuite, vous pouvez simplement require
o use
le programme crypté. Par exemple,
# loader.pl
use Crypt::Rot13;
use File::Spec;
sub decrypt_line {
if ($_ ne '') {
my ($self, $state) = @_;
my ($crypt, $key) = @$state;
$crypt->charge($_);
($_) = $crypt->rot13($key);
return 1;
}
}
sub load_crypt {
my ($self, $filename) = @_;
print "Key?\n";
chomp(my $key = <STDIN>);
for my $prefix (@INC) {
open my $fh, '<', File::Spec->catfile($prefix, "$filename.r13") or next;
return ($fh, \&decrypt_line, [Crypt::Rot13->new(), $key]);
}
}
BEGIN {
unshift @INC, \&load_crypt;
}
require 'hello.pl';
# hello.pl.r13
cevag "Uryyb, jbeyq!\a";
$ **perl loader.pl**
Key?
**13**
Hello, world!
Il n'y a aucune raison eval
ne fonctionnera pas pour ce que vous décrivez. Bien qu'il ne renvoie qu'une seule valeur, cela n'empêche pas le code évalué d'interagir avec le terminal. Elle n'est généralement pas utilisée de cette façon, mais votre cas d'utilisation est une raison légitime pour utiliser la chaîne de caractères. eval
. (Notez que vous pouvez toujours vous retrouver avec le code source écrit dans votre fichier swap).