Отключение / повторное шифрование зашифрованной строки ColdFusion в PHP - PullRequest
4 голосов
/ 07 июля 2010

Я нахожусь в незавидном положении, когда мне приходится поддерживать функциональность с существующим приложением ColdFusion.Как часть процесса входа в систему приложение Coldfusion сохраняет файл cookie с зашифрованной строкой.

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

Я могу успешно расшифровать эту строку в PHP с помощью MCrypt и следующего кода

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

IТеперь необходимо выполнить такое же шифрование в 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 Ответ

4 голосов
/ 08 июля 2010

Не знаю, сколько это поможет, но у меня была следующая работа. Я думаю, чтобы осчастливить 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' для кодировки.

...