最终编辑:问题已解决,将本地开发环境升级到railo 3.3.4.003即可解决该问题。
我需要使用RC4加密一些字符串并进行base64编码,但我遇到了这样的情况,同样的输入在两个不同的开发环境中会生成不同的输出。
例如,如果我有一个字符串:test2@mail.com
在一台机器(DEV-1)上,我得到:DunU+ucIPz/Z7Ar+HTw=
而在另一台机器(DEV-2)上,则是:DunU+ucIlZfZ7Ar+HTw=
首先,我通过此处找到的函数进行rc4加密。
接下来,我将其传递给:toBase64(my_rc4_encrypted_data,"iso-8859-1")
据我所知,rc4加密输出在两者上都相同(或者我漏掉了什么)。 以下是两台机器的SERVER变量以及加密函数。
这是我们必须面对的问题,还是有什么方法可以“妥善处理”它(缺乏更好的词汇)。 我担心将来这会给我带来麻烦,想知道是否可以避免。
编辑1: my_rc4_encrypted_data.getBytes()的输出如下: dev-1:
Native Array (byte[])
14--23--44--6--25-8-63-63--39--20-10--2-29-60
开发人员2:
Native Array (byte[])
14--23--44--6--25-8-63-63--39--20-10--2-29-60
(未向 getBytes()
传递编码方式)
DEV-1 (远程)
server.coldfusion
productname Railo
productversion 9,0,0,1
server.java
archModel 64
vendor Sun Microsystems Inc.
version 1.6.0_26
server.os
arch amd64
archModel 64
name Windows Server 2008 R2
version 6.1
server.railo
version 3.3.2.002
server.servlet
name Resin/4.0.18
DEV-2 (local)
server.coldfusion
productname Railo
productversion 9,0,0,1
server.java
vendor Oracle Corporation
version 1.7.0_01
server.os
arch x86
name Windows 7
version 6.1
server.railo
version 3.2.2.000
server.servlet
name Resin/4.0.18
RC4函数:
function RC4(strPwd,plaintxt) {
var sbox = ArrayNew(1);
var key = ArrayNew(1);
var tempSwap = 0;
var a = 0;
var b = 0;
var intLength = len(strPwd);
var temp = 0;
var i = 0;
var j = 0;
var k = 0;
var cipherby = 0;
var cipher = "";
for(a=0; a lte 255; a=a+1) {
key[a + 1] = asc(mid(strPwd,(a MOD intLength)+1,1));
sbox[a + 1] = a;
}
for(a=0; a lte 255; a=a+1) {
b = (b + sbox[a + 1] + key[a + 1]) Mod 256;
tempSwap = sbox[a + 1];
sbox[a + 1] = sbox[b + 1];
sbox[b + 1] = tempSwap;
}
for(a=1; a lte len(plaintxt); a=a+1) {
i = (i + 1) mod 256;
j = (j + sbox[i + 1]) Mod 256;
temp = sbox[i + 1];
sbox[i + 1] = sbox[j + 1];
sbox[j + 1] = temp;
k = sbox[((sbox[i + 1] + sbox[j + 1]) mod 256) + 1];
cipherby = BitXor(asc(mid(plaintxt, a, 1)), k);
cipher = cipher & chr(cipherby);
}
return cipher;
}
String.getBytes(encoding)
(编辑)如果省略它,则使用 jvm 默认值。这可能在您的两台机器上不同。嗯..那可能有关系。经过再次思考,尝试两种方式。 - Leigh字符集
的差异可以解释这个问题。 - Leigh