使用generateSecretKey来
保证 AES 的密钥长度
该函数仅在您需要生成完整的new加密密钥。你已经有一个了。主要目的generateSecretKey
是为了确保你生成一个强加密密钥,即足够随机 http://en.wikipedia.org/wiki/Encryption_key#Key_choice.
不起作用,因为 SagePay 给我的值会导致
错误 - “指定的密钥不是此加密的有效密钥:无效
AES 密钥长度”,因为它只有 16 个字符长
密钥长度为16 bytes(即128位) http://helpx.adobe.com/coldfusion/kb/strong-encryption-coldfusion-mx-7.html对于 AES 来说是可以接受的。问题是加密() https://wikidocs.adobe.com/wiki/display/coldfusionen/Encrypt期望“钥匙”是base64 http://en.wikipedia.org/wiki/Base64编码字符串,比普通字符串长约百分之三十三。当您调用 encrypt(..) 时,CF 将提供的“key”字符串解码为字节,即本质上是这样做的:
<cfset keyBytes = binaryDecode(yourPassword, "base64")>
<cfoutput>length = #arrayLen(keyBytes)# bytes</cfoutput>
由于您的密码字符串不是 Base64 编码的,因此生成的密钥长度太小,即 (12) 而不是 (16) 字节。因此出现错误消息。
解决办法是先进行base64编码。How你这样做取决于字符串的编码。听起来这只是一个纯文本字符串 https://stackoverflow.com/a/19950708/104223(希望一个足够随机的... http://en.wikipedia.org/wiki/Encryption_key#Key_choice)。如果是这样,请使用字符集解码 http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f64.html从相关字符集(即 utf-8 等)解码字符串,然后二进制编码 http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f65.html转为base64:
<cfset keyIVBytes = charsetDecode(yourKeyString, "utf-8")>
<cfset base64Key = binaryEncode(keyIVBytes, "base64")>
另外,iv
参数应该是二进制的。自从key
and iv
是相同的,只需使用上一步中的字节数组即可。另外,删除iterations
参数,因为它不适用。通过这些更改,它应该按预期工作:
encrypt(myStr, base64Key,"AES/CBC/PKCS5Padding", "hex", keyIVBytes)
注意:我不是加密专家,但是......使用密钥作为 iv 是这不是一个好主意 http://en.wikipedia.org/wiki/Initialization_vector...可能想与他们核实一下是否还有其他选择。