2015-04-24 59 views
1

我在vbscript中有以下SHA256算法實現,我發現它here,我試圖將其轉換爲php。隨着一點點的谷歌搜索和運氣,我發現here在PHP中的實現。將SHA256算法從VBScript轉換爲PHP

這裏是的VBScript: (你可以從Windows CMD如運行它:test.vbs passwordtohash

Private m_lOnBits(30) 
Private m_l2Power(30) 
Private K(63) 

Private Const BITS_TO_A_BYTE = 8 
Private Const BYTES_TO_A_WORD = 4 
Private Const BITS_TO_A_WORD = 32 

m_lOnBits(0) = CLng(1) 
m_lOnBits(1) = CLng(3) 
m_lOnBits(2) = CLng(7) 
m_lOnBits(3) = CLng(15) 
m_lOnBits(4) = CLng(31) 
m_lOnBits(5) = CLng(63) 
m_lOnBits(6) = CLng(127) 
m_lOnBits(7) = CLng(255) 
m_lOnBits(8) = CLng(511) 
m_lOnBits(9) = CLng(1023) 
m_lOnBits(10) = CLng(2047) 
m_lOnBits(11) = CLng(4095) 
m_lOnBits(12) = CLng(8191) 
m_lOnBits(13) = CLng(16383) 
m_lOnBits(14) = CLng(32767) 
m_lOnBits(15) = CLng(65535) 
m_lOnBits(16) = CLng(131071) 
m_lOnBits(17) = CLng(262143) 
m_lOnBits(18) = CLng(524287) 
m_lOnBits(19) = CLng(1048575) 
m_lOnBits(20) = CLng(2097151) 
m_lOnBits(21) = CLng(4194303) 
m_lOnBits(22) = CLng(8388607) 
m_lOnBits(23) = CLng(16777215) 
m_lOnBits(24) = CLng(33554431) 
m_lOnBits(25) = CLng(67108863) 
m_lOnBits(26) = CLng(134217727) 
m_lOnBits(27) = CLng(268435455) 
m_lOnBits(28) = CLng(536870911) 
m_lOnBits(29) = CLng(1073741823) 
m_lOnBits(30) = CLng(2147483647) 

m_l2Power(0) = CLng(1) 
m_l2Power(1) = CLng(2) 
m_l2Power(2) = CLng(4) 
m_l2Power(3) = CLng(8) 
m_l2Power(4) = CLng(16) 
m_l2Power(5) = CLng(32) 
m_l2Power(6) = CLng(64) 
m_l2Power(7) = CLng(128) 
m_l2Power(8) = CLng(256) 
m_l2Power(9) = CLng(512) 
m_l2Power(10) = CLng(1024) 
m_l2Power(11) = CLng(2048) 
m_l2Power(12) = CLng(4096) 
m_l2Power(13) = CLng(8192) 
m_l2Power(14) = CLng(16384) 
m_l2Power(15) = CLng(32768) 
m_l2Power(16) = CLng(65536) 
m_l2Power(17) = CLng(131072) 
m_l2Power(18) = CLng(262144) 
m_l2Power(19) = CLng(524288) 
m_l2Power(20) = CLng(1048576) 
m_l2Power(21) = CLng(2097152) 
m_l2Power(22) = CLng(4194304) 
m_l2Power(23) = CLng(8388608) 
m_l2Power(24) = CLng(16777216) 
m_l2Power(25) = CLng(33554432) 
m_l2Power(26) = CLng(67108864) 
m_l2Power(27) = CLng(134217728) 
m_l2Power(28) = CLng(268435456) 
m_l2Power(29) = CLng(536870912) 
m_l2Power(30) = CLng(1073741824) 

K(0) = &H428A2F98 
K(1) = &H71374491 
K(2) = &HB5C0FBCF 
K(3) = &HE9B5DBA5 
K(4) = &H3956C25B 
K(5) = &H59F111F1 
K(6) = &H923F82A4 
K(7) = &HAB1C5ED5 
K(8) = &HD807AA98 
K(9) = &H12835B01 
K(10) = &H243185BE 
K(11) = &H550C7DC3 
K(12) = &H72BE5D74 
K(13) = &H80DEB1FE 
K(14) = &H9BDC06A7 
K(15) = &HC19BF174 
K(16) = &HE49B69C1 
K(17) = &HEFBE4786 
K(18) = &HFC19DC6 
K(19) = &H240CA1CC 
K(20) = &H2DE92C6F 
K(21) = &H4A7484AA 
K(22) = &H5CB0A9DC 
K(23) = &H76F988DA 
K(24) = &H983E5152 
K(25) = &HA831C66D 
K(26) = &HB00327C8 
K(27) = &HBF597FC7 
K(28) = &HC6E00BF3 
K(29) = &HD5A79147 
K(30) = &H6CA6351 
K(31) = &H14292967 
K(32) = &H27B70A85 
K(33) = &H2E1B2138 
K(34) = &H4D2C6DFC 
K(35) = &H53380D13 
K(36) = &H650A7354 
K(37) = &H766A0ABB 
K(38) = &H81C2C92E 
K(39) = &H92722C85 
K(40) = &HA2BFE8A1 
K(41) = &HA81A664B 
K(42) = &HC24B8B70 
K(43) = &HC76C51A3 
K(44) = &HD192E819 
K(45) = &HD6990624 
K(46) = &HF40E3585 
K(47) = &H106AA070 
K(48) = &H19A4C116 
K(49) = &H1E376C08 
K(50) = &H2748774C 
K(51) = &H34B0BCB5 
K(52) = &H391C0CB3 
K(53) = &H4ED8AA4A 
K(54) = &H5B9CCA4F 
K(55) = &H682E6FF3 
K(56) = &H748F82EE 
K(57) = &H78A5636F 
K(58) = &H84C87814 
K(59) = &H8CC70208 
K(60) = &H90BEFFFA 
K(61) = &HA4506CEB 
K(62) = &HBEF9A3F7 
K(63) = &HC67178F2 

Private Function LShift(lValue, iShiftBits) 
    If iShiftBits = 0 Then 
     LShift = lValue 
     Exit Function 
    ElseIf iShiftBits = 31 Then 
     If lValue And 1 Then 
      LShift = &H80000000 
     Else 
      LShift = 0 
     End If 
     Exit Function 
    ElseIf iShiftBits < 0 Or iShiftBits > 31 Then 
     Err.Raise 6 
    End If 

    If (lValue And m_l2Power(31 - iShiftBits)) Then 
     LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000 
    Else 
     LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits)) 
    End If 
End Function 

Private Function RShift(lValue, iShiftBits) 
    If iShiftBits = 0 Then 
     RShift = lValue 
     Exit Function 
    ElseIf iShiftBits = 31 Then 
     If lValue And &H80000000 Then 
      RShift = 1 
     Else 
      RShift = 0 
     End If 
     Exit Function 
    ElseIf iShiftBits < 0 Or iShiftBits > 31 Then 
     Err.Raise 6 
    End If 

    RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits) 

    If (lValue And &H80000000) Then 
     RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1))) 
    End If 
End Function 

Private Function AddUnsigned(lX, lY) 
    Dim lX4 
    Dim lY4 
    Dim lX8 
    Dim lY8 
    Dim lResult 

    lX8 = lX And &H80000000 
    lY8 = lY And &H80000000 
    lX4 = lX And &H40000000 
    lY4 = lY And &H40000000 

    lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF) 

    If lX4 And lY4 Then 
     lResult = lResult Xor &H80000000 Xor lX8 Xor lY8 
    ElseIf lX4 Or lY4 Then 
     If lResult And &H40000000 Then 
      lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8 
     Else 
      lResult = lResult Xor &H40000000 Xor lX8 Xor lY8 
     End If 
    Else 
     lResult = lResult Xor lX8 Xor lY8 
    End If 

    AddUnsigned = lResult 
End Function 

Private Function Ch(x, y, z) 
    Ch = ((x And y) Xor ((Not x) And z)) 
End Function 

Private Function Maj(x, y, z) 
    Maj = ((x And y) Xor (x And z) Xor (y And z)) 
End Function 

Private Function S(x, n) 
    S = (RShift(x, (n And m_lOnBits(4))) Or LShift(x, (32 - (n And m_lOnBits(4))))) 
End Function 

Private Function R(x, n) 
    R = RShift(x, CInt(n And m_lOnBits(4))) 
End Function 

Private Function Sigma0(x) 
    Sigma0 = (S(x, 2) Xor S(x, 13) Xor S(x, 22)) 
End Function 

Private Function Sigma1(x) 
    Sigma1 = (S(x, 6) Xor S(x, 11) Xor S(x, 25)) 
End Function 

Private Function Gamma0(x) 
    Gamma0 = (S(x, 7) Xor S(x, 18) Xor R(x, 3)) 
End Function 

Private Function Gamma1(x) 
    Gamma1 = (S(x, 17) Xor S(x, 19) Xor R(x, 10)) 
End Function 

Private Function ConvertToWordArray(sMessage) 
    Dim lMessageLength 
    Dim lNumberOfWords 
    Dim lWordArray() 
    Dim lBytePosition 
    Dim lByteCount 
    Dim lWordCount 
    Dim lByte 

    Const MODULUS_BITS = 512 
    Const CONGRUENT_BITS = 448 

    lMessageLength = Len(sMessage) 

    lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD) 
    ReDim lWordArray(lNumberOfWords - 1) 

    lBytePosition = 0 
    lByteCount = 0 
    Do Until lByteCount >= lMessageLength 
     lWordCount = lByteCount \ BYTES_TO_A_WORD 

     lBytePosition = (3 - (lByteCount Mod BYTES_TO_A_WORD)) * BITS_TO_A_BYTE 

     lByte = AscB(Mid(sMessage, lByteCount + 1, 1)) 

     lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(lByte, lBytePosition) 
     lByteCount = lByteCount + 1 
    Loop 

    lWordCount = lByteCount \ BYTES_TO_A_WORD 
    lBytePosition = (3 - (lByteCount Mod BYTES_TO_A_WORD)) * BITS_TO_A_BYTE 

    lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition) 

    lWordArray(lNumberOfWords - 1) = LShift(lMessageLength, 3) 
    lWordArray(lNumberOfWords - 2) = RShift(lMessageLength, 29) 

    ConvertToWordArray = lWordArray 
End Function 

Public Function SHA256(sMessage) 
    Dim HASH(7) 
    Dim M 
    Dim W(63) 
    Dim a 
    Dim b 
    Dim c 
    Dim d 
    Dim e 
    Dim f 
    Dim g 
    Dim h 
    Dim i 
    Dim j 
    Dim T1 
    Dim T2 

    HASH(0) = &H6A09E667 
    HASH(1) = &HBB67AE85 
    HASH(2) = &H3C6EF372 
    HASH(3) = &HA54FF53A 
    HASH(4) = &H510E527F 
    HASH(5) = &H9B05688C 
    HASH(6) = &H1F83D9AB 
    HASH(7) = &H5BE0CD19 

    M = ConvertToWordArray(sMessage) 

    For i = 0 To UBound(M) Step 16 
     a = HASH(0) 
     b = HASH(1) 
     c = HASH(2) 
     d = HASH(3) 
     e = HASH(4) 
     f = HASH(5) 
     g = HASH(6) 
     h = HASH(7) 

     For j = 0 To 63 
      If j < 16 Then 
       W(j) = M(j + i) 
      Else 
       W(j) = AddUnsigned(AddUnsigned(AddUnsigned(Gamma1(W(j - 2)), W(j - 7)), Gamma0(W(j - 15))), W(j - 16)) 
      End If 

      T1 = AddUnsigned(AddUnsigned(AddUnsigned(AddUnsigned(h, Sigma1(e)), Ch(e, f, g)), K(j)), W(j)) 
      T2 = AddUnsigned(Sigma0(a), Maj(a, b, c)) 

      h = g 
      g = f 
      f = e 
      e = AddUnsigned(d, T1) 
      d = c 
      c = b 
      b = a 
      a = AddUnsigned(T1, T2) 
     Next 

     HASH(0) = AddUnsigned(a, HASH(0)) 
     HASH(1) = AddUnsigned(b, HASH(1)) 
     HASH(2) = AddUnsigned(c, HASH(2)) 
     HASH(3) = AddUnsigned(d, HASH(3)) 
     HASH(4) = AddUnsigned(e, HASH(4)) 
     HASH(5) = AddUnsigned(f, HASH(5)) 
     HASH(6) = AddUnsigned(g, HASH(6)) 
     HASH(7) = AddUnsigned(h, HASH(7)) 
    Next 

    SHA256 = LCase(Right("00000000" & Hex(HASH(0)), 8) & Right("00000000" & Hex(HASH(1)), 8) & Right("00000000" & Hex(HASH(2)), 8) & Right("00000000" & Hex(HASH(3)), 8) & Right("00000000" & Hex(HASH(4)), 8) & Right("00000000" & Hex(HASH(5)), 8) & Right("00000000" & Hex(HASH(6)), 8) & Right("00000000" & Hex(HASH(7)), 8)) 
End Function 

Set args = Wscript.Arguments 

For Each arg In args 
    sDigest = SHA256(arg) 
    Wscript.Echo "#### "&sDigest 
Next 

這裏是phpSha.php文件:

<?php 
class auth_sha256 
{ 
    /** 
     * On Bits for sha256 mapping 
     * 
     * @access private 
     * @var  array 
     */ 
    private $m_lOnBits = array(1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215,33554431,67108863,134217727,268435455,536870911,1073741823,2147483647); 

    /** 
     * 2nd power sha256 mapping 
     * 
     * @access private 
     * @var  array 
     */ 
    private $m_l2Power = array(1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824); 

    /** 
     * Hex mapping sha256 mapping 
     * 
     * @access private 
     * @var  array 
     */ 
    private $K   = array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2); 

    /** 
     * Perform SHA256 encoding 
     * 
     * @access public 
     * @param string  String to encode 
     * @return string  Encoded string 
     */ 
    public function SHA256($sMessage) 
    { 
     $HASH = array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19); 
     $M  = $this->ConvertToWordArray($sMessage); 

     for($i = 0, $ij = count($M); $i < $ij; $i+=16) 
     { 
      $a = $HASH[0]; 
      $b = $HASH[1]; 
      $c = $HASH[2]; 
      $d = $HASH[3]; 
      $e = $HASH[4]; 
      $f = $HASH[5]; 
      $g = $HASH[6]; 
      $h = $HASH[7]; 

      for($j = 0; $j<63; $j++) 
      { 
       if($j < 16) 
       { 
        $W[$j] = $M[$j + $i]; 
       } 
       else 
       { 
        $W[$j] = $this->AddUnsigned($this->AddUnsigned($this->AddUnsigned($this->Gamma1($W[$j - 2]), $W[$j - 7]), $this->Gamma0($W[$j - 15])), $W[$j - 16]); 
       } 

       $T1 = $this->AddUnsigned($this->AddUnsigned($this->AddUnsigned($this->AddUnsigned($h, $this->Sigma1($e)), $this->Ch($e, $f, $g)), $this->K[$j]), $W[$j]); 
       $T2 = $this->AddUnsigned($this->Sigma0($a), $this->Maj($a, $b, $c)); 

       $h = $g; 
       $g = $f; 
       $f = $e; 
       $e = $this->AddUnsigned($d, $T1); 
       $d = $c; 
       $c = $b; 
       $b = $a; 
       $a = $this->AddUnsigned($T1, $T2); 
      } 

      $HASH[0] = $this->AddUnsigned($a, $HASH[0]); 
      $HASH[1] = $this->AddUnsigned($b, $HASH[1]); 
      $HASH[2] = $this->AddUnsigned($c, $HASH[2]); 
      $HASH[3] = $this->AddUnsigned($d, $HASH[3]); 
      $HASH[4] = $this->AddUnsigned($e, $HASH[4]); 
      $HASH[5] = $this->AddUnsigned($f, $HASH[5]); 
      $HASH[6] = $this->AddUnsigned($g, $HASH[6]); 
      $HASH[7] = $this->AddUnsigned($h, $HASH[7]); 
     } 

     for ($i=0; $i < 8; $i++) 
     { 
      $HASH[$i] = str_repeat("0",8-strlen(dechex($HASH[$i]))) . strtolower(dechex($HASH[$i])); 
     } 

     return $HASH[0].$HASH[1].$HASH[2].$HASH[3].$HASH[4].$HASH[5].$HASH[6].$HASH[7]; 
    } 

    /** 
     * Left shift a value x bits 
     * 
     * @access private 
     * @param string  String to shift 
     * @param integer  Number of bits to shift 
     * @return string  Shifted string 
     */ 
    private function LShift($lValue, $iShiftBits) 
    { 
     if ($iShiftBits == 0) 
     { 
      return $lValue; 
     } 
     elseif ($iShiftBits == 31) 
     { 
      if ($lValue & 1) 
      { 
       return 0x80000000; 
      } 
      else 
      { 
       return 0; 
      } 
     } 
     elseif ($iShiftBits < 0 Or $iShiftBits > 31) 
     { 
      exit(); 
     } 

     if ($lValue & $this->m_l2Power[31 - $iShiftBits]) 
     { 
      return (($lValue & $this->m_lOnBits[31 - ($iShiftBits + 1)]) * $this->m_l2Power[$iShiftBits]) | 0x80000000; 
     } 
     else 
     { 
      return (($lValue & $this->m_lOnBits[31 - $iShiftBits]) * $this->m_l2Power[$iShiftBits]); 
     } 
    } 

    /** 
     * Right shift a value x bits 
     * 
     * @access private 
     * @param string  String to shift 
     * @param integer  Number of bits to shift 
     * @return string  Shifted string 
     */ 
    private function RShift($lValue, $iShiftBits) 
    { 
     if ($iShiftBits == 0) 
     { 
      return $lValue; 
     } 
     elseif ($iShiftBits == 31) 
     { 
      if ($lValue & 0x80000000) 
      { 
       $RShift = 1; 
      } 
      else 
      { 
       $RShift = 0; 
      } 
     } 
     elseif ($iShiftBits < 0 Or $iShiftBits > 31) 
     { 
      exit(); 
     } 

     $RShift = floor(($lValue & 0x7FFFFFFE)/$this->m_l2Power[$iShiftBits]); 

     if ($lValue & 0x80000000) 
     { 
      $RShift = ($RShift | floor(0x40000000/$this->m_l2Power[$iShiftBits - 1])); 
     } 

     return $RShift; 
    } 

    /** 
     * Add unsigned 
     * 
     * @access private 
     * @param integer  Number 
     * @param integer  Number 
     * @return string  Added unsigned integer 
     */ 
    private function AddUnsigned($lX, $lY) 
    { 
     $lX8 = $lX & 0x80000000; 
     $lY8 = $lY & 0x80000000; 
     $lX4 = $lX & 0x40000000; 
     $lY4 = $lY & 0x40000000; 

     $lResult = ($lX & 0x3FFFFFFF) + ($lY & 0x3FFFFFFF); 

     if ($lX4 & $lY4) 
     { 
      $lResult = $lResult^0x80000000^$lX8^$lY8; 
     } 
     elseif ($lX4 | $lY4) 
     { 
      if ($lResult & 0x40000000) 
      { 
       $lResult = $lResult^0xC0000000^$lX8^$lY8; 
      } 
      else 
      { 
       $lResult = $lResult^0x40000000^$lX8^$lY8; 
      } 
     } 
     else 
     { 
      $lResult = $lResult^$lX8^$lY8; 
     } 

     return $lResult; 
    } 

    /** 
     * Ch 
     * 
     * @access private 
     * @param integer  $x 
     * @param integer  $y 
     * @param integer  $z 
     * @return mixed  No idea... 
     */ 
    private function Ch($x, $y, $z) 
    { 
     return (($x & $y)^((~ $x) & $z)); 
    } 

    /** 
     * Maj 
     * 
     * @access private 
     * @param integer  $x 
     * @param integer  $y 
     * @param integer  $z 
     * @return mixed  No idea... 
     */ 
    private function Maj($x, $y, $z) 
    { 
     return (($x & $y)^($x & $z)^($y & $z)); 
    } 

    /** 
     * S 
     * 
     * @access private 
     * @param integer  $x 
     * @param integer  $n 
     * @return mixed  No idea... 
     */ 
    private function S($x, $n) 
    { 
     return ($this->RShift($x , ($n & $this->m_lOnBits[4])) | $this->LShift($x , (32 - ($n & $this->m_lOnBits[4])))); 
    } 

    /** 
     * R 
     * 
     * @access private 
     * @param integer  $x 
     * @param integer  $n 
     * @return mixed  No idea... 
     */ 
    private function R($x, $n) 
    { 
     return $this->RShift($x , ($n & $this->m_lOnBits[4])); 
    } 

    /** 
     * Sigma0 
     * 
     * @access private 
     * @param integer  $x 
     * @return mixed  No idea... 
     */ 
    private function Sigma0($x) 
    { 
     return ($this->S($x, 2)^$this->S($x, 13)^$this->S($x, 22)); 
    } 

    /** 
     * Sigma1 
     * 
     * @access private 
     * @param integer  $x 
     * @return mixed  No idea... 
     */ 
    private function Sigma1($x) 
    { 
     return ($this->S($x, 6)^$this->S($x, 11)^$this->S($x, 25)); 
    } 

    /** 
     * Gamma0 
     * 
     * @access private 
     * @param integer  $x 
     * @return mixed  No idea... 
     */ 
    private function Gamma0($x) 
    { 
     return ($this->S($x, 7)^$this->S($x, 18)^$this->R($x, 3)); 
    } 

    /** 
     * Gamma1 
     * 
     * @access private 
     * @param integer  $x 
     * @return mixed  No idea... 
     */ 
    private function Gamma1($x) 
    { 
     return ($this->S($x, 17)^$this->S($x, 19)^$this->R($x, 10)); 
    } 

    /** 
     * Convert to a word array 
     * 
     * @access private 
     * @param string  Word to convert 
     * @return array  Word array 
     */ 
    private function ConvertToWordArray($sMessage) 
    { 
     $BITS_TO_A_BYTE = 8; 
     $BYTES_TO_A_WORD = 4; 
     $BITS_TO_A_WORD = 32; 
     $MODULUS_BITS = 512; 
     $CONGRUENT_BITS = 448; 

     $lMessageLength = strlen($sMessage); 

     $lNumberOfWords = (floor(($lMessageLength + floor(($MODULUS_BITS - $CONGRUENT_BITS)/$BITS_TO_A_BYTE))/floor($MODULUS_BITS/$BITS_TO_A_BYTE)) + 1) * floor($MODULUS_BITS/$BITS_TO_A_WORD); 
     for($i = 0; $i < $lNumberOfWords; $i++) 
     { 
      $lWordArray[$i]=""; 
     } 

     $lBytePosition = 0; 
     $lByteCount = 0; 
     do 
     { 
      $lWordCount = floor($lByteCount/$BYTES_TO_A_WORD); 

      $lBytePosition = (3 - ($lByteCount % $BYTES_TO_A_WORD)) * $BITS_TO_A_BYTE; 

      $lByte = ord(substr($sMessage, $lByteCount, 1)); 

      $lWordArray[$lWordCount] = $lWordArray[$lWordCount] | $this->LShift($lByte , $lBytePosition); 
      $lByteCount++; 
     } 
     while ($lByteCount < $lMessageLength); 

     $lWordCount = floor($lByteCount/$BYTES_TO_A_WORD); 
     $lBytePosition = (3 - ($lByteCount % $BYTES_TO_A_WORD)) * $BITS_TO_A_BYTE; 

     $lWordArray[$lWordCount] = $lWordArray[$lWordCount] | $this->LShift(0x80 , $lBytePosition); 

     $lWordArray[$lNumberOfWords - 1] = $this->LShift($lMessageLength , 3); 
     $lWordArray[$lNumberOfWords - 2] = $this->RShift($lMessageLength , 29); 

     return $lWordArray; 
    } 
} 

可以運行它與test.php文件:

<?php 
    require_once ('phpSha.php'); 

    $sha = new auth_sha256(); 

    $password = $sha->SHA256('hello'); 

    echo $password; 

?> 

當我運行與密碼的VBScript你好SHA256哈希是2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 ,結果爲字符串hello用php SHA256實現:0e52daf0a5e0f63d5cd8e0d63b667960d5b02c51ee85c243572ea4b636ea90c4 有人可以幫助我弄清楚什麼是錯的,哈希別比賽?

回答

0

爲什麼不直接使用PHP hash函數?

echo hash('sha256','hello'); 
+0

是的,你是對的它提供了相同的散列但VBScript實如果你改變了行對於j = 0到63,爲j = 0到47和線SHA256 = LCASE(右(「00000000」& 8)&Right(「00000000」&Hex(HASH(2)),8)&Right(「00000000」&Hex(HASH(1)), (HASH(5)),8)&Right(「00000000」&Hex(HASH(4)),8)&Right(「00000000」 「&Hex(HASH(6)),8)&Right(」00000000「&Hex(HASH(7)),8))從8到6,你可以有一個48字節的摘要,我嘗試用php 。 – fnkbz