我无法理解如何用空字节填充CF中的字符串。在Java中,我会这样做......
String ZeroPad = "";
for (int i = 0; i < 32; i++)
ZeroPad = ZeroPad + "\0";
String strKey = strUsername + strPassword + ZeroPad;
strKey = strKey.substring(0, 32);
但是在ColdFusion中执行以下操作会产生类似“\ 0 \ 0 ...”的内容,而不是空字节。
<cfset var key = arguments.username&arguments.password/>
<cfloop condition="#len(key)# less than 32">
<cfset key = key & "\0"/>
</cfloop>
<cfset key = key.substring(0,32)/>
持续存在的问题。好的,我已经将我的CFML更新为...
<cfset var strB = createObject("java", "java.lang.StringBuilder")/>
<cfloop from=1 to=32 index="i">
<cfset zeroPad = zeroPad & URLDecode("%00")/>
</cfloop>
<cfset strB.append(arguments.username)/>
<cfset strB.append(arguments.password)/>
<cfset strB.append(zeroPad)/>
<cfif strB.length() GT 32>
<cfset key = strB.substring(0,32)/>
<cfelse>
<cfset key = strB.toString()/>
</cfif>
生成的密钥用于AES加密。在我的本地开发机器(Mac OS X Mavericks)上,这很好用,我可以用生成的密钥加密。但是,在我的生产环境(Windows Server 2008)上,我收到错误“密钥大小无效”。两者的密钥大小显示为32,我感到很沮丧。
答案 0 :(得分:2)
我过去曾使用this tip,即:URLDecode("%00", "utf-8")
<强>更新强>
由于encrypt()
函数始终将纯文本输入解释为UTF-8字符串,因此您还可以使用charsetEncode(bytes, "utf-8")从单个元素字节数组创建空字符。
charsetEncode( javacast("byte[]", [0] ), "utf-8");