我需要以字符串格式 [0-9a-zA-Z+/] 解密 base64 编码的二进制文件。该字符串的一部分由 ivSalt 组成,即前 16 个字节或 128 位。剩下的就是数据;一切都使用带有 128 个 key 和 128 个 CBC block 和 PKCS7Padding 的 AES 加密。
首先需要将字符串转换为二进制:
<cfset b64 = ToBinary(enc)/>
然后我们创建一个java字节缓冲区:
<cfset objByteBuffer = CreateObject(
"java",
"java.nio.ByteBuffer") />
然后我们为盐初始化一个缓冲区,为需要解密的数据初始化一个缓冲区。
<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()/>
因为解密函数需要一个十六进制字符串,所以我们需要将其编码为十六进制。
<!--- 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")/>
现在我不确定如何处理 key ,但它似乎需要采用十六进制字符串格式。
<cfset key = BinaryEncode(ToBinary("{16 chars, [0-9a-zA-Z+/]}")/>
应该是:
<cfset key = "{32 chars, [0-9A-Z]}"/>
ColdFusion 本身不支持带有 CBC 的 PKCS7Padding,我收到一个不受支持的提供程序错误。所以我去安装 BouncyCaSTLe,我找到了一个很棒的 ColdFusion 示例,说明如何使用 PKCS5Padding 解密/重新加密 PHP 中的 ColdFusion 加密字符串>here。我将它添加到我的代码中,但我需要 PKCS7Padding 所以我改变了
var zbPadding = CreateObject('java', 'org.bouncycastle.crypto.paddings.ZeroBytePadding').init();
到
var zbPadding = CreateObject('java', 'org.bouncycastle.crypto.paddings.PKCS7Padding').init();
根据Bouncy Castle docs .
有了这一切,我得到了错误:
"Key length not 128/160/192/224/256 bits."
我会不断尝试,但我完全被卡住了,我不知道我做错了什么。
编辑1:
我让它工作了!
编辑2:
另外,为了安装 Bouncy CaSTLe,我遵循了 bouncy castle installe instructions并从 java downloads 底部下载 jce页。
最佳答案
我让它工作了!
编辑 2:另外,为了安装 Bouncy CaSTLe,我按照 bouncy caSTLe 安装说明进行操作,并从 java 下载页面底部下载了 jce。
关于ColdFusion 解密 AES128 PKCS7Padding CBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7818320/