uebung3.plsrc
#!/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";