ColdFusion解密AES128 PKCS7Padding CBC

时间:2011-10-19 08:10:33

标签: coldfusion aes

我需要以字符串格式[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();

根据Bouncy Castle docs

有了这一切,我得到了错误:

"Key length not 128/160/192/224/256 bits."

我将继续尝试,但我完全陷入困境,我无法弄清楚我做错了什么。

编辑1:

我搞定了!

  • dataString需要在 base64 而不是hex。
  • 当使用coldFusion转换为十六进制时,密钥是24 [0-9A-F]字符,表示24x4 = 96位,即12字节。它需要是16字节,所以 BinaryEncode(ToBinary())函数不能完成它的工作。所以我使用了一个字符串到十六进制工具来转换它然后得到32个字符。

编辑2: 另外,要安装Bouncy Castle,我按照bouncy castle installe instructions并从java downloads 页面的底部下载了jce。

1 个答案:

答案 0 :(得分:1)

我开始工作了!

  • dataString需要在base64而不是hex。

  • 当使用coldFusion转换为十六进制时,密钥是24 [0-9A-F]个字符,表示24x4 = 96位,即12个字节。它需要是16字节,所以BinaryEncode(ToBinary())函数不能完成它的工作。所以我用一个字符串到十六进制工具来转换它,然后得到32个字符。 编辑2:另外,为了安装Bouncy Castle,我遵循了充气城堡的安装说明,并从java下载页面的底部下载了jce。