Encryption 如何在ColdFusion&;中使用空/零字节填充字符串;MacOS和Windows上CF的区别

Encryption 如何在ColdFusion&;中使用空/零字节填充字符串;MacOS和Windows上CF的区别,encryption,coldfusion,Encryption,Coldfusion,我很难理解如何用空字节填充CF中的字符串。在Java中,我会这样做 String ZeroPad = ""; for (int i = 0; i < 32; i++) ZeroPad = ZeroPad + "\0"; String strKey = strUsername + strPassword + ZeroPad; strKey = strKey.substring(0, 32); 字符串ZeroPad=”“; 对于(int i=0;i

我很难理解如何用空字节填充CF中的字符串。在Java中,我会这样做

String ZeroPad = "";
for (int i = 0; i < 32; i++)
    ZeroPad = ZeroPad + "\0";
String strKey = strUsername + strPassword + ZeroPad;
strKey = strKey.substring(0, 32);
字符串ZeroPad=”“;
对于(int i=0;i<32;i++)
ZeroPad=ZeroPad+“\0”;
字符串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加密。在我的本地开发机器(MacOSXMavericks)上,这可以正常工作,并且我能够使用生成的密钥进行加密。但是,在我的生产环境(Windows Server 2008)上,我收到错误“密钥大小无效”。两者上的键大小都显示为32,我很困惑。

我过去使用过,即:
URLDecode(“%00”,“utf-8”)

更新:

由于
encrypt()
函数始终将纯文本输入解释为UTF-8字符串,因此还可以使用从单元素字节数组创建空字符

 charsetEncode( javacast("byte[]", [0] ), "utf-8");

@不幸的是,没有。角色消失了。但是URLDecode(“%00”)将生成一个空字节。哦,奇怪。我得好好玩玩。这是预期的行为吗?为修正喝彩@Leigh@AdamCameron-预期?嗯,不是从我的角度。但是字符串处理在某些方面与java总是有点不同。例如,在中,您可以使用转义符(如
newstring(“\u0061”)
)来获取字符
a
,但CF中相同的createObject代码只提供了文本字符:
\u0061
。我的行为很古怪。@Leigh谢谢。这很有效,但我遇到了另一个问题并更新了我的问题。只想添加use
stringRepeat(URLDecode(“%00”),32)
而不是冗长的for循环。:)