2015-11-20 99 views
4

起初,ColdFusion的加密:ColdFusion的3DES加密做出PHP不同加密结果`mcrypt_encrypt`

<cfset message = '1447841550'> 
<cfset key = 'Mk9m98IfEblmPfrpsawt7BmxObt98Jev'> 

<cfset ciphertext = Encrypt(#message#, #key#, "desede", "base64")> 
<cfoutput>#ciphertext#</cfoutput> 

然后,PHP的mcrypt:

$message = "1447841550"; 
$key = 'Mk9m98IfEblmPfrpsawt7BmxObt98Jev'; 

$key = base64_decode($key); 

$bytes = array(0,0,0,0,0,0,0,0); //byte [] IV = {0, 0, 0, 0, 0, 0, 0, 0} 
$iv = implode(array_map("chr", $bytes)); 

$ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv); 

echo base64_encode($ciphertext); 

问题。

在相同的字符串,相同的算法和相同的编码。

仍然有一部分输出不匹配。

下面是真实的样本输出。

// Coldfusion output. 

n6lp0I1w5FwrP3yPw3s8bw== 

^^^^^^^^^^ 

Same part 


// PHP output. 

n6lp0I1w5FxLQHskKMn4sw== 

^^^^^^^^^^ 

Same part 

为什么Coldfusion使结果不同?

如何在不修改PHP代码的情况下在Coldfusion中做出相同的结果。 PHP输出对我来说是正确的输出。

是否有可能得到正确的结果(PHP)与JavaScript?这个解决方案也很好。

我很沮丧。

在先进的感谢

+0

解决了吗? http://stackoverflow.com/a/2819186/577052 –

+0

嗨Bardware,我试过,但不是相同的结果。我知道我需要应用算法“DESede/ECB/NoPadding”,如PHP“MCRYPT_MODE_CBC” 它不适用于我“DESede/ECB/NoPadding”和“DESede/ECB/PKCS5Padding” 任何想法? – Juven

+0

对不起,我的意思是DESede/CBC/NoPadding – Juven

回答

7

的设置比较接近,但并不完全相同。结果不同的原因是因为:

  1. “CBC”模式需要IV(初始化向量)。 PHP代码显式提供IV,但CF代码不提供。所以encrypt()函数随机产生一个IV。因此,为什么结果不匹配:不同的IV,不同的结果。

  2. 当您使用“NoPadding”模式时,输入字符串必须被填充,因此其长度是块大小的偶数倍(即DESEDE => 8)。据我所知,"...the mcrypt extension of PHP only uses ZeroPadding"。 CF encrypt()函数不支持零填充。但是,您可以使用这样的事情UDF nullPad()

模拟它一旦你已经把那两个(2)的变化,结果将匹配:

结果:

n6lp0I1w5FxLQHskKMn4sw== 

示例:

<cfset message = nullPad("1447841550", 8)> 
<cfset key = "Mk9m98IfEblmPfrpsawt7BmxObt98Jev"> 
<!--- Important: IV values should be random, and NOT reused ---> 
<!--- https://en.wikipedia.org/wiki/Initialization_vector ---> 
<cfset iv = binaryDecode("0000000000000000", "hex")> 
<cfset ciphertext = Encrypt(message, key, "DESede/CBC/NoPadding", "base64", iv)> 
<cfoutput>#ciphertext#</cfoutput> 
+1

Yesss !!!我试过了,它的工作原理!非常感谢Leigh – Juven

+2

欢迎您......并感谢*您*发布一个清晰,简洁的问题与独立的例子。这总会让协助更容易:)干杯,欢迎来到S.O. – Leigh