Public Function EncryptString(theString As String, TheKey As String) As String
Dim X As Long
Dim eKey As Byte, eChr As Byte, oChr As Byte, tmp$
For i = 1 To Len(TheKey)
'generate a key
eKey = Asc(Mid$(TheKey, i, 1)) Xor eKey
Next
'reset random function
Rnd -1
'initilize our key as the random seed
Randomize eKey
'generate a pseudo old char
oChr = Int(Rnd * 256)
'start encryption
For X = 1 To Len(theString)
pp = pp + 1
If pp > Len(TheKey) Then pp = 1
eChr = Asc(Mid$(theString, X, 1)) Xor _
Int(Rnd * 256) Xor Asc(Mid$(TheKey, pp, 1)) Xor oChr
tmp$ = tmp$ & Chr(eChr)
oChr = eChr
Next
EncryptString = AsctoHex(tmp$)
End Function
Public Function DecryptString(theString As String, TheKey As String) As String
Dim X As Long
Dim eKey As Byte, eChr As Byte, oChr As Byte, tmp$
For i = 1 To Len(TheKey)
'generate a key
eKey = Asc(Mid$(TheKey, i, 1)) Xor eKey
Next
'reset random function
Rnd -1
'initilize our key as the random seed
Randomize eKey
'generate a pseudo old char
oChr = Int(Rnd * 256)
'start decryption
tmp$ = HexToAsc(theString)
DecryptString = ""
For X = 1 To Len(tmp$)
pp = pp + 1
If pp > Len(TheKey) Then pp = 1
If X > 1 Then oChr = Asc(Mid$(tmp$, X - 1, 1))
eChr = Asc(Mid$(tmp$, X, 1)) Xor Int(Rnd * 256) Xor _
Asc(Mid$(TheKey, pp, 1)) Xor oChr
DecryptString = DecryptString & Chr$(eChr)
Next
End Function
Private Function AsctoHex(ByVal astr As String)
For X = 1 To Len(astr)
hc = Hex$(Asc(Mid$(astr, X, 1)))
nstr = nstr & String(2 - Len(hc), "0") & hc
Next
AsctoHex = nstr
End Function发布于 2012-05-24 11:12:13
您不应该尝试自己实现这样的加密。这是很难做到正确的,并且很容易意外地构建漏洞。
找到一个已被证明有效且经过大量测试的现有解决方案会更容易、更安全。This可能是一个更好的解决方案。
发布于 2012-05-24 11:13:13
这里面有几个缺陷:
如果你想在不同的系统上解密,而不是在加密的系统上解密(或者如果你更新你的系统,...),你会遇到麻烦:使用以下一组对Rnd的调用的Randomize eKey不能保证在重启后返回相同的序列。它绝对不会在不同的系统上返回相同的序列。
您将密码减少为一个8位值(eKey),因此您的加密具有8位的实际密钥长度。
简而言之:任何人只要克隆你的DecryptString函数并用eKey=0..255运行它,就可以访问与你的系统足够相似的系统(即你的解密实际上会产生明文的系统)。
忘了它,使用一些有效的东西。阅读.
https://stackoverflow.com/questions/10730548
复制相似问题