正确参数传递给Coldfusion 8(或10)中的加密AES

Jos*_*ose 2 coldfusion aes

所以我有(这不起作用b/c十六进制可能是错误的,键和IV没有正确转换):

(aesKey和aesIV作为第三方的十六进制字符串提供)

它们看起来像这样(不一样,但应该足以使用我替换键中的一些值,所以它们不完全相同:

<cfparam name="aesKey" default="C20648780E8843795325F3BA5EC43183C8BFA2D26B5470BC309ED5BA6B142EFA"/>
<cfparam name="aesIV" default="A53F0A6E6972A0095CFFDBE4F47C3CF8"/>

<cfset token = Encrypt(encryptString, aesKey, "AES/CBC/PKCS5Padding", "hex", aesIV)>
Run Code Online (Sandbox Code Playgroud)

错误是:

指定的密钥不是此加密的有效密钥:非法密钥大小或默认参数.

(我也不确定"十六进制"是对的)

我也有来自第三方的这个

第三方使用以下参数进行AES加密:
块长度256位
填充PKCS7
密码模式CBC
密钥长度256位(由第三方以十六进制格式提供)
初始化向量长度128位(由第三方以十六进制格式提供)

秘密(私有)密钥和初始化向量用于对明文令牌执行AES加密.然后将加密的字符串传递给第三方SSO进程,在该进程中使用匹配的密钥和初始化向量对其进行解密.

所以我没有使用密钥或iv进行任何格式化或转换,但错误表明我需要管理它.

但那是我猜的地方(它确实需要一个字符串,它只是我传递的字符串是错误的)

我知道我很接近,我确实有一个"无论如何使其工作"的解决方案(我从CF转到.net并使用提供的示例代码),但我不想这样做,...但我确实拥有它.(这是我第二次从语言B回到语言A,因为我有一些有用的东西)

Lei*_*igh 7

为了让它工作,你必须做一些事情:

  1. 默认情况下,您只能使用128位AES密钥.要使用更大的密钥(如256位),必须先安装(JCE)Unlimited Strength Jurisdiction Policy Files for Java 6Java 7/Java 8(取决于您的JRE版本).将它们复制到您的/lib/security/目录中.(注意:如果安装了多个JVM,请确保更新正确的罐子,即CF管理员中列出的罐子).然后重启CF服务器.

  2. Encrypt()期望密钥是base64格式.因此,使用binaryDecode/Encode将密钥从十六进制转换为base64:

    <cfset base64Key = binaryEncode(binaryDecode(yourHexKey, "hex"), "base64") />

  3. iv应该是二进制文件.再次,使用binaryDecode转换它:

    <cfset binaryIV = binaryDecode(yourHexIV, "hex") />

完成这些更改后,您的代码应该可以正常工作:

Encrypt(encryptString, base64Key, "AES/CBC/PKCS5Padding", "hex", binaryIV)
Run Code Online (Sandbox Code Playgroud)

(尽管标题中有过时的版本,但我发现这篇关于强加密的文章是解决加密问题的绝佳参考)