对PHP中的ColdFusion加密字符串进行解密/重新加密

问题描述:

我处于不利的位置,我必须在现有的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

不知道有多少帮助,这将是但我有以下工作。我认为,使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