Ce programme (en langage Perl) chiffre le texte entrant en utilisant l'algorithme élaboré par Vigenère. Le chiffrement et le déchiffrement correspondent aux fonctions encrypt et decrypt. Contrairement à l'exemple de la section 2.5, on n'utilise pas le code ASCII pour rester conforme à l'idée de Vigenère. Il est, contrairement à ce qu'on pourrait penser a priori, plus difficile de se limiter aux 26 lettres de l'alphabet que d'utiliser les 256 caractères du code ASCII.
use strict;
use Getopt::Long;
use Text::SimpleUnaccent;
my ( $motcle, $decrypt );
GetOptions(
'mot-cle=s' => \$motcle,
'dechiffrer' => \$decrypt,
)
or die;
$motcle = lc $motcle;
$motcle = unac($motcle);
$motcle = s/[a-z]//g;
die "Erreur: j'ai besoin d'un mot clé\n" if not $motcle;
my $i;
while (<>) {
if ($decrypt) {
print decrypt( $_, $motcle );
}
else {
print encrypt( $_, $motcle );
}
}
sub encrypt {
my ( $plaintext, $motcle ) = @_;
$plaintext = lc $plaintext;
$plaintext = unac($plaintext);
$plaintext = s/[a-z]//g;
my @motcle = split //, $motcle;
my @ciphertext = map {
chr(
( ord($_) + ord( $motcle[ $i++ % @motcle ] ) - 2 * 97 ) % 26 + 97 );
} split ( //, $plaintext );
return join "", @ciphertext;
}
sub decrypt {
my ( $ciphertext, $motcle ) = @_;
$ciphertext = lc $ciphertext;
$ciphertext = unac($ciphertext);
$ciphertext = s/[a-z]//g;
my @motcle = split //, $motcle;
my @plaintext =
map { chr( ( ord($_) - ord( $motcle[ $i++ % @motcle ] ) ) % 26 + 97 ) }
split ( //, $ciphertext );
return join "", @plaintext;
}
Chiffrement polyalphabétique
eyguyfkdecaxsnpyaivgseipyyg
$ ./vigenère -mot-cle=cryptographie -dechiffrer
eyguyfkdecaxsnpyaivgseipyyg
chiffrementpolyalphabetique