line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Crypt::Vigenere; |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
$VERSION = "0.08"; |
4
|
|
|
|
|
|
|
|
5
|
1
|
|
|
1
|
|
7552
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
486
|
|
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
sub new { |
8
|
0
|
|
|
0
|
0
|
|
my $class = shift; |
9
|
0
|
|
0
|
|
|
|
my $keyword = shift || ''; |
10
|
|
|
|
|
|
|
|
11
|
0
|
0
|
|
|
|
|
if( $keyword !~ /^[a-z]+$/ ) { |
12
|
0
|
|
|
|
|
|
return; |
13
|
|
|
|
|
|
|
}; |
14
|
|
|
|
|
|
|
|
15
|
0
|
|
|
|
|
|
my $self = { |
16
|
|
|
|
|
|
|
'keyword' => $keyword, |
17
|
|
|
|
|
|
|
}; |
18
|
0
|
|
|
|
|
|
bless $self, $class; |
19
|
|
|
|
|
|
|
|
20
|
0
|
|
|
|
|
|
$self->_init( $keyword ); |
21
|
|
|
|
|
|
|
|
22
|
0
|
|
|
|
|
|
return( $self ); |
23
|
|
|
|
|
|
|
}; |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
sub _init { |
26
|
0
|
|
|
0
|
|
|
my $self = shift; |
27
|
|
|
|
|
|
|
|
28
|
0
|
|
|
|
|
|
foreach ( split('', lc($self->{keyword})) ) { |
29
|
0
|
|
|
|
|
|
my $ks = (ord($_)-97) % 26; |
30
|
0
|
|
|
|
|
|
my $ke = $ks - 1; |
31
|
|
|
|
|
|
|
|
32
|
0
|
|
|
|
|
|
my ($s, $S, $e, $E); |
33
|
|
|
|
|
|
|
|
34
|
0
|
|
|
|
|
|
$s = chr(ord('a') + $ks); |
35
|
0
|
|
|
|
|
|
$e = chr(ord('a') + $ke); |
36
|
|
|
|
|
|
|
|
37
|
0
|
|
|
|
|
|
push @{$self->{fwdLookupTable}}, "a-z/$s-za-$e"; |
|
0
|
|
|
|
|
|
|
38
|
0
|
|
|
|
|
|
push @{$self->{revLookupTable}}, "$s-za-$e/a-z"; |
|
0
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
}; |
40
|
|
|
|
|
|
|
|
41
|
0
|
|
|
|
|
|
return( $self ); |
42
|
|
|
|
|
|
|
}; |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
sub encodeMessage { |
45
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
46
|
0
|
|
|
|
|
|
my $string = shift; |
47
|
0
|
|
|
|
|
|
return( $self->_doTheMath($string, $self->{fwdLookupTable}) ); |
48
|
|
|
|
|
|
|
}; |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
sub decodeMessage { |
51
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
52
|
0
|
|
|
|
|
|
my $string = shift; |
53
|
0
|
|
|
|
|
|
return( $self->_doTheMath($string, $self->{revLookupTable}) ); |
54
|
|
|
|
|
|
|
}; |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
sub _doTheMath { |
58
|
0
|
|
|
0
|
|
|
my $self = shift; |
59
|
0
|
|
|
|
|
|
my $string = shift; |
60
|
0
|
|
|
|
|
|
my $lookupTable = shift; |
61
|
0
|
|
|
|
|
|
my $returnString; |
62
|
|
|
|
|
|
|
|
63
|
0
|
|
|
|
|
|
my $count = 0; |
64
|
0
|
|
|
|
|
|
foreach( split('', lc($string)) ) { |
65
|
0
|
0
|
|
|
|
|
if( /[a-z]{1}/ ) { |
66
|
0
|
|
|
|
|
|
eval "\$_ =~ tr/$lookupTable->[$count % length($self->{keyword})]/"; |
67
|
0
|
|
|
|
|
|
$count++; |
68
|
0
|
|
|
|
|
|
$returnString .= $_; |
69
|
|
|
|
|
|
|
} |
70
|
|
|
|
|
|
|
}; |
71
|
|
|
|
|
|
|
|
72
|
0
|
|
|
|
|
|
return( $returnString ); |
73
|
|
|
|
|
|
|
}; |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
1; |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
=head1 NAME |
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
Crypt::Vigenere - Perl implementation of the Vigenere cipher |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
=head1 SYNOPSIS |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
use Crypt::Vigenere; |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
$vigenere = Crypt::Vigenere->new( $keyword ); |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
# Encode the plaintext |
90
|
|
|
|
|
|
|
$cipher_text = $vigenere->encodeMessage( $plain_text ); |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
# Decode the ciphertext |
93
|
|
|
|
|
|
|
$plain_text = $vigenere->decodeMessage( $cipher_text ); |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
=head1 DESCRIPTION |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
See the documentation that came with the Crypt::Vigenere package for |
99
|
|
|
|
|
|
|
more information. |
100
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
=head2 EXPORT |
102
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
None by default. |
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
=head1 AUTHOR |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
Alistair Mills, http://search.cpan.org/~friffin/ |
109
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
=cut |