VB6使用密码加密文本
Posted
技术标签:
【中文标题】VB6使用密码加密文本【英文标题】:VB6 encrypt text using password 【发布时间】:2011-08-11 12:13:31 【问题描述】:寻找一个简单的文本加密/解密VB6代码。理想情况下,该解决方案应该接受(text, password)
参数并产生可读的输出(没有任何特殊字符),因此它可以在任何地方使用而不会出现编码问题。
有很多可用于 .NET 的代码,但对于旧版 VB6,我能找到的代码并不多。到目前为止我发现的只有这个:http://www.devx.com/vb2themax/Tip/19211
【问题讨论】:
如果您不介意第 3 方 ebcrypt.com 非常棒且完全免费。 使用任何你能找到好的 VB6 库的好的加密(没有这方面的经验,所以无能为力)并使用 base64 编码将二进制输出转换为 ASCII。这应该可以解决您在使用“特殊”字符时可能遇到的任何问题。 @Alex K.:网站有点吓人……还有官方消息吗? 【参考方案1】:我正在使用这样的 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。
【讨论】:
这个解决方案非常适合我正在寻找的东西 - 非常感谢! 很好,但是如何解密? 找到了!谢谢Debug.Print CryptRC4(FromHexDump(sSecret), "password")
我至少从 2014 年开始在美国使用它。在亚洲的计算机上运行时我遇到了问题,可能与他们计算机上的 Unicode 设置有关,即使我正在解密相同的 8-位串。解决方案是将所有Chr$()
和Asc()
调用替换为ChrW()
和AscW()
。我希望这可以为您和您的客户节省一些挫败感。【参考方案2】:
MD5 将文本和密码加在一起作为单向哈希(然后检查,您再次加密并与存储的哈希进行比较。(如果您必须再次解密,这将不起作用)
【讨论】:
此方法用于生成“键控”哈希,由于多种原因不安全(请参阅链接中的“设计原则”以获得简短概述)。实现安全密钥哈希的最简单方法很可能是 HMAC (secure.wikimedia.org/wikipedia/en/wiki/Hmac)。 是的,我忘记了有更好的哈希用于此目的。 vb.wikia.com/wiki/SHA-CryptoAPI.bas --CryptoAPI
在 VB6 中基于 MD5/SHA1 哈希(仅限)【参考方案3】:
这是我的加密课程。我使用几个常量来定义加密密钥,因为在我看来,有人试图反编译代码以找到它会更安全一些。密码学不是我的事,所以也许我在开玩笑。无论如何,我在从其他程序调用的 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
【讨论】:
以上是关于VB6使用密码加密文本的主要内容,如果未能解决你的问题,请参考以下文章