在PHP中取消加密/重新加密ColdFusion加密字符串

时间:2010-07-07 16:30:50

标签: php encryption coldfusion mcrypt

我处于一个不值得羡慕的位置,我必须使用现有的ColdFusion应用程序来维护功能。作为登录过程的一部分,Coldfusion应用程序存储带有加密字符串的cookie。

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 个答案:

答案 0 :(得分: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'进行编码。