Pregunta

Estoy en la posición poco envidiable donde tengo que mantener la funcionalidad de una aplicación ColdFusion existente. Como parte del mismo proceso de inicio de sesión de las tiendas de aplicaciones Coldfusion una galleta con una cadena cifrada.

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

Me puede descifrar con éxito esta cadena en PHP usando MCrypt y el siguiente código

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

Ahora tengo la necesidad de realizar el mismo cifrado dentro de PHP para que la aplicación de ColdFusion puede acceder a los datos en la cookie.

En el momento lo que tengo es

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

Esto, sin embargo, es incompatible con el ColdFusion equivalente Algoritmo de cifrado

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

Lanzar un error Given final block not properly padded.

Cualquier ayuda muy apreciada.

James

¿Fue útil?

Solución

No sé cuánta ayuda esto será, pero he tenido el siguiente trabajo. Creo que para hacer feliz CF tiene que rellenar su encriptación para una determinada longitud

Cifrar en CF

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

Decrypt en 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); 
}

Cifrar en 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);
    }
}

Decrypt en CF

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

Por alguna razón que no puedo recordar, que favoreció 'uu' para la codificación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top