VB6使用密码加密文本

时间:2011-08-11 12:13:32

标签: string encryption vb6 passwords

寻找简单的文本加密/解密VB6代码。理想情况下,解决方案应该接受(text, password)参数并生成可读输出(没有任何特殊字符),因此可以在任何地方使用它而不会出现编码问题。

有很多可用于.NET的代码,但对于旧版VB6我找不到多少代码。到目前为止我才找到这个:http://www.devx.com/vb2themax/Tip/19211

3 个答案:

答案 0 :(得分:14)

我正在使用这样的RC4实现

Option Explicit

Private Sub Command1_Click()
    Dim sSecret     As String

    sSecret = ToHexDump(CryptRC4("a message here", "password"))
    Debug.Print sSecret
    Debug.Print CryptRC4(FromHexDump(sSecret), "password")
End Sub

Public Function CryptRC4(sText As String, sKey As String) As String
    Dim baS(0 To 255) As Byte
    Dim baK(0 To 255) As Byte
    Dim bytSwap     As Byte
    Dim lI          As Long
    Dim lJ          As Long
    Dim lIdx        As Long

    For lIdx = 0 To 255
        baS(lIdx) = lIdx
        baK(lIdx) = Asc(Mid$(sKey, 1 + (lIdx Mod Len(sKey)), 1))
    Next
    For lI = 0 To 255
        lJ = (lJ + baS(lI) + baK(lI)) Mod 256
        bytSwap = baS(lI)
        baS(lI) = baS(lJ)
        baS(lJ) = bytSwap
    Next
    lI = 0
    lJ = 0
    For lIdx = 1 To Len(sText)
        lI = (lI + 1) Mod 256
        lJ = (lJ + baS(lI)) Mod 256
        bytSwap = baS(lI)
        baS(lI) = baS(lJ)
        baS(lJ) = bytSwap
        CryptRC4 = CryptRC4 & Chr$((pvCryptXor(baS((CLng(baS(lI)) + baS(lJ)) Mod 256), Asc(Mid$(sText, lIdx, 1)))))
    Next
End Function

Private Function pvCryptXor(ByVal lI As Long, ByVal lJ As Long) As Long
    If lI = lJ Then
        pvCryptXor = lJ
    Else
        pvCryptXor = lI Xor lJ
    End If
End Function

Public Function ToHexDump(sText As String) As String
    Dim lIdx            As Long

    For lIdx = 1 To Len(sText)
        ToHexDump = ToHexDump & Right$("0" & Hex(Asc(Mid(sText, lIdx, 1))), 2)
    Next
End Function

Public Function FromHexDump(sText As String) As String
    Dim lIdx            As Long

    For lIdx = 1 To Len(sText) Step 2
        FromHexDump = FromHexDump & Chr$(CLng("&H" & Mid(sText, lIdx, 2)))
    Next
End Function

Command1输出:

9ED5556B3F4DD5C90471C319402E
a message here

您可能需要在FromHexDump上更好地处理错误。

更新(2018-05-04)

对于更强大的AES 256位加密(在ECB模式下)和正确处理unicode文本/密码,您可以查看mdAesEcb.bas模块(~380 LOC)中实现的Simple AES 256-bit password protected encryption

答案 1 :(得分:0)

MD5sum将文本和密码一起作为单向散列(然后进行检查,再次加密并与存储的散列进行比较。(如果你必须再次解密,这将不起作用)

答案 2 :(得分:0)

这是我的加密类。我使用几个常量来定义加密密钥,因为在我看来,对于试图反编译代码以找到它的人来说,它更安全一些。密码学不是我的事,所以也许我在开玩笑。无论如何,我在从其他程序调用的ActiveX dll中使用此类进行加密,而在单独的dll中反向进行解密。我是这样做的,所以不应该看到加密数据的人甚至没有dll来进行解密。将关键常量更改为您想要的(5长)。我使用混合包括不可打印的字符,到目前为止它对我来说效果很好。 CAPICOM是Windows®的一部分,因此您无需分发。

Option Explicit

Private m_oENData As CAPICOM.EncryptedData

'combine these constants to build the encryption key
Private Const KEY1 = "12345"
Private Const KEY2 = "67890"
Private Const KEY3 = "abcde"
Private Const KEY4 = "fghij"
Private Const KEY5 = "klmno"

Private Sub Class_Initialize()

   On Error Resume Next

   Set m_oENData = New CAPICOM.EncryptedData
   If Err.Number <> 0 Then
      If Err.Number = 429 Then
         Err.Raise Err.Number, App.EXEName, "Failed to create the capi com object. " & _
               "Check that the capicom.dll file is installed and properly registered."
      Else
         Err.Raise Err.Number, Err.Source, Err.Description
      End If
   End If

End Sub

Private Sub Class_Terminate()

   Set m_oENData = Nothing

End Sub

Public Function EncryptAsBase64(ByVal RawString As String) As String
   EncryptAsBase64 = Encrypt(RawString, CAPICOM_ENCODE_BASE64)
End Function

Public Function EncryptAsBinary(ByVal RawString As String) As String
   EncryptAsBinary = Encrypt(RawString, CAPICOM_ENCODE_BINARY)
End Function

Private Function Encrypt(ByVal s As String, ByVal EncryptionType As CAPICOM.CAPICOM_ENCODING_TYPE) As String
   Dim oEN As New CAPICOM.EncryptedData
   Dim intENCType As CAPICOM.CAPICOM_ENCRYPTION_ALGORITHM
   Dim strSecret As String
   Dim intTries As Integer

   On Error GoTo errEncrypt

   intENCType = CAPICOM_ENCRYPTION_ALGORITHM_AES ' try this first and fall back if not supported

   With oEN
startEncryption:
      .Algorithm = intENCType
      strSecret = KEY2 & KEY5 & KEY4 & KEY1 & KEY3
      .SetSecret strSecret
      strSecret = ""
      .Content = s
      ' the first encryption type needs to be base64 as the .content property
      ' can loose information if I try to manipulate a binary string
      .Content = StrReverse(.Encrypt(CAPICOM_ENCODE_BASE64))
      strSecret = KEY1 & KEY4 & KEY3 & KEY2 & KEY5
      .SetSecret strSecret
      strSecret = ""
      Encrypt = .Encrypt(EncryptionType)
   End With

   Set oEN = Nothing

   Exit Function

errEncrypt:
   If Err.Number = -2138568448 Then
      ' if this is the first time the step the encryption back and try again
      If intTries < 1 Then
         intTries = intTries + 1
         intENCType = CAPICOM_ENCRYPTION_ALGORITHM_3DES
         Resume startEncryption
      End If
   End If

   Err.Raise Err.Number, Err.Source & ":Encrypt", Err.Description
   strSecret = ""
   Set oEN = Nothing

End Function