所以我有(这不起作用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,因为我有一些有用的东西)
答案 0 :(得分:7)
为了让它发挥作用,你必须做一些事情:
默认情况下,您只能使用128位AES密钥。要使用较大的密钥,例如256位,您必须先安装(JCE) Unlimited Strength Jurisdiction Policy Files for Java 6或Java 7 / Java 8(具体取决于您的JRE版本)。将它们复制到您的/lib/security/
目录中。 (注意:如果安装了多个JVM,请确保更新正确的罐子,即CF管理员中列出的罐子)。然后重启CF服务器。
Encrypt()
期望密钥为base64格式。因此,使用binaryDecode/Encode将密钥从十六进制转换为base64:
<cfset base64Key = binaryEncode(binaryDecode(yourHexKey, "hex"), "base64") />
iv
应该是二进制的。再次,使用binaryDecode转换它:
<cfset binaryIV = binaryDecode(yourHexIV, "hex") />
完成这些更改后,您的代码应该可以正常运行:
Encrypt(encryptString, base64Key, "AES/CBC/PKCS5Padding", "hex", binaryIV)
(尽管标题中有过时的版本,但我发现this article on strong encryption是解决加密问题的绝佳参考资料)