📄 crypt.pm
字号:
0x00401081, 0x00001001, 0x00001080, 0x00000000, 0x00400000, 0x00400081, 0x00000081, 0x00401000, 0x00000001, 0x00401080, 0x00401000, 0x00000081, 0x00400081, 0x00001000, 0x00001001, 0x00401081, 0x00000000, 0x00400080, 0x00400001, 0x00001080, 0x00401001, 0x00001081, 0x00401080, 0x00000001, 0x00001081, 0x00401001, 0x00000080, 0x00400000, 0x00001081, 0x00401000, 0x00401001, 0x00000081, 0x00001000, 0x00000080, 0x00400000, 0x00401001, 0x00400081, 0x00001081, 0x00001080, 0x00000000, 0x00000080, 0x00400001, 0x00000001, 0x00400080, 0x00000000, 0x00400081, 0x00400080, 0x00001080, 0x00000081, 0x00001000, 0x00401081, 0x00400000, 0x00401080, 0x00000001, 0x00001001, 0x00401081, 0x00400001, 0x00401080, 0x00401000, 0x00001001,);my @SPtrans7 =( # nibble 7 0x08200020, 0x08208000, 0x00008020, 0x00000000, 0x08008000, 0x00200020, 0x08200000, 0x08208020, 0x00000020, 0x08000000, 0x00208000, 0x00008020, 0x00208020, 0x08008020, 0x08000020, 0x08200000, 0x00008000, 0x00208020, 0x00200020, 0x08008000, 0x08208020, 0x08000020, 0x00000000, 0x00208000, 0x08000000, 0x00200000, 0x08008020, 0x08200020, 0x00200000, 0x00008000, 0x08208000, 0x00000020, 0x00200000, 0x00008000, 0x08000020, 0x08208020, 0x00008020, 0x08000000, 0x00000000, 0x00208000, 0x08200020, 0x08008020, 0x08008000, 0x00200020, 0x08208000, 0x00000020, 0x00200020, 0x08008000, 0x08208020, 0x00200000, 0x08200000, 0x08000020, 0x00208000, 0x00008020, 0x08008020, 0x08200000, 0x00000020, 0x08208000, 0x00208020, 0x00000000, 0x08000000, 0x08200020, 0x00008000, 0x00208020);my @cov_2char =( 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A);sub ushr # only for ints!{ my ($n, $s) = @_; $s &= 0x1f; return( ($n >> $s) & (~0 >> $s) );}sub toByte{ my $value = shift; $value &= 0xff; $value = - ((~$value & 0xff) + 1) if ($value & 0x80); return $value;}sub toInt{ my $value = shift; $value = - ((~$value & 0xffffffff) + 1) if ($value & 0x80000000); return $value;}sub byteToUnsigned # int byteToUnsigned(byte b){ my $value = shift; return( $value >= 0 ? $value : $value + 256 );}sub fourBytesToInt # int fourBytesToInt(byte b[], int offset){ my ($b, $offset) = @_; my $value; $value = byteToUnsigned($b->[$offset++]); $value |= (byteToUnsigned($b->[$offset++]) << 8); $value |= (byteToUnsigned($b->[$offset++]) << 16); $value |= (byteToUnsigned($b->[$offset++]) << 24); return toInt($value);}sub intToFourBytes # void intToFourBytes(int iValue, byte b[], int offset){ my ($iValue, $b, $offset) = @_; $b->[$offset++] = toByte(ushr($iValue, 0) & 0xff); $b->[$offset++] = toByte(ushr($iValue, 8) & 0xff); $b->[$offset++] = toByte(ushr($iValue,16) & 0xff); $b->[$offset++] = toByte(ushr($iValue,24) & 0xff); return undef;}sub PERM_OP # void PERM_OP(int a, int b, int n, int m, int results[]){ my ($a, $b, $n, $m, $results) = @_; my $t; $t = (ushr($a,$n) ^ $b) & $m; $a ^= $t << $n; $b ^= $t; $results->[0] = toInt($a); $results->[1] = toInt($b); return undef;}sub HPERM_OP # void HPERM_OP(int a, int n, int m){ my ($a, $n, $m) = @_; my $t; $t = (($a << (16 - $n)) ^ $a) & $m; $a = $a ^ $t ^ ushr($t, 16 - $n); return toInt($a);}sub des_set_key # int [] des_set_key(byte key[]){ my ($key) = @_; my @schedule; $#schedule = $ITERATIONS * 2 -1; my $c = fourBytesToInt($key, 0); my $d = fourBytesToInt($key, 4); my @results; $#results = 1; PERM_OP($d, $c, 4, 0x0f0f0f0f, \@results); $d = $results[0]; $c = $results[1]; $c = HPERM_OP($c, -2, 0xcccc0000); $d = HPERM_OP($d, -2, 0xcccc0000); PERM_OP($d, $c, 1, 0x55555555, \@results); $d = $results[0]; $c = $results[1]; PERM_OP($c, $d, 8, 0x00ff00ff, \@results); $c = $results[0]; $d = $results[1]; PERM_OP($d, $c, 1, 0x55555555, \@results); $d = $results[0]; $c = $results[1]; $d = ( (($d & 0x000000ff) << 16) | ($d & 0x0000ff00) | ushr($d & 0x00ff0000, 16) | ushr($c & 0xf0000000, 4)); $c &= 0x0fffffff; my ($s, $t); my ($i, $j); $j = 0; for($i = 0; $i < $ITERATIONS; $i++) { if($shifts2[$i]) { $c = ushr($c, 2) | ($c << 26); $d = ushr($d, 2) | ($d << 26); } else { $c = ushr($c, 1) | ($c << 27); $d = ushr($d, 1) | ($d << 27); } $c &= 0x0fffffff; $d &= 0x0fffffff; $s = $skb0[ ($c ) & 0x3f ]| $skb1[(ushr($c, 6) & 0x03) | (ushr($c, 7) & 0x3c)]| $skb2[(ushr($c,13) & 0x0f) | (ushr($c,14) & 0x30)]| $skb3[(ushr($c,20) & 0x01) | (ushr($c,21) & 0x06) | (ushr($c,22) & 0x38)]; $t = $skb4[ ($d ) & 0x3f ]| $skb5[(ushr($d, 7) & 0x03) | (ushr($d, 8) & 0x3c) ]| $skb6[ ushr($d,15) & 0x3f ]| $skb7[(ushr($d,21) & 0x0f) | (ushr($d,22) & 0x30)]; $schedule[$j++] = ( ($t << 16) | ($s & 0x0000ffff)) & 0xffffffff; $s = (ushr($s, 16) | ($t & 0xffff0000)); $s = ($s << 4) | ushr($s,28); $schedule[$j++] = $s & 0xffffffff; } return \@schedule;}sub D_ENCRYPT # int D_ENCRYPT(int L, int R, int S, int E0, int E1, int s[]){ my ($L, $R, $S, $E0, $E1, $s) = @_; my ($t, $u, $v); $v = $R ^ ushr($R,16); $u = $v & $E0; $v = $v & $E1; $u = ($u ^ ($u << 16)) ^ $R ^ $s->[$S]; $t = ($v ^ ($v << 16)) ^ $R ^ $s->[$S + 1]; $t = ushr($t, 4) | ($t << 28); $L ^= $SPtrans1[ ($t ) & 0x3f] | $SPtrans3[ushr($t, 8) & 0x3f] | $SPtrans5[ushr($t, 16) & 0x3f] | $SPtrans7[ushr($t, 24) & 0x3f] | $SPtrans0[ ($u ) & 0x3f] | $SPtrans2[ushr($u, 8) & 0x3f] | $SPtrans4[ushr($u, 16) & 0x3f] | $SPtrans6[ushr($u, 24) & 0x3f]; return $L;}sub body # int [] body(int schedule[], int Eswap0, int Eswap1){ my ($schedule, $Eswap0, $Eswap1) = @_; my $left = 0; my $right = 0; my $t = 0; my ($i, $j); for($j = 0; $j < 25; $j++) { for($i = 0; $i < $ITERATIONS * 2; $i += 4) { $left = D_ENCRYPT($left, $right, $i, $Eswap0, $Eswap1, $schedule); $right = D_ENCRYPT($right, $left, $i + 2, $Eswap0, $Eswap1, $schedule); } $t = $left; $left = $right; $right = $t; } $t = $right; $right = ushr($left, 1) | ($left << 31); $left = ushr($t , 1) | ($t << 31); $left &= 0xffffffff; $right &= 0xffffffff; my @results; $#results = 1; PERM_OP($right, $left, 1, 0x55555555, \@results); $right = $results[0]; $left = $results[1]; PERM_OP($left, $right, 8, 0x00ff00ff, \@results); $left = $results[0]; $right = $results[1]; PERM_OP($right, $left, 2, 0x33333333, \@results); $right = $results[0]; $left = $results[1]; PERM_OP($left, $right, 16, 0x0000ffff, \@results); $left = $results[0]; $right = $results[1]; PERM_OP($right, $left, 4, 0x0f0f0f0f, \@results); $right = $results[0]; $left = $results[1]; my @out; $#out = 1; $out[0] = $left; $out[1] = $right; return \@out;}sub crypt # String crypt(String original, String salt){ my ($original, $salt) = @_; while(length($salt) < 2) { $salt .= 'A'; } my $buffer = ''; substr($buffer,0,2) = substr($salt,0,2); my $Eswap0 = $con_salt[ord(substr($salt,0,1))]; my $Eswap1 = $con_salt[ord(substr($salt,1,1))] << 4; my @key; $#key = 7; for(0 .. @key) { $key[$_] = 0; } my $i; my @iChar = map { ord($_) << 1 } split(//, $original); for($i = 0; $i < @key && $i < @iChar; $i++) { $key[$i] = toByte($iChar[$i]); } my $schedule = des_set_key(\@key); my $out = body($schedule, $Eswap0, $Eswap1); my @b; $#b = 8; intToFourBytes($out->[0], \@b, 0); intToFourBytes($out->[1], \@b, 4); $b[8] = 0; my ($j, $c, $y, $u); for($i = 2, $y = 0, $u = 0x80; $i < 13; $i++) { for($j = 0, $c = 0; $j < 6; $j++) { $c <<= 1; $c |= 1 if (($b[$y] & $u) != 0); $u >>= 1; if($u == 0) { $y++; $u = 0x80; } } $buffer .= chr($cov_2char[$c]); } return $buffer;}1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -