#!/usr/local/bin/perl @l=( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30,31 ); @r=( 32,33,34,35,36,37,38,39, 40,41,42,43,44,45,46,47, 48,49,50,51,52,53,54,55, 56,57,58,59,60,61,62,63 ); require 'shifts.pl'; sub PERM_OP { local(*a,*b,*t,$n,$m)=@_; @z=&shift(*a,-$n); @z=&xor(*b,*z); @z=&and(*z,$m); @b=&xor(*b,*z); @z=&shift(*z,$n); @a=&xor(*a,*z); } sub HPERM_OP2 { local(*a,*t,$n,$m)=@_; local(@x,@y,$i); @z=&shift(*a,16-$n); @z=&xor(*a,*z); @z=&and(*z,$m); @a=&xor(*a,*z); @z=&shift(*z,$n-16); @a=&xor(*a,*z); } sub HPERM_OP { local(*a,*t,$n,$m)=@_; local(@x,@y,$i); for ($i=0; $i<16; $i++) { $x[$i]=$a[$i]; $y[$i]=$a[16+$i]; } @z=&shift(*x,-$n); @z=&xor(*y,*z); @z=&and(*z,$m); @y=&xor(*y,*z); @z=&shift(*z,$n); @x=&xor(*x,*z); for ($i=0; $i<16; $i++) { $a[$i]=$x[$i]; $a[16+$i]=$y[$i]; } } @L=@l; @R=@r; print "---\n"; &printit(@R); &PERM_OP(*R,*L,*T,4,0x0f0f0f0f); print "---\n"; &printit(@R); &HPERM_OP2(*L,*T,-2,0xcccc0000); &HPERM_OP2(*R,*T,-2,0xcccc0000); print "---\n"; &printit(@R); &PERM_OP(*R,*L,*T,1,0x55555555); print "---\n"; &printit(@R); &PERM_OP(*L,*R,*T,8,0x00ff00ff); print "---\n"; &printit(@R); &PERM_OP(*R,*L,*T,1,0x55555555); print "---\n"; &printit(@R); # &printit(@L); &printit(@R); print <<"EOF"; ============================== 63 55 47 39 31 23 15 7 62 54 46 38 30 22 14 6 61 53 45 37 29 21 13 5 60 52 44 36 -- -- -- -- 57 49 41 33 25 17 9 1 58 50 42 34 26 18 10 2 59 51 43 35 27 19 11 3 28 20 12 4 -- -- -- -- EOF exit(1); @A=&and(*R,0x000000ff); @A=&shift(*A,16); @B=&and(*R,0x0000ff00); @C=&and(*R,0x00ff0000); @C=&shift(*C,-16); @D=&and(*L,0xf0000000); @D=&shift(*D,-4); @A=&or(*A,*B); @B=&or(*D,*C); @R=&or(*A,*B); @L=&and(*L,0x0fffffff); &printit(@L); &printit(@R);