我需要以字符串格式[0-9a-zA-Z + /]解密base64编码的二进制文件。该字符串的一部分由ivSalt组成,它是第一个16字节或128位。其余的是数据;所有内容都使用AES加密,128键和128 CBC块和PKCS7Padding。
首先,字符串需要转换为二进制文件:
<cfset b64 = ToBinary(enc)/>
然后我们创建一个java字节缓冲区:
<cfset objByteBuffer = CreateObject(
"java",
"java.nio.ByteBuffer") />
然后我们初始化salt的缓冲区和缓冲区以获取需要解密的数据。
<cfset objBufferA = objByteBuffer.Allocate(
JavaCast( "int", 16 )) />
<cfset objBufferB = objByteBuffer.Allocate(
JavaCast( "int", (Len(b64)-16) )) />
然后我们用字节填充缓冲区。
<cfset objBufferA.Put(
b64,
JavaCast( "int", 0 ),
JavaCast( "int", 16 )) />
<cfset objBufferB.Put(
b64,
JavaCast( "int", 16 ),
JavaCast( "int", (Len(b64)-16) )) />
<cfset ivStringBin = objBufferA.Array()/>
<cfset dataStringBin = objBufferB.Array()/>
因为decrypt函数采用十六进制字符串,我们需要将其编码为十六进制。
<!--- create byteArray output stream --->
<cfset baos = createObject("java", "java.io.ByteArrayOutputStream")>
<!--- write the byteArray stored in the DB to the output stream --->
<cfset baos.write(ivStringBin)>
<!--- convert binary content to text string --->
<cfset ivString=BinaryEncode(baos.toByteArray(),"hex")/>
<!--- create byteArray output stream --->
<cfset baos2 = createObject("java", "java.io.ByteArrayOutputStream")>
<!--- write the byteArray stored in the DB to the output stream --->
<cfset baos2.write(dataStringBin)>
<!--- convert binary content to text string --->
<cfset dataString=BinaryEncode(baos2.toByteArray(),"hex")/>
应该是:
<cfset dataString=BinaryEncode(baos2.toByteArray(),"base64")/>
现在我不确定如何处理密钥,但似乎需要采用十六进制字符串格式。
<cfset key = BinaryEncode(ToBinary("{16 chars, [0-9a-zA-Z+/]}")/>
应该是:
<cfset key = "{32 chars, [0-9A-Z]}"/>
ColdFusion本身不支持使用CBC的PKCS7Padding,我得到一个不受支持的提供程序错误。所以我去安装BouncyCastle,我发现了一个很棒的ColdFusion示例,说明如何使用PKCS5Pad解密,在PHP中对加密字符串进行加密/重新加密“&gt;这里。我将它添加到我的代码中但是我需要PKCS7Padding所以我改变了
var zbPadding = CreateObject('java', 'org.bouncycastle.crypto.paddings.ZeroBytePadding').init();
到
var zbPadding = CreateObject('java', 'org.bouncycastle.crypto.paddings.PKCS7Padding').init();
有了这一切,我得到了错误:
"Key length not 128/160/192/224/256 bits."
我将继续尝试,但我完全陷入困境,我无法弄清楚我做错了什么。
编辑1:
我搞定了!
编辑2: 另外,要安装Bouncy Castle,我按照bouncy castle installe instructions并从java downloads 页面的底部下载了jce。
答案 0 :(得分:1)
我开始工作了!
dataString需要在base64而不是hex。
当使用coldFusion转换为十六进制时,密钥是24 [0-9A-F]个字符,表示24x4 = 96位,即12个字节。它需要是16字节,所以BinaryEncode(ToBinary())函数不能完成它的工作。所以我用一个字符串到十六进制工具来转换它,然后得到32个字符。 编辑2:另外,为了安装Bouncy Castle,我遵循了充气城堡的安装说明,并从java下载页面的底部下载了jce。