基于VBA的无特殊字符异或算法
对于我正在开发的项目,我需要使用某种加密算法来加密一些敏感数据,其中每个用户都有一个唯一的十六进制密钥 基本上,我必须加密一个字符串并将其写入一个文件以导入Access数据库(我们无权使用其他RDBMS,因为公司政策不允许这样做) 因此,在研究使用什么算法时,我遇到了一个非常棒的XOR算法示例,但是这个特定算法有一些局限性(如果我错了,请纠正我):基于VBA的无特殊字符异或算法,vba,algorithm,excel,encryption,xor,Vba,Algorithm,Excel,Encryption,Xor,对于我正在开发的项目,我需要使用某种加密算法来加密一些敏感数据,其中每个用户都有一个唯一的十六进制密钥 基本上,我必须加密一个字符串并将其写入一个文件以导入Access数据库(我们无权使用其他RDBMS,因为公司政策不允许这样做) 因此,在研究使用什么算法时,我遇到了一个非常棒的XOR算法示例,但是这个特定算法有一些局限性(如果我错了,请纠正我): 对于字符串与键的某些组合,会发生溢出 Excel使用了一个会导致一些熵(不能使用前32个代码,因为它们引用特殊字符) 我想避免使用特殊字符(换行符、
Private Sub getDictionaryValues()
Dim atc As String
Dim wsheet As Worksheet
Dim wstmp As Worksheet
Dim rng As Range
Dim k As Long, j As Long
Dim arrrr(1 To 223) As String
Dim arc()
On Error Resume Next
j = 2
Set wsheet = ThisWorkbook.Worksheets("Sheet4")
arc = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")
For i = 33 To 255
arrrr(i - 32) = Chr(i)
Next i
For k = LBound(arc) To UBound(arc)
For i = LBound(arrrr) To UBound(arrrr)
atc = XorC(arrrr(i), arc(k))
wsheet.Range(Cells(j, 1), Cells(j, 1)) = arc(k)
wsheet.Range(Cells(j, 2), Cells(j, 2)) = i + 32
wsheet.Range(Cells(j, 3), Cells(j, 3)) = arrrr(i)
wsheet.Range(Cells(j, 4), Cells(j, 4)) = Right(atc, Len(atc) - 3)
wsheet.Cells(j, 5) = XorC(atc, arc(k))
'wsheet.Cells(j, 6) = getUnicode(arrrr(i), arc(k))
j = j + 1
Next i
atc = vbNullString
Next k
End Sub
我的Xor算法版本
Function XorC(ByVal sData As String, ByVal sKey As String) As String
Dim l As Long, i As Long, byIn() As Byte, byOut() As Byte, byKey() As Byte
Dim bEncOrDec As Boolean
Dim addVal
If Len(sData) = 0 Or Len(sKey) = 0 Then XorC = "Invalid argument(s) used": Exit Function
If Left$(sData, 3) = "xxx" Then
bEncOrDec = False 'decryption
sData = Mid$(sData, 4)
Else
bEncOrDec = True 'encryption
End If
byIn = sData
byOut = sData
byKey = sKey
If bEncOrDec = True Then
addVal = 32
Else
addVal = 1 * -32
End If
l = LBound(byKey)
For i = LBound(byIn) To UBound(byIn) - 1 Step 2
If (((byIn(i) + Not bEncOrDec) Xor byKey(l)) + addVal) > 255 Then
byOut(i) = (((byIn(i) + Not bEncOrDec) Xor byKey(l)) + addVal) Mod 255 + addVal
Else
'If bEncOrDec Then
If ((byIn(i) + Not bEncOrDec) Xor byKey(l)) - addVal < 32 Then byOut(i) = ((byIn(i) + Not bEncOrDec) Xor byKey(l)) + addVal
If ((byIn(i) + Not bEncOrDec) Xor byKey(l)) - addVal > 255 Then byOut(i) = ((byIn(i) + Not bEncOrDec) Xor byKey(l)) - addVal
If ((byIn(i) + Not bEncOrDec) Xor byKey(l)) > 32 And (byIn(i) + Not bEncOrDec) Xor byKey(l) < 256 Then byOut(i) = ((byIn(i) + Not bEncOrDec) Xor byKey(l))
End If
l = l + 2
If l > UBound(byKey) Then l = LBound(byKey)
Next i
XorC = byOut
If bEncOrDec Then XorC = "xxx" & XorC 'add "xxx" onto encrypted text
End Function
函数XorC(ByVal sData作为字符串,ByVal sKey作为字符串)作为字符串
Dim l为Long,i为Long,byIn()为Byte,byOut()为Byte,byKey()为Byte
Dim bEncOrDec为布尔型
Dim addVal
如果Len(sData)=0或Len(sKey)=0,则XorC=“使用的参数无效”:退出函数
如果左$(sData,3)=“xxx”,则
bEncOrDec=False'解密
sData=Mid$(sData,4)
其他的
bEncOrDec=True'加密
如果结束
byIn=sData
byOut=sData
byKey=sKey
如果bEncOrDec=True,则
addVal=32
其他的
addVal=1*-32
如果结束
l=磅(按键)
对于i=LBound(byIn)到UBound(byIn)-1步骤2
如果(((byIn(i)+Not bEncOrDec)Xor byKey(l))+addVal)>255,则
byOut(i)=(((byIn(i)+非bEncOrDec)Xor byKey(l))+addVal)Mod 255+addVal
其他的
“如果是bEncOrDec那么
如果((byIn(i)+Not bEncOrDec)Xor byKey(l))-addVal<32,则byOut(i)=((byIn(i)+Not bEncOrDec)Xor byKey(l))+addVal
如果((byIn(i)+Not bEncOrDec)Xor byKey(l))-addVal>255,则byOut(i)=((byIn(i)+Not bEncOrDec)Xor byKey(l))-addVal
如果((byIn(i)+Not bEncOrDec)Xor byKey(l))>32和(byIn(i)+Not bEncOrDec)Xor byKey(l)<256,则byOut(i)=((byIn(i)+Not bEncOrDec)Xor byKey(l))
如果结束
l=l+2
如果l>UBound(按键),则l=LBound(按键)
接下来我
XorC=byOut
如果是bEncOrDec,则XorC=“xxx”&XorC'将“xxx”添加到加密文本中
端函数
此加密算法与非常类似,并且容易损坏。只使用AES。不确定特殊字符,但发现了这个VBA AES示例:您需要对输出进行编码以避免这些特殊字符。十六进制编码的Base64将处理该问题。文本数据类型用于文本。加密的结果不是文本,甚至不一定与文本数据类型兼容。如果要将加密结果转换为文本,请使用base 64或类似版本。如果要加密的数据的格式不可识别或限制,则XOR可以是100%加密安全且易于实现的。这就是所谓的。也就是说,看起来像“秘密号码:012345”的数据不起作用,但看起来像“hcv03e59w6”的数据可能起作用。