ColdFusion和MS Access之间的加密

时间:2014-07-07 17:33:57

标签: vba encryption coldfusion access-vba

我试图使存储在MSSQL数据库中的数据在Access 2013和ColdFusion中加密/解密成为可能。 Access数据库使用vba将数据同步到SQL数据库,我发现了一些可能的加密解决方案,但似乎无法使结果与ColdFusion中加密的相同内容相匹配。

www.ebcrypt.com似乎是最简单的,但是当我用Blowfish,RIJNDAEL或任何其他方法加密时,结果与我在ColdFusion中加密的结果不同。

我决定尝试使用原生的CryptoAPI,但当我尝试匹配vba在ColdFusion中所做的事情时会发生同样的事情我会不断得到不同的结果。

我想知道我正在使用的vba或ColdFusion方法是否正在接收我传入的密钥并对其进行转换以使其不再匹配。我已经尝试手动设置密钥,甚至用ColdFusion生成密钥,然后在vba代码中设置它以匹配没有运气。

尝试使用RC4的ColdFusion代码:

<cfset test_key = "ZXNlmehY30y3ophXVJ0EJw==">

<cfset encryptedString = Encrypt("CF String",test_key, "RC4")>
<cfoutput>
    Encrypted String: #encryptedString#<br />
    Encryption Key: #test_key#  
</cfoutput>

具有相同设置的VBA代码:(clsCryptoFilterBox代码为here) 注意:看来这默认为RC4,这就是我在上面的ColdFusion中使用它的原因。

Dim encrypted As clsCryptoFilterBox
Set encrypted = New clsCryptoFilterBox

encrypted.Password = "ZXNlmehY30y3ophXVJ0EJw=="
encrypted.InBuffer = "CF String"
encrypted.Encrypt

MsgBox ("Encrypted: " & encrypted.OutBuffer)

编辑:好的,更多信息。我发现ColdFusion需要base64中的密钥,即使变量test_key 应该已经有效,但显然base64编码字符串的输出与编码到base64中的其他文本不一样。

编辑2:我使用this website.

文件中的Blowfish算法进行了工作

这是我的CF代码:

<cfset test_key = toBase64("1234567812345678")>

<cfset encryptedString = Encrypt("CF String", test_key, "RC4", "HEX")>
<cfoutput>
    Encrypted String: #encryptedString#<br />
    Encryption Key: #test_key#  
</cfoutput>

哪个输出:

Encrypted String: F8B519877DC3B7C997
Encryption Key: MTIzNDU2NzgxMjM0NTY3OA== 

我不得不修改VBA中的代码以使用PKCS7进行填充,但是一旦我这样做,我就能够验证它是否正常工作。如果有人有兴趣,我可以将我的更改发布到修改了填充的VBA代码,并添加了解密检查以通过填充验证数据。

1 个答案:

答案 0 :(得分:1)

我发现在测试应用程序on this download site中打包了一个不错的Blowfish算法,它实际上可以进行一些修改。

使用空格来填充输入文本,这不是ColdFusion正在做的事情,因此这使加密字符串变得不同。 CF使用的字节加密的标准加密,它们都是相同的,并设置为正在使用的填充字节数。

新的EncryptString()函数:

Public Function EncryptString(ByVal tString As String, Optional ConvertToHEX As Boolean) As String

Dim ReturnString As String, PartialString As String * 8
Dim tPaddingByte As String
Dim tStrLen As Integer
Dim tBlocks As Integer
Dim tBlockPos As Integer

tStrLen = Len(tString)

'Divide the length of the string by the size of each block and round up
tBlocks = (-Int(-tStrLen / 8))

tBlockPos = 1

Do While tString <> ""

  'Check that we are not on the last block
  If tBlockPos <> tBlocks Then
    'Not on the last block so the string should be over 8 bytes, no need to pad
    PartialString = Left$(tString, 8)
  Else
    'Last block, we need to pad
    'Check to see if the last block is 8 bytes so we can create a new block
    If Len(tString) = 8 Then
      'Block is 8 bytes so add an extra block of padding
      tString = tString & String(8, Chr(8))
      tPaddingByte = " " 'Not really necessary, just keeps the String() function below happy
    Else
      'Set the value of the padding byte to the number of padding bytes
      tPaddingByte = Chr(8 - Len(tString))
    End If

    PartialString = Left$(tString & String(8, tPaddingByte), 8)

  End If

  ReturnString = ReturnString & Encrypt(PartialString)
  tString = Mid$(tString, 9)
  tBlockPos = tBlockPos + 1
Loop

If ConvertToHEX = True Then
  EncryptString = ToHEX(ReturnString)
    Else
  EncryptString = ReturnString
End If

End Function

由于填充不仅仅是空格,因此需要在解密时将其删除,但有一种简单的方法可以使整个过程更加完美。您读取最后一个字节,然后用它验证其他填充字节。

Public Function DecryptString(ByVal tString As String, Optional ConvertFromHEX As Boolean) As String

Dim ReturnString As String, PartialString As String * 8
Dim tPos As Integer
Dim tPadCount As Integer

If ConvertFromHEX = True Then
  tString = HexToString(tString)
End If

Do While tString <> ""
  PartialString = Left$(tString, 8)
  ReturnString = ReturnString & Decrypt(PartialString)
  tString = Mid$(tString, 9)
Loop

'Check the last byte and verify the padding and then remove it
tPadCount = ToHEX(Right(ReturnString, 1))

If tPadCount < 8 Or tPadCount > 1 Then
  'Get all the padding bytes and verify them
  Dim tPaddingBytes As String
  tPaddingBytes = Right(ReturnString, tPadCount)
  Dim i As Integer
  For i = 1 To tPadCount
    If Not tPadCount = Int(ToHEX(Left(tPaddingBytes, 1))) Then
      MsgBox "Error while decrypting: Padding byte incorrect (" & tPadCount & ")"
      GoTo Done
    End If
  Next i

  ReturnString = Left(ReturnString, Len(ReturnString) - tPadCount)

Else
  MsgBox "Error while decrypting: Last byte incorrect (" & tPadCount & ")"
End If

Done:

DecryptString = ReturnString

End Function

我能够导出类模块,并可以将其导入到任何其他可能需要基本加密的项目中。有一个Rijndael类似乎正在工作,但是以非标准的方式我可能会在以后修复,但是现在这就是我想要的。