Perl / PHP / ColdFusion中的TripleDES

最近出现了一个问题,即使用使用TripleDES标准的要求使用加密字符串作为令牌的付款处理器挂起API.我们的应用程序使用支持TripleDES的ColdFusion(具有加密标签)运行,但是我们得到的结果不是付款处理器预期的结果.

首先,这是付款处理器期望的结果令牌.

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代码,并生成了字符串.

/* 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的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个字符).

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...