Вот ещё нашёл на винте небольшой рабочий пример. Давно, как-то писал.
| Код | #!C:/Perl/bin/Perl.exe #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # Author: Denis Korobov # # E-mail: [email protected] # # Copyright: All rights fucked up. ;) # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# use Digest::MD5; use Crypt::CBC; use Crypt::Blowfish;
my $self = {}; $self->{md5} = Digest::MD5->new();
print "X" x 79, "\n\n"; print win_to_dos("Привет! Вас приветствует программа шифрования данных.") . "\n"; print win_to_dos("Следуйте указаниям программы и будет вам счастье. ;))") . "\n\n"; print "X" x 79, "\n\n"; while ( 1 ) { print win_to_dos("Укажите путь к файлу с сообщением: "); chomp( $self->{file} = <STDIN> ); if ( $self->{file} =~ /^\s*$/ ) { print win_to_dos("Ошибка: вы не указали путь к файлу.") . "\n"; } elsif ( !-e $self->{file} ) { print win_to_dos("Ошибка: файл '" . $self->{file} . "' не существует.") . "\n"; } else { last; } }
print "x" x 79, "\n\n"; while ( 1 ) { print win_to_dos("Укажите действие:\ncrypt - шифровка\ndecrypt - расшифровка\n"); chomp( $self->{action} = lc( <STDIN> ) ); if ( $self->{action} !~ /^(?:de)?crypt$/i ) { print win_to_dos("Не верно задано действие.") . "\n"; } else { last; } }
print "x" x 79, "\n\n"; while ( 1 ) { print win_to_dos("Укажите ключ"); print win_to_dos(" (можете оставить пустым, программа сделает это за вас)") if $self->{action} eq "crypt";; print ":\n"; chomp($self->{key} = <STDIN>); if (($self->{action} eq "decrypt") and !$self->{key}) { print win_to_dos("Вы не указали ключ, вы можете это делать только для шифрования, но не обратного действия.") . "\n"; next; } elsif (($self->{action} eq "crypt") and !$self->{key}) { $self->{key} = keyGenerator(10); } last; }
$self->{cbc} = Crypt::CBC->new($self->{key}, "Blowfish");
$self->{filename} = (split(/\\|\/|\:/, $self->{file}))[-1];
open(R, "<" . $self->{file}) or die win_to_dos("Не удалось открыть файл для чтения: $!\n"); my @data = <R>; close(R) or die win_to_dos("Не удалось закрыть файл: $!\n"); $self->{file} =~ s/$self->{filename}$/$self->{action} . "_" . $self->{filename}/e;
open(W, ">" . $self->{file}) or die win_to_dos("Не удалось открыть файл для записи: $!\n"); flock(W, 2);
if ( $self->{action} eq "crypt" ) { print W encoder(@data); } else { print W decoder(@data); }
close( W ) or die win_to_dos("Не удалось закрыть файл: $!\n");
print "=" x 79, "\n"; if ( $self->{action} eq "crypt" ) { print win_to_dos("Зашифрованное данные сохранены в файле '" . $self->{file} . "'.") . "\n"; print win_to_dos("ВНИМАНИЕ! Для того, что бы человек смог прочесть зашифрованные данные,") . "\n"; print win_to_dos("вы должны передать ему следующий ключь: " . $self->{key} . ".") . "\n"; print win_to_dos("Иначе он не будет иметь возможности, прочесть ваше твоерение. ;)") . "\n"; } else { print win_to_dos("Дешифрованные данные, вы можете прочесть в файле: ") . "\n"; print $self->{file}. "\n"; } print "=" x 79, "\n\n"; print win_to_dos("Для выхода нажмите ENTER..."); <>;
sub encoder { my @val = @_; my $sum; $self->{md5}->add(join("", $self->{key}, @val)); $sum = $self->{md5}->hexdigest(); return($self->{cbc}->encrypt_hex(join("µ", $sum, @val))); }
sub decoder { my $code = shift; my($sum, $sum2, @val) = (); ($sum, @val) = split("µ", $self->{cbc}->decrypt_hex($code)); $self->{md5}->add(join("", $self->{key}, @val)); $sum2 = $self->{md5}->hexdigest(); return ($sum eq $sum2) ? @val : (); }
sub keyGenerator { my $col = shift || 10; my @chars = ('A'..'Z', 0..9); return join('', @chars[ map { rand @chars }( 1..$col ) ]); }
sub win_to_dos { my $str = shift; $str =~ tr/\300-\377\250\227/\200-\257\340-\361/; return $str; }
__END__;
|
Может кому пригодится. |