Intereting Posts
Как преобразовать javascript в PHP? cURL: время срабатывания после 0 миллисекунд php + curl не может установить метод post Является ли хорошей практикой использовать теги meta refresh для перенаправления вместо функции header () в php? Выполнение скрипта Bash из скрипта PHP PHP DOMDocument: как анализировать xml / rss теги с именами полей CUSTOM? Вопросы каждый хороший PHP-разработчик должен иметь возможность ответить Как я могу разобрать JSON-файл с PHP? Как показать сообщение «Сохранить успех» в Laravel 5.1? Stripe: нет такого токена .. аналогичный объект существует в тестовом режиме, но для выполнения этого запроса использовался клавиша режима реального времени Как выполнить несколько вложений MySQL в PHP stdClass Объект foreach PHP Mysql выбирает самую старую запись для каждого пользователя Как создать событие Календаря Google без напоминания / Как получить учетные записи службы для олицетворения пользователей Режим обслуживания обходного режима Laravel 4 для маршрута

Шифрование в Coldfusion, а затем дешифрование в PHP

У меня проблема с воспроизведением того же результата, сгенерированного в PHP vs 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?

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

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

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

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

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

Обновление : поскольку функция CF encrypt () всегда интерпретирует ввод обычного текста как строку UTF-8 , вы также можете использовать charsetEncode (bytes, «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; } 

Проблема заключается в дополнении. Расширение 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.