使用VBA

时间:2017-09-21 21:43:28

标签: vba algorithm excel-vba encryption xor

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

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

因此,在研究使用什么算法的同时,我从VBA Express遇到了这个极好的XOR算法样本,但是这个特殊算法存在一些局限性(如果我是的话,请纠正我错误):

  1. 对于字符串与密钥的某些组合,会发生溢出;
  2. Excel使用"different" ASCII code table导致一些熵(不能使用前32个代码,因为它们引用了特殊字符);
  3. 我想避免使用特殊字符(换行符,回车符),因为我想写一个文件,如果它们存在,我就无法读取文件,因为拆分会变坏。

    说到这里,我无法保持编码和解码的1对1关系。

    1. 我应该使用其他加密系统,还是应该做些更改来修复这种不良加密?
    2. 我应该使用除逐行之外的其他读/写文件系统吗?
    3. 生成测试密钥的代码

          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
      

0 个答案:

没有答案