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";