PHP AES 128 ECB Ciphers и Delphi AES 128 ECB

Я шифрую строку «sifrelenecek» с Delphi, используя AES 128 ECB, используя ключ как «KRPTTT101103», и он дает мне «FBE4A4405D6C1B54503D9B213E41AE56», я проверяю с помощью http://aes.online-domain-tools.com/ и это правильно , Я пытаюсь создать такое же шифрование с помощью php с помощью этой функции;

function sifrele($str, $key){ $block = mcrypt_get_block_size('rijndael_128', 'ecb'); $pad = $block - (strlen($str) % $block); $str .= str_repeat(chr($pad), $pad); return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB)); } print sifrele("sifrelenecek","KRPTTT101103") 

но php дает мне результат как «+ wL2yf + 72thixicjw0duQA ==», как я могу шифровать в Delphi и Decrypt в php или противоположности?

Искали в Интернете и нашли так много функций, но ни один из этих функций не был таким же, как у Delphi или http://aes.online-domain-tools.com/

Заранее спасибо.

Как мы видим, вы пытаетесь сравнить тот, который явно закодирован с использованием hex. Другой – с базой64.

в php

  • отпустите прокладку (это делается автоматически).
  • не делайте base64_encode (что вы также не сделали в delphi).

Руководство пользователя php

Описание :


string mcrypt_encrypt (строка $ cipher, string $ key, string $ data, string $ mode [, string $ iv])

Шифрует данные и возвращает их.

……

данные

Данные, которые будут зашифрованы с данным шифром и режимом. Если размер данных не является n * blockize, данные будут дополняться «\ 0».

Возвращенный криптотекст может быть больше, чем размер данных, данных данными.

Режим ECB игнорирует IV, поэтому вводить пример с использованием MCRYPT_MODE_ECB и IV (пример в руководстве показывает то же самое). Кроме того, важно знать, что ECB полезен для случайных данных, но структурированные данные должны использовать более сильный режим, такой как MCRYPT_MODE_CBC

PHP-код

 function encrypt($input) { // $iv = mcrypt_create_iv(32); $mcr = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, "KRPTTT101103", $input, MCRYPT_MODE_ECB); $hex2 = bin2hex($mcr); // Convert binary data into hexadecimal representation return strtoupper($hex2); // base64_encode($mcr); } $encryptedhextext = encrypt("sifrelenecek"); if ($encryptedhextext == "FBE4A4405D6C1B54503D9B213E41AE56" ) { echo "Encrypted Hex text in Delphi and php are equal<br />"; echo $encryptedhextext." == FBE4A4405D6C1B54503D9B213E41AE56"; } 

Вывод

Шифрованный текст Hex в Delphi и php равны
FBE4A4405D6C1B54503D9B213E41AE56 == FBE4A4405D6C1B54503D9B213E41AE56

Вы смешиваете две разные формы отступов. Это то, что вызывает несоответствие. Это не просто разница Base64 / hex.

Ваш открытый текст равен 12 байтам: «sifrelenecek», закодированный как:

 [115, 105, 102, 114, 101, 108, 101, 110, 101, 99, 101, 107] 

Если вы нанесете открытый текст на ZEROES , как это делает, по-видимому, Delphi, и, как документируется как mcrypt_encrypt, вы шифруете:

 [115, 105, 102, 114, 101, 108, 101, 110, 101, 99, 101, 107, 0, 0, 0, 0] 

Результирующий шифротекст – это ++ SkQF1sG1RQPZshPkGuVg == в Base64, который при декодировании на простые байты и перекодированном в шестнадцатеричном виде становится «FBE4A4405D6C1B54503D9B213E41AE56» – именно то, что возвращает онлайновый инструмент.

Но если вы заполняете открытый текст с помощью дополнения PKCS # 7 , как и в вашем PHP-коде выше:

 $pad = $block - (strlen($str) % $block); $str .= str_repeat(chr($pad), $pad); 

то этот открытый текст дополняется ЧЕТЫРЕ, и вы шифруете:

 [115, 105, 102, 114, 101, 108, 101, 110, 101, 99, 101, 107, 4, 4, 4, 4] 

Результирующий зашифрованный текст равен + wL2yf + 72thixicjw0duQA == – только то, что вы показываете выше в своем вопросе.

Любая панель с обеих сторон с ZEROES или панель с обеих сторон с PKCS # 7 и ваши результаты должны совпадать.