2015-11-20 100 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