Un-encriptación / re-encriptar una cadena cifrada en PHP ColdFusion
-
02-10-2019 - |
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
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.