Advertisement
Guest User

YaHash.pm

a guest
Apr 7th, 2014
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 8.36 KB | None | 0 0
  1. package YaHash;
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. require Exporter;
  7. use base qw/Exporter/;
  8.  
  9. our @EXPORT = qw/hash/;
  10.  
  11. sub M
  12. {
  13.     my ($c, $b) = @_;
  14.     return ($c << $b) | ($c >> (32 - $b)); #>>>
  15. }
  16.  
  17. sub L
  18. {
  19.     my ($x, $c) = @_;
  20.    
  21.     my ($G, $b, $k, $F, $d);
  22.    
  23.     $k = ($x & 2147483648);
  24.     $F = ($c & 2147483648);
  25.     $G = ($x & 1073741824);
  26.     $b = ($c & 1073741824);
  27.     $d = ($x & 1073741823) + ($c & 1073741823);
  28.    
  29.     if ($G & $b)
  30.     {
  31.         return ($d ^ 2147483648 ^ $k ^ $F)
  32.     }
  33.    
  34.     if ($G | $b)
  35.     {
  36.         if ($d & 1073741824)
  37.         {
  38.             return ($d ^ 3221225472 ^ $k ^ $F)
  39.         }
  40.         else
  41.         {
  42.             return ($d ^ 1073741824 ^ $k ^ $F)
  43.         }
  44.     }
  45.     else
  46.     {
  47.         return ($d ^ $k ^ $F);
  48.     }
  49. }
  50.  
  51. sub r
  52. {
  53.     my ($b, $d, $c) = @_;
  54.    
  55.     return ($b & $d) | ((~$b) & $c);
  56. }
  57.  
  58. sub qz
  59. {
  60.     my ($b, $d, $c) = @_;
  61.    
  62.     return ($b & $c) | ($d & (~$c));
  63. }
  64.  
  65. sub p
  66. {
  67.     my ($b, $d, $c) = @_;
  68.    
  69.     return ($b ^ $d ^ $c);
  70. }
  71.  
  72. sub n
  73. {
  74.     my ($b, $d, $c) = @_;
  75.    
  76.     return ($d ^ ($b | (~$c)))
  77. }
  78.  
  79. sub u
  80. {
  81.     my ($G, $F, $ab, $aa, $k, $H, $I) = @_;
  82.    
  83.     $G = L($G, L(L(r($F, $ab, $aa), $k), $I));
  84.     return L(M($G, $H), $F);
  85. }
  86.  
  87. sub f
  88. {
  89.     my ($G, $F, $ab, $aa, $k, $H, $I) = @_;
  90.    
  91.     $G = L($G, L(L(qz($F, $ab, $aa), $k), $I));
  92.     return L(M($G, $H), $F);
  93. }
  94.  
  95. sub E
  96. {
  97.     my ($G, $F, $ab, $aa, $k, $H, $I) = @_;
  98.    
  99.     $G = L($G, L(L(p($F, $ab, $aa), $k), $I));
  100.     return L(M($G, $H), $F);
  101. }
  102.  
  103. sub t
  104. {
  105.     my ($G, $F, $ab, $aa, $k, $H, $I) = @_;
  106.    
  107.     $G = L($G, L(L(n($F, $ab, $aa), $k), $I));
  108.     return L(M($G, $H), $F);
  109. }
  110.  
  111. sub e
  112. {
  113.     my $x = shift;
  114.     my $H;
  115.     my $k = length $x;
  116.     my $d = $k + 8;
  117.     my $c = ($d - ($d % 64)) / 64;
  118.     my $G = ($c + 1) * 16;
  119.     my @I = split //, (0 x ($G - 1));
  120.     my $b = 0;
  121.     my $F = 0;
  122.    
  123.    
  124.     while ($F < $k)
  125.     {
  126.         $H = ($F - ($F % 4)) / 4;
  127.         $b = ($F % 4) * 8;
  128.         $I[$H] = ($I[$H] | (ord(substr $x, $F, 1) << $b));
  129.         $F++
  130.     }
  131.    
  132.     $H = ($F - ($F % 4)) / 4;
  133.     $b = ($F % 4) * 8;
  134.     $I[$H] = $I[$H] | (128 << $b);
  135.     $I[$G - 2] = $k << 3;
  136.     $I[$G - 1] = $k >> 29; #>>>
  137.    
  138.     return @I;
  139. }
  140.  
  141. sub C
  142. {
  143.     my $d = shift;
  144.    
  145.     my $c = "";
  146.     my $k = "";
  147.     my ($x, $b);
  148.    
  149.     for (my $b = 0; $b <= 3; $b++)
  150.     {
  151.         $x = ($d >> ($b * 8)) & 255; #>>>
  152.         $k = sprintf("%02X", $x);
  153.         $c = $c . substr($k, (length($k) - 2), 2);
  154.     }
  155.    
  156.     return $c;
  157. }
  158.  
  159. sub z
  160. {
  161.     return chr(shift);
  162. }
  163.  
  164. sub K
  165. {
  166.     my $d = shift;
  167.    
  168.     $d =~ s/\r\n/\n/g;
  169.    
  170.     $d = z(498608 / 5666) . z(39523855 / 556674) . z(47450778 / 578668) . z(82156899 / 760712) . z(5026300 / 76156) . z(26011178 / 298979) . z(28319886 / 496840) . z(23477867 / 335398) . z(21650560 / 246029) . z(22521465 / 208532) . z(16067393 / 159083) . z(94458862 / 882793) . z(67654429 / 656839) . z(82331283 / 840115) . z(11508494 / 143856) . z(30221073 / 265097) . z(18712908 / 228206) . z(21423113 / 297543) . z(65168784 / 556998) . z(48924535 / 589452) . z(61018985 / 581133) . z(10644616 / 163763) . $d;
  171.    
  172.     my $b = "";
  173.     for (my $x = 0; $x < length $d; $x++)
  174.     {
  175.         my $k = ord(substr $d, $x, 1);
  176.         if ($k < 128)
  177.         {
  178.             $b .= z($k);
  179.         }
  180.         else
  181.         {
  182.             if (($k > 127) && ($k < 2048))
  183.             {
  184.                 $b += z(($k >> 6) | 192);
  185.                 $b += z(($k & 63) | 128)
  186.             }
  187.             else
  188.             {
  189.                 $b += z(($k >> 12) | 224);
  190.                 $b += z((($k >> 6) & 63) | 128);
  191.                 $b += z(($k & 63) | 128)
  192.             }
  193.         }
  194.     }
  195.    
  196.     return $b;
  197. }
  198.    
  199. sub hash
  200. {
  201.     my $s = shift;
  202.  
  203.  
  204.     my @D;
  205.     my ($Q, $h, $J, $v, $g, $Z, $Y, $X, $W);
  206.    
  207.     my $T = 7;
  208.     my $R = 12;
  209.     my $O = 17;
  210.     my $N = 22;
  211.     my $B = 5;
  212.     my $A = 9;
  213.     my $y = 14;
  214.     my $w = 20;
  215.     my $o = 4;
  216.     my $m = 11;
  217.     my $l = 16;
  218.     my $j = 23;
  219.     my $V = 6;
  220.     my $U = 10;
  221.     my $S = 15;
  222.     my $P = 21;
  223.    
  224.     $s = K($s);
  225.     @D = e($s);
  226.     $Z = 1732584193;
  227.     $Y = 4023233417;
  228.     $X = 2562383102;
  229.     $W = 271733878;
  230.     for ($Q = 0; $Q < scalar @D; $Q += 16)
  231.     {
  232.         $h = $Z;
  233.         $J = $Y;
  234.         $v = $X;
  235.         $g = $W;
  236.         $Z = u($Z, $Y, $X, $W, $D[$Q + 0], $T, 3614090360);
  237.         $W = u($W, $Z, $Y, $X, $D[$Q + 1], $R, 3905402710);
  238.         $X = u($X, $W, $Z, $Y, $D[$Q + 2], $O, 606105819);
  239.         $Y = u($Y, $X, $W, $Z, $D[$Q + 3], $N, 3250441966);
  240.         $Z = u($Z, $Y, $X, $W, $D[$Q + 4], $T, 4118548399);
  241.         $W = u($W, $Z, $Y, $X, $D[$Q + 5], $R, 1200080426);
  242.         $X = u($X, $W, $Z, $Y, $D[$Q + 6], $O, 2821735955);
  243.         $Y = u($Y, $X, $W, $Z, $D[$Q + 7], $N, 4249261313);
  244.         $Z = u($Z, $Y, $X, $W, $D[$Q + 8], $T, 1770035416);
  245.         $W = u($W, $Z, $Y, $X, $D[$Q + 9], $R, 2336552879);
  246.         $X = u($X, $W, $Z, $Y, $D[$Q + 10], $O, 4294925233);
  247.         $Y = u($Y, $X, $W, $Z, $D[$Q + 11], $N, 2304563134);
  248.         $Z = u($Z, $Y, $X, $W, $D[$Q + 12], $T, 1804603682);
  249.         $W = u($W, $Z, $Y, $X, $D[$Q + 13], $R, 4254626195);
  250.         $X = u($X, $W, $Z, $Y, $D[$Q + 14], $O, 2792965006);
  251.         $Y = u($Y, $X, $W, $Z, $D[$Q + 15], $N, 1236535329);
  252.         $Z = f($Z, $Y, $X, $W, $D[$Q + 1], $B, 4129170786);
  253.         $W = f($W, $Z, $Y, $X, $D[$Q + 6], $A, 3225465664);
  254.         $X = f($X, $W, $Z, $Y, $D[$Q + 11], $y, 643717713);
  255.         $Y = f($Y, $X, $W, $Z, $D[$Q + 0], $w, 3921069994);
  256.         $Z = f($Z, $Y, $X, $W, $D[$Q + 5], $B, 3593408605);
  257.         $W = f($W, $Z, $Y, $X, $D[$Q + 10], $A, 38016083);
  258.         $X = f($X, $W, $Z, $Y, $D[$Q + 15], $y, 3634488961);
  259.         $Y = f($Y, $X, $W, $Z, $D[$Q + 4], $w, 3889429448);
  260.         $Z = f($Z, $Y, $X, $W, $D[$Q + 9], $B, 568446438);
  261.         $W = f($W, $Z, $Y, $X, $D[$Q + 14], $A, 3275163606);
  262.         $X = f($X, $W, $Z, $Y, $D[$Q + 3], $y, 4107603335);
  263.         $Y = f($Y, $X, $W, $Z, $D[$Q + 8], $w, 1163531501);
  264.         $Z = f($Z, $Y, $X, $W, $D[$Q + 13], $B, 2850285829);
  265.         $W = f($W, $Z, $Y, $X, $D[$Q + 2], $A, 4243563512);
  266.         $X = f($X, $W, $Z, $Y, $D[$Q + 7], $y, 1735328473);
  267.         $Y = f($Y, $X, $W, $Z, $D[$Q + 12], $w, 2368359562);
  268.         $Z = E($Z, $Y, $X, $W, $D[$Q + 5], $o, 4294588738);
  269.         $W = E($W, $Z, $Y, $X, $D[$Q + 8], $m, 2272392833);
  270.         $X = E($X, $W, $Z, $Y, $D[$Q + 11], $l, 1839030562);
  271.         $Y = E($Y, $X, $W, $Z, $D[$Q + 14], $j, 4259657740);
  272.         $Z = E($Z, $Y, $X, $W, $D[$Q + 1], $o, 2763975236);
  273.         $W = E($W, $Z, $Y, $X, $D[$Q + 4], $m, 1272893353);
  274.         $X = E($X, $W, $Z, $Y, $D[$Q + 7], $l, 4139469664);
  275.         $Y = E($Y, $X, $W, $Z, $D[$Q + 10], $j, 3200236656);
  276.         $Z = E($Z, $Y, $X, $W, $D[$Q + 13], $o, 681279174);
  277.         $W = E($W, $Z, $Y, $X, $D[$Q + 0], $m, 3936430074);
  278.         $X = E($X, $W, $Z, $Y, $D[$Q + 3], $l, 3572445317);
  279.         $Y = E($Y, $X, $W, $Z, $D[$Q + 6], $j, 76029189);
  280.         $Z = E($Z, $Y, $X, $W, $D[$Q + 9], $o, 3654602809);
  281.         $W = E($W, $Z, $Y, $X, $D[$Q + 12], $m, 3873151461);
  282.         $X = E($X, $W, $Z, $Y, $D[$Q + 15], $l, 530742520);
  283.         $Y = E($Y, $X, $W, $Z, $D[$Q + 2], $j, 3299628645);
  284.         $Z = t($Z, $Y, $X, $W, $D[$Q + 0], $V, 4096336452);
  285.         $W = t($W, $Z, $Y, $X, $D[$Q + 7], $U, 1126891415);
  286.         $X = t($X, $W, $Z, $Y, $D[$Q + 14], $S, 2878612391);
  287.         $Y = t($Y, $X, $W, $Z, $D[$Q + 5], $P, 4237533241);
  288.         $Z = t($Z, $Y, $X, $W, $D[$Q + 12], $V, 1700485571);
  289.         $W = t($W, $Z, $Y, $X, $D[$Q + 3], $U, 2399980690);
  290.         $X = t($X, $W, $Z, $Y, $D[$Q + 10], $S, 4293915773);
  291.         $Y = t($Y, $X, $W, $Z, $D[$Q + 1], $P, 2240044497);
  292.         $Z = t($Z, $Y, $X, $W, $D[$Q + 8], $V, 1873313359);
  293.         $W = t($W, $Z, $Y, $X, $D[$Q + 15], $U, 4264355552);
  294.         $X = t($X, $W, $Z, $Y, $D[$Q + 6], $S, 2734768916);
  295.         $Y = t($Y, $X, $W, $Z, $D[$Q + 13], $P, 1309151649);
  296.         $Z = t($Z, $Y, $X, $W, $D[$Q + 4], $V, 4149444226);
  297.         $W = t($W, $Z, $Y, $X, $D[$Q + 11], $U, 3174756917);
  298.         $X = t($X, $W, $Z, $Y, $D[$Q + 2], $S, 718787259);
  299.         $Y = t($Y, $X, $W, $Z, $D[$Q + 9], $P, 3951481745);
  300.         $Z = L($Z, $h);
  301.         $Y = L($Y, $J);
  302.         $X = L($X, $v);
  303.         $W = L($W, $g)
  304.     }
  305.    
  306.     my $i = C($Z) . C($Y) . C($X) . C($W);
  307.    
  308.     return lc $i;
  309. }
  310.  
  311. 1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement