Bifid cipher: Difference between revisions
Content added Content deleted
m (→{{header|J}}) |
SqrtNegInf (talk | contribs) (Added Perl) |
||
Line 165: | Line 165: | ||
</pre> |
</pre> |
||
=={{header|Perl}}== |
|||
<lang perl>use v5.36; |
|||
use builtin <indexed floor>; |
|||
use experimental qw(builtin for_list); |
|||
use List::Util 'max'; |
|||
sub table ($c, @V) { my $t = $c * (my $w = 2 + length max map { length } @V); ( sprintf( ('%'.$w.'s')x@V, @V) ) =~ s/.{1,$t}\K/\n/gr } |
|||
sub polybius ($text) { |
|||
my %p; |
|||
my $n = floor sqrt length $text; |
|||
for my($k,$v) (indexed split '', $text) { |
|||
$p{$v} = join ' ', $k%$n, int $k/$n |
|||
} |
|||
%p; |
|||
} |
|||
sub encrypt ($text, %P) { |
|||
my(%I, @c1, @c2, $encrypted); |
|||
for my($k,$v) (%P) { $I{$v} = $k } |
|||
for (split '', $text =~ s/\s//gr) { |
|||
for my($i,$j) (split ' ', $P{$_}) { push @c1, $i; push @c2, $j } |
|||
} |
|||
for my($j,$i) (@c2, @c1) { $encrypted .= $I{"$i $j"} } |
|||
$encrypted |
|||
} |
|||
sub decrypt ($text, %P) { |
|||
my($decrypted, $l, %I, @c) = ('', length($text)); |
|||
for my($k,$v) (%P) { $I{$v} = $k } |
|||
for (split '', $text) { |
|||
for my($i,$j) (split ' ', $P{$_}) { unshift @c, $i, $j } |
|||
} |
|||
substr $decrypted, 0, 0, $I{ "$c[$_] $c[$_+$l]" } for 0 .. $l-1; |
|||
$decrypted; |
|||
} |
|||
for my($polybius,$message) ( |
|||
join('','A'..'Z') =~ s/J//r, 'ATTACK AT DAWN', |
|||
'BGWKZQPNDSIOAXEFCLUMTHYVR', 'FLEE AT ONCE', |
|||
join('','_.', 'A'..'Z', 'a'..'z', '0'..'9'), 'The_invasion_will_start_on_the_first_of_January_2023.', |
|||
) { |
|||
my %Ptable = polybius $polybius; |
|||
say "\nUsing polybius:\n" . table sqrt length $polybius, split '', $polybius; |
|||
say 'Message : ' . $message; |
|||
say 'Encrypted : ' . (my $encrypted = encrypt $message, %Ptable); |
|||
say 'Decrypted : ' . decrypt $encrypted, %Ptable; |
|||
}</lang> |
|||
{{out}} |
|||
<pre>Using polybius: |
|||
A B C D E |
|||
F G H I K |
|||
L M N O P |
|||
Q R S T U |
|||
V W X Y Z |
|||
Message : ATTACK AT DAWN |
|||
Encrypted : DQBDAXDQPDQH |
|||
Decrypted : ATTACKATDAWN |
|||
Using polybius: |
|||
B G W K Z |
|||
Q P N D S |
|||
I O A X E |
|||
F C L U M |
|||
T H Y V R |
|||
Message : FLEE AT ONCE |
|||
Encrypted : UAEOLWRINS |
|||
Decrypted : FLEEATONCE |
|||
Using polybius: |
|||
_ . A B C D E F |
|||
G H I J K L M N |
|||
O P Q R S T U V |
|||
W X Y Z a b c d |
|||
e f g h i j k l |
|||
m n o p q r s t |
|||
u v w x y z 0 1 |
|||
2 3 4 5 6 7 8 9 |
|||
Message : The_invasion_will_start_on_the_first_of_January_2023. |
|||
Encrypted : SejxqrEierbmrDiCjrDeJsbu89DWCHkgGS9E6tAG5_Ks2PBfCq_uH |
|||
Decrypted : The_invasion_will_start_on_the_first_of_January_2023.</pre> |
|||
=={{header|Raku}}== |
=={{header|Raku}}== |