У меня есть следующая функция шифрования, я пытался отменить ее, но кажется, что я что-то пропустил
$ceva = "123456";
function encrypt($plaintext,$textHos) {
$textLen=str_pad(dechex(strlen($plaintext)),8, '0', STR_PAD_LEFT);
$salt='WSj2g7jTvc8ISmL60Akn';
$textHosHash=hash('sha256',$salt.$textHos);
$textHos= md5($textHos,true);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $textHos,
$plaintext, MCRYPT_MODE_CBC,$iv);
$ciphertext = $iv . $textHosHash . $textLen . $ciphertext;
$ciphertext_base64 = base64_encode($ciphertext);
return $ciphertext_base64;
}
$data = encrypt($ceva,$textHos);
то, что я пытался сделать, это:
$data = 'HpOrKcKS1hwAiFfpbZnijmZmZjg1OWMzOWFlNzRiMzU2Y2JiMTQ5OTY4MTI3MWNiYjQzYjBkMTAyNDUzM2ZhNGJjZmZhNzQ4M2QxN2M0ZGYwMDAwMDAwNu6mYaA+BBBVfbFXChMm/BE=';
$textHos = 'MCRYPT_RIJNDAEL_128';
$salt='WSj2g7jTvc8ISmL60Akn';
$textHosHash=hash('sha256',$salt.$textHos);
$textHos= md5($textHos,true);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$textHosHash=hash('sha256',$salt.$textHos);
$base64de = base64_decode($data);
$mdecrypt = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $textHos, $base64de, MCRYPT_MODE_CBC,$iv);
затем я остановился, потому что мой разум был заморожен.
любая идея?
Я не собираюсь писать код для вас, но я опишу шаги. Чтобы расшифровать, вы должны отменить шаги, которые вы сделали для шифрования, в первую очередь. Итак, давайте посмотрим на зашифрованный текст и попробуем.
Последнее, что мы сделали на стороне шифрования, было base64 шифровать это, так что первое, что мы делаем на стороне расшифровки, это base64 раскодировать Это. Это даст нам строку байтов, которая была создана как конкатенация iv, ключевого хэша, десятичной десятичной длины ASCII длины исходного текста и зашифрованного текста. Так что теперь вы должны извлечь эти поля. К счастью, вы знаете точные длины первых 3 полей.
iv: 16 символов
Ключевой хэш: 64 символа (шестнадцатеричный ASCII, представляющий 32 байта)
длина открытого текста: 8 символов (десятичный ASCII)
зашифрованный текст: все, что осталось
В вашем коде вы пытаетесь создать новый случайный IV для расшифровки. Это неправильно, вы должны восстановить исходный IV, использованный для шифрования, и использовать этот IV для расшифровки. Кроме того, поскольку вы передали хэш ключа, вы должны хешировать используемый вами ключ дешифрования и убедиться, что он совпадает с хешем, отправленным с зашифрованным текстом. Теперь у вас есть все необходимое для расшифровки зашифрованного текста. Результатом будет мягкий текст. Наконец, вы используете длину открытого текста, чтобы удалить любые дополнения, которые могли быть добавлены.
Вы пропустили эту часть в функции шифрования:
$ciphertext = $iv . $textHosHash . $textLen . $ciphertext;
Перед запуском `mcrypt_decrypt ‘вам нужно убрать эти вещи с фронта данных.