Я шифрую строку «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
Руководство пользователя 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 и ваши результаты должны совпадать.