gpt4 book ai didi

ColdFusion 解密 AES128 PKCS7Padding CBC

转载 作者:行者123 更新时间:2023-12-04 17:19:57 24 4
gpt4 key购买 nike

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

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com