ColdFusion 解密 AES128 PKCS7Padding CBC

标签 coldfusion aes

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

我让它工作了!
  • dataString 需要使用 base64 而不是十六进制。
  • 使用 ColdFusion 转换为十六进制时, key 是 24 个 [0-9A-F] 字符,代表 24x4=96 位,即 12 个字节。它必须是 16 字节,所以 BinaryEncode(ToBinary()) 函数无法完成它的工作。所以我使用了一个字符串到十六进制的工具来转换它,然后得到了 32 个字符。

  • 编辑2:
    另外,为了安装 Bouncy CaSTLe,我遵循了 bouncy castle installe instructions并从 java downloads 底部下载 jce页。

    最佳答案

    我让它工作了!

  • dataString 需要使用 base64 而不是十六进制。

  • 使用 ColdFusion 转换为十六进制时, key 是 24 个 [0-9A-F] 字符,代表 24x4=96 位,即 12 个字节。它必须是 16 字节,所以 BinaryEncode(ToBinary()) 函数无法完成它的工作。所以我使用了一个字符串到十六进制的工具来转换它,然后得到了 32 个字符。
    编辑 2:另外,为了安装 Bouncy CaSTLe,我按照 bouncy caSTLe 安装说明进行操作,并从 java 下载页面底部下载了 jce。

  • 关于ColdFusion 解密 AES128 PKCS7Padding CBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7818320/

    相关文章:

    python - 如何在不损坏文件的情况下使用 AES 和 pycrypto 加密 .docx 文件

    encryption - 攻击 AES ECB 加密文件的最佳方法是什么?

    hibernate - 在 CF-ORM/Hibernate 中记录谁更新了什么的最简洁方法?

    java - 从哪里可以获得 AES key 计划加密 key ?

    javascript - 如何使用 AES 通过 CryptoJS 进行解密?

    mysql - 使用 mySQL 和 ColdFusion 编写优化且高效的搜索引擎

    algorithm - 在设计加密算法时,决定算法功能的关键因素是什么?

    sql-server - ColdFusion SQL Server 数据源的最小占用空间是多少?

    mysql - 为什么排序在 MySQL 中有效,但在 Coldfusion 结果集中无效?

    coldfusion - CFSchedule Coldfusion 10,重复间隔不能超过24小时(86400秒)