шифрование — шифрование в Coldfusion, а затем расшифровка в переполнении стека

У меня проблема с воспроизведением того же результата, который был получен в PHP и Coldfusion.

В PHP шифрование следующим образом:

<?php
$key = "$224455@";
$Valor = "TESTE";

$base = chop(base64_encode(mcrypt_encrypt(MCRYPT_DES, $key, $Valor, MCRYPT_MODE_ECB)));
?>

У меня есть результат:

TzwRx5Bxoa0 =

В Coldfusion сделали так:

<cfset Valor = "TESTE">
<cfset Key = "$224455@">
<cfset base = Encrypt(Valor,ToBase64(Key),"DES/ECB/PKCS5Padding","BASE64")>

Результат:

qOQnhdxiIKs =

Что не ColdFusion дает такое же значение, как PHP?

большое спасибо

7

Решение

(Слишком долго для комментариев)

Артём Б. уже предоставил ответ выше. Артём Б. написал

Проблема в прокладке. Расширение mcrypt в PHP использует только
ZeroPadding […] вам нужно либо дополнить открытый текст в php […] или
используйте другой шифр в ColdFusion, такой как «DES / ECB / NoPadding». я
рекомендуем первый, потому что если вы используете NoPadding, открытый текст должен
уже быть кратным размеру блока.

К сожалению, трудно произвести нулевой символ в CF. AFAIK, единственная техника, которая работает, это использование URLDecode("%00"). Если вы не можете изменить код PHP в соответствии с предложением @Artjom B., вы можете попробовать использовать функцию ниже для заполнения текста на CF. Отказ от ответственности: он только слегка протестирован (CF10), но, похоже, дает тот же результат, что и выше.

Обновить:
Так как функция CF encrypt () всегда интерпретирует ввод простого текста как строку UTF-8, Вы также можете использовать charsetEncode (байты, «utf-8») создать нулевой символ из байтового массива из одного элемента, т.е.
charsetEncode( javacast("byte[]", [0] ), "utf-8")


Пример:

Valor = nullPad("TESTE", 8);
Key = "$224455@";
result = Encrypt(Valor, ToBase64(Key), "DES/ECB/NoPadding", "BASE64");
// Result: TzwRx5Bxoa0=
WriteDump( "Encrypted Text = "& Result );

Функция:

/*
Pads a string, with null bytes, to a multiple of the given block size

@param plainText - string to pad
@param blockSize - pad string so it is a multiple of this size
@param encoding - charset encoding of text
*/
string function nullPad( string plainText, numeric blockSize, string encoding="UTF-8")
{
local.newText = arguments.plainText;
local.bytes = charsetDecode(arguments.plainText, arguments.encoding);
local.remain = arrayLen( local.bytes ) % arguments.blockSize;

if (local.remain neq 0)
{
local.padSize = arguments.blockSize - local.remain;
local.newText &= repeatString( urlDecode("%00"), local.padSize );
}

return local.newText;
}
5

Другие решения

Проблема в прокладке. Расширение mcrypt в PHP использует только ZeroPadding. Это означает, что открытый текст заполняется 0x00 байтами, пока не будет достигнут кратный размеру блока.

С другой стороны, заполнение PKCS # 5 / PKCS # 7 заполняет его байтами, которые обозначают количество пропущенных байтов до следующего кратного размеру блока. Размер блока для DES составляет 8 байтов.

Таким образом, вам нужно добавить текст в php (см. Этот код: A: Как добавить / удалить заполнение PKCS7 из зашифрованной строки AES?) или используйте другой шифр в ColdFusion, такой как "DES/ECB/NoPadding", Я рекомендую первое, потому что если вы используете NoPadding, открытый текст должен быть кратным размеру блока.

$key = "$224455@";
$Valor = "TESTE";
function pkcs7pad($plaintext, $blocksize)
{
$padsize = $blocksize - (strlen($plaintext) % $blocksize);
return $plaintext . str_repeat(chr($padsize), $padsize);
}

$base = chop(base64_encode(mcrypt_encrypt(MCRYPT_DES, $key, pkcs7pad($Valor, 8), MCRYPT_MODE_ECB)));

Результат:

qOQnhdxiIKs =

Не забудьте распаковать восстановленный открытый текст, если вы расшифровываете в PHP.

5