网络编程
位置:首页>> 网络编程>> Asp编程>> SHA256算法 asp源码

SHA256算法 asp源码

  发布时间:2009-08-28 13:01:00 

标签:sha256,算法,加密

SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数。正式名称为 SHA 的家族第一个成员发布于 1993年。然而现在的人们给它取了一个非正式的名称 SHA-0 以避免与它的后继者混淆。两年之后, SHA-1,第一个 SHA 的后继者发布了。 另外还有四种变体,曾经发布以提升输出的范围和变更一些细微设计: SHA-224, SHA-256, SHA-384 和 SHA-512 (这些有时候也被称做 SHA-2)。

SHA-256算法asp源码

<%
Class TSHA256
    Private m_lOnBits(30),m_l2Power(30)
    Private K(80)
    Private  BITS_TO_A_BYTE,BYTES_TO_A_WORD,BITS_TO_A_WORD
      '#######################HASH算法通用函数开始#################
      '左移
      Private Function SHL(lValue, iBits)
          If iBits = 0 Then
              SHL = lValue
              Exit Function
          ElseIf iBits = 31 Then
              If lValue And 1 Then
                  SHL = &H80000000
              Else
                  SHL = 0
              End If
              Exit Function
          ElseIf iBits < 0 Or iBits > 31 Then
              Err.Raise 6
          End If
   
          If (lValue And m_l2Power(31 - iBits)) Then
              SHL = ((lValue And m_lOnBits(31 - (iBits + 1))) * m_l2Power(iBits)) Or &H80000000
          Else
              SHL = ((lValue And m_lOnBits(31 - iBits)) * m_l2Power(iBits))
          End If
      End Function
      '右移
      Private Function SHR(lValue, iBits)
          If iBits = 0 Then
              SHR = lValue
              Exit Function
          ElseIf iBits = 31 Then
              If lValue And &H80000000 Then
                  SHR = 1
              Else
                  SHR = 0
              End If
              Exit Function
          ElseIf iBits < 0 Or iBits > 31 Then
              Err.Raise 6
          End If
   
          SHR = (lValue And &H7FFFFFFE) \ m_l2Power(iBits)
   
          If (lValue And &H80000000) Then
              SHR = (SHR Or (&H40000000 \ m_l2Power(iBits - 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
      '将字符串转成32位字数组(将字符串转成 双字 数组)
      Private Function ConvertToWordArray(sMsg)
          Dim lMsgLength
          Dim lNumberOfWords
          Dim lWordArray()
          Dim lBytePosition
          Dim lByteCount
          Dim lWordCount
          Dim lByte
   
          Const MODULUS_BITS = 512
          Const CONGRUENT_BITS = 448
   
          lMsgLength = Len(sMsg)
   
          lNumberOfWords = (((lMsgLength + ((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 >= lMsgLength
              lWordCount = lByteCount \ BYTES_TO_A_WORD
       
              lBytePosition = (3 - (lByteCount Mod BYTES_TO_A_WORD)) * BITS_TO_A_BYTE
       
              lByte = AscB(Mid(sMsg, lByteCount + 1, 1))
       
              lWordArray(lWordCount) = lWordArray(lWordCount) Or SHL(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 SHL(&H80, lBytePosition)
          lWordArray(lNumberOfWords - 1) = SHL(lMsgLength, 3)
          lWordArray(lNumberOfWords - 2) = SHR(lMsgLength, 29)
   
          ConvertToWordArray = lWordArray
      End Function
      '########################HASH算法通用函数结束################
      '********************SHA算法专用函数开始*********************
      Private Function ROTR(x, n)
          ROTR = (SHR(x, (n And m_lOnBits(4))) Or SHL(x, (32 - (n And m_lOnBits(4)))))
      End Function
      Private Function ROTL(x, n)
          ROTL = (SHL(x, (n And m_lOnBits(4))) Or SHR(x, (32 - (n And m_lOnBits(4)))))
      End Function
      Private Function Sigma0(x)
          Sigma0 = (ROTR(x, 2) Xor ROTR(x, 13) Xor ROTR(x, 22))
      End Function
      Private Function Sigma1(x)
          Sigma1 = (ROTR(x, 6) Xor ROTR(x, 11) Xor ROTR(x, 25))
      End Function
      Private Function Gamma0(x)
          Gamma0 = (ROTR(x, 7) Xor ROTR(x, 18) Xor SHR(x, CInt(3 And m_lOnBits(4))))
      End Function
      Private Function Gamma1(x)
          Gamma1 = (ROTR(x, 17) Xor ROTR(x, 19) Xor SHR(x, CInt(10 And m_lOnBits(4))))
      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 Parity(x,y,z)
          Parity = x XOR y XOR z
      End Function
    Private Function F1(x,y,z,t)
          Select Case Int(t / 20)
          Case 0
             F1 = CH(x,y,z)
          Case 1
             F1 = Parity(x,y,z)
          Case 2
             F1 = Maj(x,y,z)
          Case 3
             F1 = Parity(x,y,z)
          End Select
    End Function
      '********************SHA算法专用函数结束*********************
    Private Function coreSHA256(M)
          Dim HASH(7),W(80)
          Dim a,b,c,d,e,f,g,h,str
          Dim i,j
          Dim T,T1,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
              For i = 0 To UBound(M) Step 16 'For i = 1 To N
                  'Initialize the eight working variables
                  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
                      'Prepare the message schedule W(t)
                      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
                      'For t = 0  to 63
                      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
          coreSHA256=HASH
    End Function
    public  function EncryptArray(a_aMsg)
        EncryptArray=coreSHA256(a_aMsg)
    end function
      Public Function Encrypt(a_sResultType,a_sMsg)
          Dim sReturn, sType : sType=LCase(Trim(a_sResultType))
          Dim i
          Dim HASH
           Encrypt=NULL
          If Len(sType)<4 Then Exit Function End If
          HASH = coreSHA256(ConvertToWordArray(a_sMsg))
        sReturn=""
        For i=1 To 4
              Select Case Mid(sType,i,1)
              Case "a"
                  sReturn=sReturn & Right("00000000" & Hex(HASH(0)), 8) & Right("00000000" & Hex(HASH(1)), 8)
              Case "b"
                   sReturn=sReturn & Right("00000000" & Hex(HASH(2)), 8) & Right("00000000" & Hex(HASH(3)), 8)
              Case "c"
                  sReturn=sReturn & Right("00000000" & Hex(HASH(4)), 8) & Right("00000000" & Hex(HASH(5)), 8)
              Case "d"
                  sReturn=sReturn & Right("00000000" & Hex(HASH(6)), 8) & Right("00000000" & Hex(HASH(7)), 8)
              End Select
        Next
         
        Encrypt = LCase(sReturn)
    End Function
    Private Sub Class_Initialize()
        Dim i,j
        BITS_TO_A_BYTE = 8
        BYTES_TO_A_WORD = 4
        BITS_TO_A_WORD = 32
        For i = 0 To 30
            j = i + 1
            m_lOnBits(i) = CLng(2^j-1)
            m_l2Power(i) = CLng(2^i)
        Next
          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
    End Sub
End Class
%>

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com