Un-Verschlüsselungs- / Wieder Verschlüsselung eines verschlüsselten String Coldfusion in PHP
-
02-10-2019 - |
Frage
Ich bin in der wenig beneidenswerten Position, wo ich Funktionalität mit einer vorhandenen Coldfusion-Anwendung zu erhalten. Im Rahmen Login-Prozess von ihm ist die Coldfusion App speichert ein Cookie mit einem verschlüsselten String zurück.
encrypt(strToEncrypt, theKey, "AES", "Base64")
Ich kann erfolgreich diese Zeichenfolge in PHP MCrypt entschlüsseln und den folgenden Code
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
base64_decode($theKey),
base64_decode($encrypted_string),
MCRYPT_MODE_ECB, "0000000000000000")
ich jetzt die Notwendigkeit, die gleiche Verschlüsselung innerhalb PHP so auszuführen, dass der Coldfusion-App die Daten im Cookie zugreifen kann.
Im Moment, was ich habe, ist
mcrypt_encrypt( MCRYPT_RIJNDAEL_128, base64_decode($theKey), $strToEncrypt, MCRYPT_MODE_ECB, "0000000000000000");
Dies ist jedoch nicht kompatibel mit dem Äquivalent von Coldfusion-Verschlüsselungsalgorithmus
decrypt(strToDecrypt, theKey, "AES", "Base64")
Werfen eines Given final block not properly padded
Fehler.
Jede Hilfe sehr geschätzt.
James
Lösung
Sie wissen nicht, wie viel Hilfe dieser sein wird, aber ich habe folgenden Arbeits hat. Ich denke, CF gerne Pad Ihre Verschlüsselung auf eine bestimmte Länge haben, um
Verschlüsseln in CF
Encrypt(data, encKey, 'AES/CBC/PKCS5Padding', encoding, encIv)
Entschlüsseln in 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);
}
Verschlüsseln in 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);
}
}
Entschlüsseln in CF
Decrypt(data, encKey, 'AES/CBC/PKCS5Padding', encoding, encIv)
Aus irgendeinem Grund, dass ich mich nicht erinnern kann, ich begünstigt ‚uu‘ für die Codierung.