Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于VBA的无特殊字符异或算法_Vba_Algorithm_Excel_Encryption_Xor - Fatal编程技术网

基于VBA的无特殊字符异或算法

基于VBA的无特殊字符异或算法,vba,algorithm,excel,encryption,xor,Vba,Algorithm,Excel,Encryption,Xor,对于我正在开发的项目,我需要使用某种加密算法来加密一些敏感数据,其中每个用户都有一个唯一的十六进制密钥 基本上,我必须加密一个字符串并将其写入一个文件以导入Access数据库(我们无权使用其他RDBMS,因为公司政策不允许这样做) 因此,在研究使用什么算法时,我遇到了一个非常棒的XOR算法示例,但是这个特定算法有一些局限性(如果我错了,请纠正我): 对于字符串与键的某些组合,会发生溢出 Excel使用了一个会导致一些熵(不能使用前32个代码,因为它们引用特殊字符) 我想避免使用特殊字符(换行符、

对于我正在开发的项目,我需要使用某种加密算法来加密一些敏感数据,其中每个用户都有一个唯一的十六进制密钥

基本上,我必须加密一个字符串并将其写入一个文件以导入Access数据库(我们无权使用其他RDBMS,因为公司政策不允许这样做)

因此,在研究使用什么算法时,我遇到了一个非常棒的XOR算法示例,但是这个特定算法有一些局限性(如果我错了,请纠正我):

  • 对于字符串与键的某些组合,会发生溢出
  • Excel使用了一个会导致一些熵(不能使用前32个代码,因为它们引用特殊字符) 我想避免使用特殊字符(换行符、回车符),因为我想写入文件,如果它们存在,我就无法读取文件,因为拆分会出错

    话虽如此,我无法维持编码和解码的1:1关系

  • 那么,我应该使用其他加密系统,还是应该进行更改以修复此错误的加密
  • 我是否应该使用除逐行读取/写入文件系统之外的其他读取/写入文件系统
  • 生成要测试的密钥的代码

        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”的数据可能起作用。