<?xml version="1.0" encoding="windows-1252"?>
<node id="788854" title="Re^2: MD5 -- not digest::md5" created="2009-08-15 06:05:56" updated="2009-08-15 06:05:56">
<type id="11">
note</type>
<author id="726765">
Oromis92</author>
<data>
<field name="doctext">
lol, ok ok&lt;br&gt;
here's:&lt;/br&gt;
&lt;code&gt;
#!/usr/bin/perl

use strict;
use warnings;
use diagnostics;

my @r = ((7,12,17,22) x 4 , (5,9,14,20) x 4 , (4,11,16,23) x 4 , (6,10,15,21) x 4);

my @k;
$k[$_] = (int(abs(sin($_+1))*(2**32))) for 0..63;

my $H0 = 0x67452301;
my $H1 = 0xefcdab89;
my $H2 = 0x98badcfe;
my $H3 = 0x10325476;

print "&gt; ";
my @msg = map(ord, split // , &lt;&gt;);
pop @msg;

my $msgbin;
$msgbin .= 0 . sprintf('%b',$msg[$_]) for 0..$#msg;;
my $length = sprintf('%b',length $msgbin);
$length = 0 . $length while length $length &lt; 64;
$msgbin .= 1;
$msgbin .= 0 until length $msgbin == 448 % 512;
$msgbin .= $length;

my @w;
for (my $i=0,my $j=0;$j&lt;16;$i+=32,$j++) {
   $w[$j] = (unpack("N", pack("B32", substr("0" x 32 . (substr($msgbin,$i,32)), -32)))) % (2**32); 
}

my $a = $H0;
my $b = $H1;
my $c = $H2;
my $d = $H3;

my $f;
my $g;

for my $i (0..63) {
   if ($i &gt;= 0 &amp;&amp; $i &lt;= 15) {
      $f = (($b &amp; $c) | ((~$b) &amp; $d)) % (2**32);
      $g = $i;
   } elsif ($i &gt;= 16 &amp;&amp; $i &lt;= 31) {
      $f = (($d &amp; $b) | ((~$d) &amp; $c)) % (2**32);
      $g = (5*$i + 1) % 16;
   } elsif ($i &gt;= 32 &amp;&amp; $i &lt;= 47) {
      $f = ($b ^ $c ^ $d) % (2**32);
      $g = (3*$i + 1) % 16;
   } elsif ($i &gt;= 48 &amp;&amp; $i &lt;= 63) {
      $f = ($c ^ ($b | (~$d))) % (2**32);
      $g = (7*$i + 1) % 16;
   }

my $temp = $d % (2**32);
$d = $c % (2**32);
$c = $b % (2**32);
$b = ($b + (($a + $f + $k[$i] + $w[$g]) &lt;&lt; $r[$i])) % (2**32);
$a = $temp % (2**32);

}
$H0 = unpack("H8", pack("N", ($H0 + $a)));
$H1 = unpack("H8", pack("N", ($H1 + $b)));
$H2 = unpack("H8", pack("N", ($H2 + $c)));
$H3 = unpack("H8", pack("N", ($H3 + $d)));

my $digest = $H0.$H1.$H2.$H3;
print "&gt; $digest\n";
&lt;/code&gt;</field>
<field name="root_node">
788852</field>
<field name="parent_node">
788853</field>
</data>
</node>
