我试图使存储在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代码,并添加了解密检查以通过填充验证数据。
答案 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类似乎正在工作,但是以非标准的方式我可能会在以后修复,但是现在这就是我想要的。