ООН-шифрование / повторно шифрование зашифрованной зашифрованной yellfusion в PHP
-
02-10-2019 - |
Вопрос
Я в незащищенном положении, где я должен поддерживать функциональность с существующим приложением ColdFusion. Как часть этого процесса входа в систему, приложение ColdFusion хранит печенье с зашифрованной строкой.
encrypt(strToEncrypt, theKey, "AES", "Base64")
Я могу успешно расшифровать эту строку в PHP, используя MCRYPT и следующий код
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
ошибка.
Любая помощь очень ценится.
Джеймс
Решение
Не знаю, как много помощи это будет, но у меня было следующее рабочее. Я думаю, что 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);
}
}
Дешифровать в ср
Decrypt(data, encKey, 'AES/CBC/PKCS5Padding', encoding, encIv)
По какой-то причине я не могу вспомнить, я предпочитал «UU» для кодирования.