www.pudn.com > sslref30.zip > doPC1


#!/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);