Perl / PHP / ColdFusion中的TripleDES

前端之家收集整理的这篇文章主要介绍了Perl / PHP / ColdFusion中的TripleDES前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
最近出现了一个问题,即使用使用TripleDES标准的要求使用加密字符串作为令牌的付款处理器挂起API.我们的应用程序使用支持TripleDES的ColdFusion(具有加密标签)运行,但是我们得到的结果不是付款处理器预期的结果.

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

@H_301_4@AYOF+kRtg239Mnyc8QIarw==

以下是我们正在使用的ColdFusion的代码片段,以及生成的字符串.

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

@H_301_4@/* 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的电子邮件中收到了一个源代码片段.这是他们直接使用的代码来产生预期的令牌.

@H_301_4@#!/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,

@H_301_4@$theKey="123412341234123412341234"; $key = pack('H*',str_pad($theKey,16*3,'0')); $strEncodedEnc=base64_encode(mcrypt_ecb (MCRYPT_3DES,$key,MCRYPT_ENCRYPT)); echo $strEncodedEnc,"\n";

结果是,

@H_301_4@AYOF+kRtg239Mnyc8QIarw==

那么你必须用奇怪的方法来填补它.我忘记了细节.你这个样本很幸运(这是16个字符).

猜你在找的Perl相关文章