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

AES算法 asp源码

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

标签:aes算法,安全,加密

随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即AES。经过三轮的筛选,比利时Joan Daeman和Vincent Rijmen提交的Rijndael算法被提议为AES的最终算法。此算法将成为美国新的数据加密标准而被广泛应用在各个领域中。

尽管人们对AES还有不同的看法,但总体来说,AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。AES设计有三个密钥长度:128,192,256位,相对而言,AES的128密钥比DES的56密钥强1021倍。AES算法主要包括三个方面:轮变化、圈数和密钥扩展。本文以128为例,介绍算法的基本原理;结合AVR汇编语言,实现高级数据加密算法AES。  

AES是分组密钥,算法输入128位数据,密钥长度也是128位。用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所列)。每一轮都需要一个与输入分组具有相同长度的扩展密钥Expandedkey(i)的参与。由于外部输入的加密密钥K长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥K扩展成更长的比特串,以生成各轮的加密和解密密钥。

<%
Class TAES
    Private cls_lOnBits(30), cls_l2Power(30), cls_bytOnBits(7),cls_byt2Power(7)
    Private cls_InCo(3)
    Private cls_fbsub(255), cls_rbsub(255), cls_ptab(255), cls_ltab(255), cls_ftable(255), cls_rtable(255), cls_rco(29)
    Private cls_Nk, cls_Nb, cls_Nr
    Private cls_fi(23), cls_ri(23), cls_fkey(119), cls_rkey(119)
    Private Sub Class_Initialize()
        cls_InCo(0) = &HB
        cls_InCo(1) = &HD
        cls_InCo(2) = &H9
        cls_InCo(3) = &HE
        cls_bytOnBits(0) = 1
        cls_bytOnBits(1) = 3
        cls_bytOnBits(2) = 7
        cls_bytOnBits(3) = 15
        cls_bytOnBits(4) = 31
        cls_bytOnBits(5) = 63
        cls_bytOnBits(6) = 127
        cls_bytOnBits(7) = 255
   
        cls_byt2Power(0) = 1
        cls_byt2Power(1) = 2
        cls_byt2Power(2) = 4
        cls_byt2Power(3) = 8
        cls_byt2Power(4) = 16
        cls_byt2Power(5) = 32
        cls_byt2Power(6) = 64
        cls_byt2Power(7) = 128
   
        cls_lOnBits(0) = 1
        cls_lOnBits(1) = 3
        cls_lOnBits(2) = 7
        cls_lOnBits(3) = 15
        cls_lOnBits(4) = 31
        cls_lOnBits(5) = 63
        cls_lOnBits(6) = 127
        cls_lOnBits(7) = 255
        cls_lOnBits(8) = 511
        cls_lOnBits(9) = 1023
        cls_lOnBits(10) = 2047
        cls_lOnBits(11) = 4095
        cls_lOnBits(12) = 8191
        cls_lOnBits(13) = 16383
        cls_lOnBits(14) = 32767
        cls_lOnBits(15) = 65535
        cls_lOnBits(16) = 131071
        cls_lOnBits(17) = 262143
        cls_lOnBits(18) = 524287
        cls_lOnBits(19) = 1048575
        cls_lOnBits(20) = 2097151
        cls_lOnBits(21) = 4194303
        cls_lOnBits(22) = 8388607
        cls_lOnBits(23) = 16777215
        cls_lOnBits(24) = 33554431
        cls_lOnBits(25) = 67108863
        cls_lOnBits(26) = 134217727
        cls_lOnBits(27) = 268435455
        cls_lOnBits(28) = 536870911
        cls_lOnBits(29) = 1073741823
        cls_lOnBits(30) = 2147483647
   
        cls_l2Power(0) = 1
        cls_l2Power(1) = 2
        cls_l2Power(2) = 4
        cls_l2Power(3) = 8
        cls_l2Power(4) = 16
        cls_l2Power(5) = 32
        cls_l2Power(6) = 64
        cls_l2Power(7) = 128
        cls_l2Power(8) = 256
        cls_l2Power(9) = 512
        cls_l2Power(10) = 1024
        cls_l2Power(11) = 2048
        cls_l2Power(12) = 4096
        cls_l2Power(13) = 8192
        cls_l2Power(14) = 16384
        cls_l2Power(15) = 32768
        cls_l2Power(16) = 65536
        cls_l2Power(17) = 131072
        cls_l2Power(18) = 262144
        cls_l2Power(19) = 524288
        cls_l2Power(20) = 1048576
        cls_l2Power(21) = 2097152
        cls_l2Power(22) = 4194304
        cls_l2Power(23) = 8388608
        cls_l2Power(24) = 16777216
        cls_l2Power(25) = 33554432
        cls_l2Power(26) = 67108864
        cls_l2Power(27) = 134217728
        cls_l2Power(28) = 268435456
        cls_l2Power(29) = 536870912
        cls_l2Power(30) = 1073741824
    End Sub
    Private Function ByteSub(x)
        Dim y, z
   
        z = x
        y = cls_ptab(255 - cls_ltab(z))
        z = y
        z = ROTLB(z, 1)
        y = y Xor z
        z = ROTLB(z, 1)
        y = y Xor z
        z = ROTLB(z, 1)
        y = y Xor z
        z = ROTLB(z, 1)
        y = y Xor z
        y = y Xor &H63
   
        ByteSub = y
    End Function
    Private Function SHL(lValue, iShiftBits)
        If iShiftBits = 0 Then
            SHL = lValue
            Exit Function
        ElseIf iShiftBits = 31 Then
            If lValue And 1 Then
                SHL = &H80000000
            Else
                SHL = 0
            End If
            Exit Function
        ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
            Err.Raise 6
        End If
   
        If (lValue And cls_l2Power(31 - iShiftBits)) Then
            SHL = ((lValue And cls_lOnBits(31 - (iShiftBits + 1))) * cls_l2Power(iShiftBits)) Or &H80000000
        Else
            SHL = ((lValue And cls_lOnBits(31 - iShiftBits)) * cls_l2Power(iShiftBits))
        End If
    End Function
    Private Function SHR(lValue, iShiftBits)
        If iShiftBits = 0 Then
            SHR = lValue
            Exit Function
        ElseIf iShiftBits = 31 Then
            If lValue And &H80000000 Then
                SHR = 1
            Else
                SHR = 0
            End If
            Exit Function
        ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
            Err.Raise 6
        End If
   
        SHR = (lValue And &H7FFFFFFE) \ cls_l2Power(iShiftBits)
   
        If (lValue And &H80000000) Then
            SHR = (SHR Or (&H40000000 \ cls_l2Power(iShiftBits - 1)))
        End If
    End Function
    Private Function SHLB(bytValue, bytShiftBits)
        If bytShiftBits = 0 Then
            SHLB = bytValue
            Exit Function
        ElseIf bytShiftBits = 7 Then
            If bytValue And 1 Then
                SHLB = &H80
            Else
                SHLB = 0
            End If
            Exit Function
        ElseIf bytShiftBits < 0 Or bytShiftBits > 7 Then
            Err.Raise 6
        End If
   
        SHLB = ((bytValue And cls_bytOnBits(7 - bytShiftBits)) * cls_byt2Power(bytShiftBits))
    End Function
    Private Function SHRB(bytValue, bytShiftBits)
        If bytShiftBits = 0 Then
            SHRB = bytValue
            Exit Function
        ElseIf bytShiftBits = 7 Then
            If bytValue And &H80 Then
                SHRB = 1
            Else
                SHRB = 0
            End If
            Exit Function
        ElseIf bytShiftBits < 0 Or bytShiftBits > 7 Then
            Err.Raise 6
        End If
   
        SHRB = bytValue \ cls_byt2Power(bytShiftBits)
    End Function
    Private Function ROTL(lValue, iShiftBits)
        ROTL = SHL(lValue, iShiftBits) Or SHR(lValue, (32 - iShiftBits))
    End Function
    Private Function ROTLB(bytValue, bytShiftBits)
        ROTLB = SHLB(bytValue, bytShiftBits) Or SHRB(bytValue, (8 - bytShiftBits))
    End Function
    Private Function Pack(b())
        Dim lCount
        Dim lTemp
   
        For lCount = 0 To 3
            lTemp = b(lCount)
            Pack = Pack Or SHL(lTemp, (lCount * 8))
        Next
    End Function
    Private Function PackFrom(b(), k)
        Dim lCount
        Dim lTemp
   
        For lCount = 0 To 3
            lTemp = b(lCount + k)
            PackFrom = PackFrom Or SHL(lTemp, (lCount * 8))
        Next
    End Function
    Private Sub Unpack(a, b())
        b(0) = a And cls_lOnBits(7)
        b(1) = SHR(a, 8) And cls_lOnBits(7)
        b(2) = SHR(a, 16) And cls_lOnBits(7)
        b(3) = SHR(a, 24) And cls_lOnBits(7)
    End Sub
    Private Sub UnpackFrom(a, ByRef b(), k)
        b(0 + k) = a And cls_lOnBits(7)
        b(1 + k) = SHR(a, 8) And cls_lOnBits(7)
        b(2 + k) = SHR(a, 16) And cls_lOnBits(7)
        b(3 + k) = SHR(a, 24) And cls_lOnBits(7)
    End Sub
    Private Function IsInitialized(ByVal a_aArray)
        On Error Resume Next
        IsInitialized = IsNumeric(UBound(a_aArray))
    End Function
    Private Sub CopyBytesASP(bytDest, lDestStart, bytSource(), lSourceStart, lLength)
        Dim lCount
   
        lCount = 0
 
        Do
            bytDest(lDestStart + lCount) = bytSource(lSourceStart + lCount)
            lCount = lCount + 1
        Loop Until lCount = lLength
    End Sub
    Private Function xtime(a)
        Dim b
   
        If (a And &H80) Then
            b = &H1B
        Else
            b = 0
        End If
   
        xtime = SHLB(a, 1)
        xtime = xtime Xor b
    End Function
    Private Function bmul(x, y)
        If x <> 0 And y <> 0 Then
            bmul = cls_ptab((CLng(cls_ltab(x)) + CLng(cls_ltab(y))) Mod 255)
        Else
            bmul = 0
        End If
    End Function
    Private Function SubByte(a)
        Dim b(3)
   
        Unpack a, b
        b(0) = cls_fbsub(b(0))
        b(1) = cls_fbsub(b(1))
        b(2) = cls_fbsub(b(2))
        b(3) = cls_fbsub(b(3))
   
        SubByte = Pack(b)
    End Function
    Private Function product(x, y)
        Dim xb(3), yb(3)
   
        Unpack x, xb
        Unpack y, yb
        product = bmul(xb(0), yb(0)) Xor bmul(xb(1), yb(1)) Xor bmul(xb(2), yb(2)) Xor bmul(xb(3), yb(3))
    End Function
    Private Function InvMixCol(x)
        Dim y, m
        Dim b(3)
   
        m = Pack(cls_InCo)
        b(3) = product(m, x)
        m = ROTL(m, 24)
        b(2) = product(m, x)
        m = ROTL(m, 24)
        b(1) = product(m, x)
        m = ROTL(m, 24)
        b(0) = product(m, x)
        y = Pack(b)
   
        InvMixCol = y
    End Function
    Public Sub gentables()
        Dim i, y, ib
        Dim b(3)
   
        cls_ltab(0) = 0
        cls_ltab(1) = 0
        cls_ltab(3) = 1
        cls_ptab(0) = 1
        cls_ptab(1) = 3
   
        For i = 2 To 255
            cls_ptab(i) = cls_ptab(i - 1) Xor xtime(cls_ptab(i - 1))
            cls_ltab(cls_ptab(i)) = i
        Next
   
        cls_fbsub(0) = &H63
        cls_rbsub(&H63) = 0
   
        For i = 1 To 255
            ib = i
            y = ByteSub(ib)
            cls_fbsub(i) = y
            cls_rbsub(y) = i
        Next
   
        y = 1
        For i = 0 To 29
            cls_rco(i) = y
            y = xtime(y)
        Next
   
        For i = 0 To 255
            y = cls_fbsub(i)
            b(3) = y Xor xtime(y)
            b(2) = y
            b(1) = y
            b(0) = xtime(y)
            cls_ftable(i) = Pack(b)
            y = cls_rbsub(i)
            b(3) = bmul(cls_InCo(0), y)
            b(2) = bmul(cls_InCo(1), y)
            b(1) = bmul(cls_InCo(2), y)
            b(0) = bmul(cls_InCo(3), y)
            cls_rtable(i) = Pack(b)
        Next
    End Sub
    Private Sub gkey(nb, nk, key())               
        Dim i, j, k, m, n
        Dim C1, C2, C3
        Dim CipherKey(7)
   
        cls_Nb = nb
        cls_Nk = nk
   
        If cls_Nb >= cls_Nk Then
            cls_Nr = 6 + cls_Nb
        Else
            cls_Nr = 6 + cls_Nk
        End If
   
        C1 = 1
        If cls_Nb < 8 Then
            C2 = 2
            C3 = 3
        Else
            C2 = 3
            C3 = 4
        End If
   
        For j = 0 To nb - 1
            m = j * 3
       
            cls_fi(m) = (j + C1) Mod nb
            cls_fi(m + 1) = (j + C2) Mod nb
            cls_fi(m + 2) = (j + C3) Mod nb
            cls_ri(m) = (nb + j - C1) Mod nb
            cls_ri(m + 1) = (nb + j - C2) Mod nb
            cls_ri(m + 2) = (nb + j - C3) Mod nb
        Next
   
        N = cls_Nb * (cls_Nr + 1)
   
        For i = 0 To cls_Nk - 1
            j = i * 4
            CipherKey(i) = PackFrom(key, j)
        Next
   
        For i = 0 To cls_Nk - 1
            cls_fkey(i) = CipherKey(i)
        Next
   
        j = cls_Nk
        k = 0
 
        Do While j < N
            cls_fkey(j) = cls_fkey(j - cls_Nk) Xor _
            SubByte(ROTL(cls_fkey(j - 1), 24)) Xor cls_rco(k)
   
            If cls_Nk <= 6 Then
                i = 1
 
                Do While i < cls_Nk And (i + j) < N
                    cls_fkey(i + j) = cls_fkey(i + j - cls_Nk) Xor _
                    cls_fkey(i + j - 1)
                    i = i + 1
                Loop
            Else
                i = 1
  
                Do While i < 4 And (i + j) < N
                    cls_fkey(i + j) = cls_fkey(i + j - cls_Nk) Xor _
                    cls_fkey(i + j - 1)
                    i = i + 1
                Loop
 
                If j + 4 < N Then
                    cls_fkey(j + 4) = cls_fkey(j + 4 - cls_Nk) Xor _
                    SubByte(cls_fkey(j + 3))
                End If
   
                i = 5
 
                Do While i < cls_Nk And (i + j) < N
                    cls_fkey(i + j) = cls_fkey(i + j - cls_Nk) Xor _
                    cls_fkey(i + j - 1)
                    i = i + 1
                Loop
            End If
       
            j = j + cls_Nk
            k = k + 1
        Loop
   
        For j = 0 To cls_Nb - 1
            cls_rkey(j + N - nb) = cls_fkey(j)
        Next
   
        i = cls_Nb
 
        Do While i < N - cls_Nb
            k = N - cls_Nb - i
 
            For j = 0 To cls_Nb - 1
                cls_rkey(k + j) = InvMixCol(cls_fkey(i + j))
            Next
  
            i = i + cls_Nb
        Loop
   
        j = N - cls_Nb
 
        Do While j < N
            cls_rkey(j - N + cls_Nb) = cls_fkey(j)
            j = j + 1
        Loop
    End Sub
    Private Sub EncryptData(buff())
        Dim i, j, k, m, x, y, t
        Dim a(7), b(7)
   
        For i = 0 To cls_Nb - 1
            j = i * 4
            a(i) = PackFrom(buff, j)
            a(i) = a(i) Xor cls_fkey(i)
        Next
   
        k = cls_Nb
        x = a
        y = b
   
        For i = 1 To cls_Nr - 1
            For j = 0 To cls_Nb - 1
                m = j * 3
                y(j) = cls_fkey(k) Xor cls_ftable(x(j) And cls_lOnBits(7)) Xor _
                ROTL(cls_ftable(SHR(x(cls_fi(m)), 8) And cls_lOnBits(7)), 8) Xor _
                ROTL(cls_ftable(SHR(x(cls_fi(m + 1)), 16) And cls_lOnBits(7)), 16) Xor _
                ROTL(cls_ftable(SHR(x(cls_fi(m + 2)), 24) And cls_lOnBits(7)), 24)
                k = k + 1
            Next
            t = x
            x = y
            y = t
        Next
   
        For j = 0 To cls_Nb - 1
            m = j * 3
            y(j) = cls_fkey(k) Xor cls_fbsub(x(j) And cls_lOnBits(7)) Xor _
            ROTL(cls_fbsub(SHR(x(cls_fi(m)), 8) And cls_lOnBits(7)), 8) Xor _
            ROTL(cls_fbsub(SHR(x(cls_fi(m + 1)), 16) And cls_lOnBits(7)), 16) Xor _
            ROTL(cls_fbsub(SHR(x(cls_fi(m + 2)), 24) And cls_lOnBits(7)), 24)
            k = k + 1
        Next
   
        For i = 0 To cls_Nb - 1
            j = i * 4
            UnpackFrom y(i), buff, j
            x(i) = 0
            y(i) = 0
        Next
    End Sub
    Private Sub DecryptData(buff())
        Dim i, j, k, m, x, y, t
        Dim a(7), b(7)
   
        For i = 0 To cls_Nb - 1
            j = i * 4
            a(i) = PackFrom(buff, j)
            a(i) = a(i) Xor cls_rkey(i)
        Next
   
        k = cls_Nb
        x = a
        y = b
   
        For i = 1 To cls_Nr - 1
            For j = 0 To cls_Nb - 1
                m = j * 3
                y(j) = cls_rkey(k) Xor cls_rtable(x(j) And cls_lOnBits(7)) Xor _
                ROTL(cls_rtable(SHR(x(cls_ri(m)), 8) And cls_lOnBits(7)), 8) Xor _
                ROTL(cls_rtable(SHR(x(cls_ri(m + 1)), 16) And cls_lOnBits(7)), 16) Xor _
                ROTL(cls_rtable(SHR(x(cls_ri(m + 2)), 24) And cls_lOnBits(7)), 24)
                k = k + 1
            Next
            t = x
            x = y
            y = t
        Next
   
        For j = 0 To cls_Nb - 1
            m = j * 3
            y(j) = cls_rkey(k) Xor cls_rbsub(x(j) And cls_lOnBits(7)) Xor _
            ROTL(cls_rbsub(SHR(x(cls_ri(m)), 8) And cls_lOnBits(7)), 8) Xor _
            ROTL(cls_rbsub(SHR(x(cls_ri(m + 1)), 16) And cls_lOnBits(7)), 16) Xor _
            ROTL(cls_rbsub(SHR(x(cls_ri(m + 2)), 24) And cls_lOnBits(7)), 24)
            k = k + 1
        Next
   
        For i = 0 To cls_Nb - 1
            j = i * 4
            UnpackFrom y(i), buff, j
            x(i) = 0
            y(i) = 0
        Next
    End Sub
    Public Function Encrypt(a_sMsg, a_sPassword)
        Dim bytKey(31)
        Dim bytTemp(31)
        Dim bytLen(3)
        Dim bytIn()
        Dim bytOut()
        Dim lCount, lLength, lEncodedLength, lPosition
        Dim bytMessage
        Dim sResult
        lLength = Len(a_sMsg)
        ReDim bytMessage(lLength-1)
 
        For lCount = 1 To lLength
            bytMessage(lCount-1)=CByte(AscB(Mid(a_sMsg,lCount,1)))
        Next
        lLength = Len(a_sPassword)
        ReDim bytPassword(lLength-1)
        For lCount = 1 To lLength
            bytPassword(lCount-1)=CByte(AscB(Mid(a_sPassword,lCount,1)))
        Next
        If Not IsInitialized(bytMessage) Then
            Exit Function
        End If
 
        If Not IsInitialized(bytPassword) Then
            Exit Function
        End If
        For lCount = 0 To UBound(bytPassword)
            bytKey(lCount) = bytPassword(lCount)
            If lCount = 31 Then
                Exit For
            End If
        Next
   
        Call genTables()
        Call gKey(8, 8, bytKey)
        lLength = UBound(bytMessage) + 1
        lEncodedLength = lLength + 4
   
        If lEncodedLength Mod 32 <> 0 Then
            lEncodedLength = lEncodedLength + 32 - (lEncodedLength Mod 32)
        End If
  
        ReDim bytIn(lEncodedLength - 1)
        ReDim bytOut(lEncodedLength - 1)
        Unpack lLength, bytIn
        CopyBytesASP bytIn, 4, bytMessage, 0, lLength
        For lCount = 0 To lEncodedLength - 1 Step 32
            CopyBytesASP bytTemp, 0, bytIn, lCount, 32
            EncryptData bytTemp
            CopyBytesASP bytOut, lCount, bytTemp, 0, 32
        Next
        sResult = ""
 
        For lCount = 0 To UBound(bytOut)
            sResult = sResult & Right("0" & Hex(bytOut(lCount)), 2)
        Next
        Encrypt = sResult
    End Function
    Public Function Decrypt(a_sIn, a_sPassword)
        Dim bytMessage(), bytOut()
        Dim bytKey(31), bytTemp(31), bytIn, bytPassword, bytLen(3)
        Dim lCount, lLength, lEncodedLength, lPosition
        Dim sResult, sMsg : sMsg = Trim(a_sIn)
        Dim iCount
        If sMsg="" Or IsEmpty(sMsg) Or IsNull(sMsg) Then
            Exit Function
        End If
        lLength = Len(sMsg)
        ReDim bytIn(lLength/2-1)
        iCount = 0
       
        For lCount = 1 To lLength Step 2
            bytIn(iCount) = CByte(Int("&H" & Mid(sMsg, lCount,2)))
            iCount = iCount + 1
        Next
        lLength = Len(a_sPassword)
        ReDim bytPassword(lLength-1)
        For lCount = 1 To lLength
            bytPassword(lCount-1)=CByte(AscB(Mid(a_sPassword,lCount,1)))
        Next
        If Not IsInitialized(bytIn) Then
            Exit Function
        End If
        If Not IsInitialized(bytPassword) Then
            Exit Function
        End If
        lEncodedLength = UBound(bytIn) + 1
        If Int(lEncodedLength) Mod 32 <> 0 Then
            Exit Function
        End If
   
        For lCount = 0 To UBound(bytPassword)
            bytKey(lCount) = bytPassword(lCount)
            If lCount = 31 Then
                Exit For
            End If
        Next
   
        Call genTables()
        Call gKey(8, 8, bytKey)
        ReDim bytOut(lEncodedLength - 1)
 
        For lCount = 0 To lEncodedLength - 1 Step 32
            CopyBytesASP bytTemp, 0, bytIn, lCount, 32
            DecryptData bytTemp
            CopyBytesASP bytOut, lCount, bytTemp, 0, 32
        Next
        lLength = Pack(bytOut)
        If lLength > lEncodedLength - 4 Then
            Exit Function
        End If
   
        ReDim bytMessage(lLength - 1)
        CopyBytesASP bytMessage, 0, bytOut, 4, lLength
        lLength = UBound(bytMessage)
        sResult = ""
 
        For lCount = 0 To lLength
            sResult = sResult & Chr(bytMessage(lCount))
        Next
        Decrypt = sResult
    End Function
End Class
%>

0
投稿

猜你喜欢

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