2010-07-07 100 views
4

我處於不利的位置,我必須在現有的ColdFusion應用程序中維護功能。作爲登錄過程的一部分,Coldfusion應用程序使用加密的字符串存儲cookie。對PHP中的ColdFusion加密字符串進行解密/重新加密

encrypt(strToEncrypt, theKey, "AES", "Base64") 

我可以成功解密使用的mcrypt在PHP這個字符串和下面的代碼

mcrypt_decrypt(
    MCRYPT_RIJNDAEL_128, 
    base64_decode($theKey), 
    base64_decode($encrypted_string), 
    MCRYPT_MODE_ECB, "0000000000000000") 

我現在已經在PHP中執行相同的加密,使ColdFusion的應用程序可以訪問數據的需要cookie。

目前我有什麼是

mcrypt_encrypt(MCRYPT_RIJNDAEL_128, base64_decode($theKey), $strToEncrypt, MCRYPT_MODE_ECB, "0000000000000000"); 

然而,這是等價的ColdFusion加密算法

decrypt(strToDecrypt, theKey, "AES", "Base64") 

投擲Given final block not properly padded誤差不兼容。

任何幫助非常感謝。

詹姆斯

+1

你'base64_encode()'mcrypt_encrypt()'的結果? – Tomalak 2010-07-07 16:38:59

+0

另請參閱加密函數的ivorsalt和迭代參數:http://www.adobe.com/livedocs/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=ColdFusion_Documentation&file=00000457。 htm – 2010-07-07 21:30:04

+0

@Tomalak是的,mcrypt_encrypt的結果是base64_encoded。 – WeeJames 2010-07-08 08:43:05

回答

4

不知道有多少幫助,這將是但我有以下工作。我認爲,使CF快樂,你必須墊你的加密到一定長度

加密在CF

Encrypt(data, encKey, 'AES/CBC/PKCS5Padding', encoding, encIv) 

解密PHP

function Decode($data, $encKey, $encIv, $format = 'uu') { 
    if ($format === 'uu') { 
     $data = Convert_uudecode($data); 
    } else if ($format === 'hex') { 
     $data = Pack('H*', $data); 
    } else if ($format === 'base64') { 
     $data = Base64_Decode($data); 
    } else if ($format === 'url') { 
     $data = UrlDecode($data); 
    } 
    $data = MCrypt_decrypt(MCRYPT_RIJNDAEL_128, $encKey, $data, 'cbc', $encIv); 
    $pad = Ord($data{strlen($data)-1}); 
    if ($pad > strlen($data)) return $data; 
    if (strspn($data, chr($pad), strlen($data) - $pad) != $pad) return $data; 
    return substr($data, 0, -1 * $pad); 
} 

加密在PHP

function Encode($data, $encKey, $encIv, $format = 'uu') { 
    $pad = 16 - (StrLen($data) % 16); 
    if ($pad > 0) { 
     $data .= Str_repeat(Chr($pad), $pad); 
    } 
    $data = MCrypt_encrypt(MCRYPT_RIJNDAEL_128, $encKey, $data, 'cbc', $encIv); 
    if ($format === 'uu') { 
     return Convert_uuencode($data); 
    } else if ($format === 'hex') { 
     return Bin2Hex($data); 
    } else if ($format === 'base64') { 
     return Base64_Encode($data); 
    } else if ($format === 'url') { 
     return UrlEncode($data); 
    } 
} 

解密於CF

Decrypt(data, encKey, 'AES/CBC/PKCS5Padding', encoding, encIv) 

由於某些原因,我不記得,我贊成'uu'的編碼。

+0

謝謝。我目前無法更新CF,但應該在未來,所以這將派上用場。 – WeeJames 2010-07-16 10:04:53