kNamev:          需要加密的字符串
kPass:           密码串Function KeyGen(kNamev As String, kPass As String) As String
    On Error Resume Next         'still here just as a precaution
    
    Dim kName As String
    Dim nKeys(16) As Double     'xor keys used for pArray(x) xor nkeys(x)
    Dim nArray(16) As Double    'name array data
    Dim pArray(16) As Double    'password array data
    Dim N As Double             'for next loop counter
    Dim nPtr As Double          'name pointer (used for counting)
    Dim cPtr As Double          'character pointer (used for counting)
    Dim cFlip As Boolean         'character flip (used to flip between numeric and alpha)
    Dim sIni As Double          'holds s-box values
    Dim temp As Double          'holds s-box values
    Dim rtn As Double           'holds generated key values used agains chr map
    Dim gKey As String           'generated key as string
    Dim nLen As Double          'number of chr's in name
    Dim pLen As Double          'number of chr's in password
    Dim kPtr As Double          'key pointer
    Dim sPtr As Double          'space pointer (used in hex key)
    Dim nOffset As Double       'name offset
    Dim pOffset As Double       'password offset
    Dim tOffset As Double       'total offset
    Dim KeySize As Double       'the size of the key to make    Const nXor As Double = 25   'name xor value
    Const pXor As Double = 18   'password xor value
    Const cLw As Double = 65    'character lower limit 65 = A ** do not change **
    Const nLw As Double = 48    'number lower limit 48 = 0 ** do not change **
    Const sOffset As Double = 0 'character map offset    kName = kNamev
    nLen = Len(kName)
    pLen = Len(kPass)    'password xor keys ** change to make keygen unique **
    nKeys(1) = 42
    nKeys(2) = 0
    nKeys(3) = 15
    nKeys(4) = 25
    nKeys(5) = 200
    nKeys(6) = 1
    nKeys(7) = 22
    nKeys(8) = 99    sIni = 0
    
    KeySize = 8
    gKey = String(19, " ")
   
    
    kPtr = 1    For N = 1 To nLen 'name
        nArray(kPtr) = nArray(kPtr) + Asc(Mid(kName, N, 1)) Xor nXor
        nOffset = nOffset + nArray(kPtr)
        kPtr = kPtr + 1
        If kPtr = 9 Then kPtr = 1
    Next N    For N = 1 To pLen 'password
        pArray(kPtr) = pArray(kPtr) + Asc(Mid(kPass, N, 1)) Xor pXor
        pOffset = pOffset + pArray(kPtr)
        kPtr = kPtr + 1
        If kPtr = 9 Then kPtr = 1
    Next N    tOffset = (nOffset + pOffset) Mod 512
    kPtr = 1
    sPtr = 1
    For N = 1 To KeySize
        pArray(N) = pArray(N) Xor nKeys(N)
        rtn = Abs(((nArray(N) Xor pArray(N)) Mod 512) - tOffset)
          
        If rtn < 16 Then
            Mid(gKey, kPtr, 2) = "0" & Hex(rtn)
        Else
            Mid(gKey, kPtr, 2) = Hex(rtn)
        End If
            If sPtr = 2 And kPtr < 18 Then
                kPtr = kPtr + 1
                Mid(gKey, kPtr + 1, 1) = "-"
            End If
        kPtr = kPtr + 2
        sPtr = sPtr + 1
        If sPtr = 3 Then sPtr = 1
    Next
    KeyGen = gKey
End Function