Шифр Виженера на 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

1С:Предприятие

Самый большой опыт работы был накоплен при внедрении программных продуктов от компании "1С".
Подробнее...

PALO

Этот продукт мы включили специально для тех заказчиков, которые решили организовать финансовый учет, на своем предприятии, либо ведут его в таблицах MS Excel.
Подробнее...

Профессионалам

Информационные материалы содержащие справочную информацию или полезные сведения для повышения квалификации.
Подробнее...