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

Posted

技术标签:

【中文标题】在 PHP 中取消加密/重新加密 ColdFusion 加密字符串【英文标题】:Un-encrypting / re-encrypting a ColdFusion encrypted string in PHP 【发布时间】:2011-03-12 22:18:42 【问题描述】:

我处于一个令人羡慕的位置,我必须维护现有 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 错误。

非常感谢任何帮助。

詹姆斯

【问题讨论】:

你做base64_encode()mcrypt_encrypt()的结果吗? 还可以查看加密函数的 ivosalt 和迭代参数:adobe.com/livedocs/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/… @Tomalak 是的,mcrypt_encrypt 的结果是 base64_encoded。 @Ciaran 根据我的阅读,IV 和迭代次数不适用于 ECB 模式。 【参考方案1】:

不知道这会有多大帮助,但我已经完成了以下工作。我认为要让 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($datastrlen($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' 作为编码。

【讨论】:

谢谢。我目前无法更新 CF,但以后应该会更新,所以这会派上用场。

以上是关于在 PHP 中取消加密/重新加密 ColdFusion 加密字符串的主要内容,如果未能解决你的问题,请参考以下文章

device encryption is required,怎么给android设备加密

如何解除文件夹加密

php excel加密的实现方法有啥

android 取消系统默认手机加密(全盘加密)

php加密文件 解密data 转nsstring 为nil. rc4 ios

如何取消文件夹属性中的高级属性中的加密内容。