首先,这是付款处理器期望的结果令牌.
AYOF+kRtg239Mnyc8QIarw==
以下是我们正在使用的ColdFusion的代码片段,以及生成的字符串.
<!--- Coldfusion Crypt (here be monsters) ---> <cfset theKey="123412341234123412341234"> <cfset theString = "username=test123"> <cfset strEncodedEnc = Encrypt(theString,theKey,"DESEDE","Base64")> <!--- resulting string(strEncodedEnc): tc/Jb7E9w+HpU2Yvn5dA7ILGmyNTQM0h --->
正如你所看到的,这并没有返回我们希望的字符串.寻求一个解决方案,我们为此过程提供了ColdFusion,并尝试在PHP中重现令牌.
现在我知道各种语言以不同的方式实现加密 – 例如在过去管理C#应用程序和PHP后端之间的加密方面,我不得不为了让这两个人进行填充而进行填充,但是我的经验是,PHP通常在加密标准方面表现得很好.
/* PHP Circus (here be Elephants) */ $theKey="123412341234123412341234"; $theString="username=test123"; $strEncodedEnc=base64_encode(mcrypt_ecb (MCRYPT_3DES,$theKey,$theString,MCRYPT_ENCRYPT)); /* resulting string(strEncodedEnc): sfiSu4mVggia8Ysw98x0uw== */
正如你可以明白地看到的,我们有另一个字符串,不同于付款处理器和ColdFusion生成的字符串.提示头对墙整合技术.
在与付款处理器进行多次通信之后(很多很多代理人表示“我们不能帮助编码问题,您必须做错,阅读手册”),我们终于升级到超过几个脑细胞揉在一起,谁能够退缩,实际上看和诊断这个问题.
他同意,我们的CF和PHP尝试没有导致正确的字符串.经过快速搜索,他也认为这不是我们的来源,而是两种语言如何实现他们对TripleDES标准的看法.
今天早晨进入办公室,我们在Perl的电子邮件中收到了一个源代码片段.这是他们直接使用的代码来产生预期的令牌.
#!/usr/bin/perl # Perl Crypt Calamity (here be...something) use strict; use CGI; use MIME::Base64; use Crypt::TripleDES; my $cgi = CGI->new(); my $param = $cgi->Vars(); $param->{key} = "123412341234123412341234"; $param->{string} = "username=test123"; my $des = Crypt::TripleDES->new(); my $enc = $des->encrypt3($param->{string},$param->{key}); $enc = encode_base64($enc); $enc =~ s/\n//gs; # resulting string (enc): AYOF+kRtg239Mnyc8QIarw==
所以,我们有它.三种语言,它们在文档中引用的三个实现,如TripleDES标准加密,以及三个完全不同的结果字符串.
我的问题是,根据您对这三种语言的经验和TripleDES算法的实现,您是否能够让任何两个语言给出相同的响应,如果是这样,您必须按顺序进行什么调整结果来了
我明白这是一个非常抽出来的问题,但是我想为我们必须执行的每个测试阶段提供清晰准确的设置.
稍后我还会对这个问题进行一些更多的调查工作,并会发布我对这个问题的任何调查结果,以便其他人可以避免头痛.
解决方法
您的第一个问题是Perl中的键是十六进制,您需要将其转换为二进制.尝试这个PHP,
$theKey="123412341234123412341234"; $key = pack('H*',str_pad($theKey,16*3,'0')); $strEncodedEnc=base64_encode(mcrypt_ecb (MCRYPT_3DES,$key,MCRYPT_ENCRYPT)); echo $strEncodedEnc,"\n";
结果是,
AYOF+kRtg239Mnyc8QIarw==
那么你必须用奇怪的方法来填补它.我忘记了细节.你这个样本很幸运(这是16个字符).