【问题标题】:Convert SHA256 algorithm from VBScript to PHP将 SHA256 算法从 VBScript 转换为 PHP
【发布时间】:2015-07-02 19:16:40
【问题描述】:

我在 vbscript 中有以下 SHA256 算法实现,我发现它here,我正在尝试将其转换为 php。通过一点谷歌搜索和运气,我找到了here 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;

?>

当我使用密码 hello 运行 vbscript 时,sha256 哈希是 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 使用 php sha256 实现的字符串 hello 的结果是:0e52daf0a5e0f63d5cd8e0d63b667960d5b02c51ee85c243572ea4b636ea90c4 有人可以帮我找出问题所在并且哈希值不匹配吗?

【问题讨论】:

    标签: php vbscript sha sha256 digest


    【解决方案1】:

    为什么不直接使用 PHP hash 函数?

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

    【讨论】:

    • 是的,您是对的,如果您将 For j = 0 To 63 行更改为 For j = 0 To 47 行和 SHA256 = LCase(Right("00000000 " & 十六进制(HASH(0)), 8) & 右("00000000" & 十六进制(HASH(1)), 8) & 右("00000000" & 十六进制(HASH(2)), 8) & 右(" 00000000" & 十六进制(HASH(3)), 8) & 右("00000000" & 十六进制(HASH(4)), 8) & 右("00000000" & 十六进制(HASH(5)), 8) & 右( "00000000" & Hex(HASH(6)), 8) & Right("00000000" & Hex(HASH(7)), 8)) 从 8 到 6 你可以有 48 个字节的摘要,我尝试这样做用 php。
    猜你喜欢
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多