Coldfusion 3DES加密使得加密结果与PHP`mcrypt_encrypt`不同

Juv*_*ven 5 php encryption coldfusion mcrypt

起初,Coldfusion加密:

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

<cfset ciphertext = Encrypt(#message#, #key#, "desede", "base64")>
<cfoutput>#ciphertext#</cfoutput>
Run Code Online (Sandbox Code Playgroud)

然后,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);
Run Code Online (Sandbox Code Playgroud)

问题.

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

仍然有一小部分输出不匹配.

以下是真实的样本输出.

// Coldfusion output.

n6lp0I1w5FwrP3yPw3s8bw== 

^^^^^^^^^^

Same part


// PHP output.

n6lp0I1w5FxLQHskKMn4sw==

^^^^^^^^^^

Same part
Run Code Online (Sandbox Code Playgroud)

为什么Coldfusion会产生不同的结果?

如果不修改PHP代码,我怎么能在Coldfusion中产生相同的结果.PHP输出对我来说是正确的输出.

是否可以使用javascript获得正确的结果(PHP)?这个解决方案也很好.

我很沮丧.

Lei*_*igh 8

设置很接近,但不完全相同.结果不同的原因是:

  1. "CBC"模式需要IV(初始化矢量).PHP代码显式提供IV,但CF代码没有.因此该encrypt()函数随机生成IV.因此,为什么结果不匹配:不同的IV,不同的结果.

  2. 使用"NoPadding"模式时,必须填充输入字符串,使其长度为块大小的偶数倍(即DESEDE => 8).据我所知,"...... PHP的mcrypt扩展仅使用ZeroPadding".CF encrypt()函数不支持零填充.但是,您可以使用类似这样的东西来模拟它udf nullPad()

一旦您合并了这两(2)个更改,结果将匹配:

结果:

n6lp0I1w5FxLQHskKMn4sw== 
Run Code Online (Sandbox Code Playgroud)

例:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 欢迎你...并且感谢你*用一个独立的例子发布一个简明扼要的问题.这总是让它更容易协助:)干杯,欢迎来到SO (2认同)