Шифр Виженера на Perl
Шифр Виженера является первым изучаемым шифром во всех учебниках по шифрованию, он прост в понимании и реализации, недоступен для простых методов криптоанализа, за счет «размывания» частот появления символов. Криптоанализ позволяет ознакомиться с методом анализа распределения частот в зашифрованном тексте. В общем идеальный учебный пример.
И теперь, когда возникла необходимость повторить, Perl показался самым логичным выбором, во-первых, потому что этот язык предназначен для обработки текстов, а во-вторых, реализации на этом языке, при первом поиске, не нашлось.
Вообще, эта публикация состоялась только потому, что получившийся код оказался коротким и эффективным.
#!/usr/bin/perl
#######################################################
# #
# Шифр Виженера — метод полиалфавитного шифрования #
# буквенного текста с использованием ключевого слова. #
# #
#######################################################
use strict;
my $ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; # Алфавит
my $PASS = "MYTEST"; # Пароль
my $PRIVATE = "MYNAMEISBOBIWASBORN12NOVEMBER1880NOWIAMAGHOST"; # Исходная строка
my $abclen = length $ALPHABET;
my $len = length $PRIVATE;
my $paslen = length $PASS;
my $passstr = ("$PASS" x (int $len/$paslen)).(substr $PASS, 0, $len%$paslen); # Парольная строка
if ((length $PRIVATE) == (length $passstr)) {
print "Plaintext: $PRIVATE\n";
print "Password: $passstr\n";
my @pstr = split(//, $passstr);
# Шифрование
my @str = split(//, $PRIVATE);
my @clip = ();
my $index = 0;
while($index < $len) {
my $pind = index $ALPHABET, $pstr[$index];
my $ind = index $ALPHABET, $str[$index];
my $cind = ($ind + $pind)%$abclen;
push @clip, substr $ALPHABET, $cind, 1;
++$index;
}
print "Ciphertext: ".join("", @clip)."\n" ;
# Дешифрование
@str = ();
$index = 0;
while($index < $len) {
my $pind = index $ALPHABET, $pstr[$index];
my $ind = index $ALPHABET, $clip[$index];
my $str = ($ind - $pind)%$abclen;
push @str, substr $ALPHABET, $str, 1;
++$index;
}
print "Plaintext: ".join "", @str;
}
Plaintext: MYNAMEISBOBIWASBORN12NOVEMBER1880NOWIAMAGHOST
Password: MYTESTMYTESTMYTESTMYTESTMYTESTMYTESTMYTESTMYT
Ciphertext: YM6E4XUGUST18YBF6AZPLR6EQAUI9KKWJR6FUY5EY00GC
Plaintext: MYNAMEISBOBIWASBORN12NOVEMBER1880NOWIAMAGHOST