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

时间:2014-01-17 16:15:32

标签: 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)>

错误是:

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

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

我也有来自第三方的

  

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

     

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

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

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

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

1 个答案:

答案 0 :(得分: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") />

  4. 完成这些更改后,您的代码应该可以正常运行:

    Encrypt(encryptString, base64Key, "AES/CBC/PKCS5Padding", "hex", binaryIV)
    

    (尽管标题中有过时的版本,但我发现this article on strong encryption是解决加密问题的绝佳参考资料)