ADFGVX cipher: Difference between revisions

m (cleanup)
Line 446:
use List::Util qw( shuffle );
 
my $plaintext = 'ATTACKAT1200AM';
my @code = qw( A D F G V X ); # generate polybius square
my $keysize = 9;
my @pairs = map { my $left = $_; map "$left$_", @code } @code;
 
my @letters = shuffle "A" .. 'Z' , 0 .. 9; # randomize polybius
my $templatepolybius = <<END;
my %char2pair;
@char2pair{ @letters } = @pairs; # map chars to pairs
my %pair2char = reverse %char2pair; # map pairs to chars
my $template = <<END;
| A D F G V X
--+------------
Line 462 ⟶ 459:
X | x x x x x x
END
$templatepolybius =~ s/x/$_/ for my @letters = shuffle "A" .. 'Z' , 0 .. 9;
print "Polybius square =\n\n$templatepolybius\n";
my %char2pair;
@char2pair{ @letters } = @pairs;glob '{A,D,F,G,V,X}' x 2; # map chars to pairs
my %pair2char = reverse %char2pair; # map pairs to chars
my ($keyword) = shuffle grep !/(.).*\1/, $file =~ /^\w{$keysize}$/gm;
my $file = do { local (@ARGV, $/) = 'unixdict.txt'; uc <> =~ /^.{$keysize}$/gm };
my ($n, @deorder) = 0;
my @reorder = map /.(.+)/, sort map $_ . $n++, split //, $keyword;
@deorder[@reorder] = 0 .. $#reorder;
print "keyword keyword = $keyword\n\nplaintext = $plaintext\n\n";
 
my $encoded = encode( $plaintext, $keyword, \%char2pair, \@reorder );
my $file = do { local (@ARGV, $/) = 'unixdict.txt'; uc <> };
print " encoded = $encoded\n\n";
my $keysize = 9;
my ($keyword) = shuffle grep !/(.).*\1/, $file =~ /^\w{$keysize}$/gm;
my $plaintext = 'ATTACKAT1200AM';
print "keyword = $keyword\n\nplaintext = $plaintext\n\n";
 
my $encoded = encode( $plaintext, $keyword, \%char2pair );
print "encoded = $encoded\n\n";
 
my $decoded = decode( $encoded, $keyword, \%pair2char, \@deorder );
print " decoded = $decoded\n\n";
 
sub encode
{
my ($plain, $keywordc2p, $c2p, %hashorder) = @_;
my $len = length @$keywordorder;
myjoin $cols' =', (transpose( $plain =~ s/./$c2p->{$&}/gr =~ s/.{1,$len}\K(?=.)/\n/grg ))[@$order];
@hash{split //, $keyword} = split ' ', $cols;
return join ' ', @hash{sort keys %hash};
}
 
sub decode
{
my ($encoded, $keywordp2c, $p2c, %hashorder) = @_;
@hash{ sort(join split //'', $keyword } = transpose((split ' ', $encoded)[@$order])) =~ s/../$p2c->{$&}/gr;
return transpose( join "\n", @hash{ split //, $keyword }) =~
s/\s+//gr =~ s/../$p2c->{$&}/gr;
}
 
sub transpose { map join('', map {s/.// ? $& : ''} @_), 1 .. length $_[0] }</lang>
sub transpose
{
local $_ = shift() =~ s/\s+/\n/gr;
my $answer = '';
$answer .= ' ' while s/^./ $answer .= $& ; '' /gem;
$answer;
}</lang>
{{out}}
<pre>
Line 507 ⟶ 497:
| A D F G V X
--+------------
A | 56 TV XY UE GP N
D | 21 7C 1M D9 8L EH
F | 98 0T JO RU ZD WF
G | QA LR 3G I7 FS 65
V | CJ O2 MW PQ 4I HZ
X | Y K B V3 0 AX S4
 
keyword = benchmark
keyword = SINGAPORE
 
plaintext = ATTACKAT1200AM
 
encoded = AVFGDG VFVGDVF DXDDGG VXAAXD ADF XDXFAX DAD VDVDFG FAX XADFADA
 
decoded = ATTACKAT1200AM
 
decoded = ATTACKAT1200AM
</pre>
 
 
=={{header|Phix}}==
Anonymous user