#!/usr/local/bin/perl -w use strict; sub permutation { my @pix = @{shift()}; my @x = @{shift()}; $_[$_] = $x[$pix[$_]-1] for 0..scalar @pix-1; @_ } sub e_ecb { my @pix = @{shift()}; my @x = @{shift()}; scalar @x % scalar @pix and push @x, '0' for 0..scalar @x % scalar @pix; while (my @t = splice @x, 0, scalar @pix) { push @_, permutation (\@pix, \@t); } @_ } sub d_ecb { e_ecb ([reversepi (@{shift()})], shift) } sub shiftmod { my @a = @{shift()}; my @b = @{shift()}; $_[$_] = ($a[$_] + $b[$_]) % 2 for 0..scalar @a-1; @_ } sub reversepi { my @a = splice @_, 0, scalar @_; $_[$a[$_]-1] = $_+1 for 0..scalar @a-1; @_ } sub e_cbc { my @pix = @{shift()}; my @iv = @{shift()}; my @x = @{shift()}; scalar @x % scalar @pix and push @x, '0' for 0..scalar @x % scalar @pix; scalar @pix != scalar @iv and die "painful death !"; while (my @t = splice @x,0,scalar @pix) { @iv = permutation (\@pix, [shiftmod(\@iv, \@t)] ); push @_, @iv; } @_ } sub d_cbc { my @pix = @{shift()}; my @iv = @{shift()}; my @x = @{shift()}; scalar @x % scalar @pix and push @x, '0' for 0..scalar @x % scalar @pix; scalar @pix != scalar @iv and die "painful death !"; while (my @t = splice @x,0,scalar @pix) { push @_, shiftmod ([permutation ([reversepi (@pix)], \@t)], \@iv); @iv = @t; } @_ } sub asciifi { my $r; $r .= chr (oct ('0b'.join '', splice @_, 0, 8)) for 0..int(@_/8); $r } sub d_synchro { my @key = @{shift()}; my @c = @{shift()}; $key[$_+4] = ($key[$_]+$key[$_+1])%2 for 0..@c-5; return shiftmod ([@key], [@c]); } sub shiftCBA { my $a = ord ($_[0]) - ord($_[1]); ($a < 0) and $a += 26; chr ($a+65); } sub force_autokey { my @c = @_; for my $r ('A'..'Z') { print $r.": "; print lc ($r = shiftCBA ($c[$_], $r)) for 0..@c-1; print "\n"; } } print "10 (a) : ", join (", ", e_ecb ([2,3,1], [1,1,1,0,1,1,1,0,1,0,0,1])), "\n"; print "10 (b) : ", join (", ", d_cbc ([2,3,1], [1,1,1], [1,1,1, 0,1,1, 1,0,1, 0,0,1])), "\n"; print "11 : ", asciifi (d_synchro ([1,0,1,0], [1,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,0])), "\n"; print "12 : \n"; force_autokey ( split / */, 'PWNAULMZRTXRJEZ'); print "10 (a) : ", join (", ", e_ecb ([reversepi(2,3,1)], [1,1,1,0,1,1,1,0,1,0,0,1])), "\n";