微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/Perl/172530.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐