У меня есть зашифрованный бит текста, который мне нужно расшифровать. Он зашифрован AES-256-CBC. У меня есть зашифрованный текст, ключ и iv. Однако, что бы я ни старался, я просто не могу заставить его работать.
Интернет предложил, чтобы cipher Rijndael mcrypt мог это сделать, поэтому вот что у меня есть сейчас:
function decrypt_data($data, $iv, $key) { $cypher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); // initialize encryption handle if (mcrypt_generic_init($cypher, $key, $iv) != -1) { // decrypt $decrypted = mdecrypt_generic($cypher, $data); // clean up mcrypt_generic_deinit($cypher); mcrypt_module_close($cypher); return $decrypted; } return false; }
В настоящее время я получаю 2 предупреждения, а выход – тарабарщина:
Warning: mcrypt_generic_init() [function.mcrypt-generic-init]: Key size too large; supplied length: 64, max: 32 in /var/www/includes/function.decrypt_data.php on line 8 Warning: mcrypt_generic_init() [function.mcrypt-generic-init]: Iv size incorrect; supplied length: 32, needed: 16 in /var/www/includes/function.decrypt_data.php on line 8
Любая помощь будет оценена по достоинству.
Я не очень хорошо знаком с этим материалом, но кажется, что попытка MCRYPT_RIJNDAEL_256
вместо MCRYPT_RIJNDAEL_128
станет очевидным следующим шагом …
Edit: Вы правы – это не то, что вам нужно. MCRYPT_RIJNDAEL_128
на самом деле является правильным выбором. Согласно предоставленной вами ссылке, ваш ключ и IV в два раза больше, чем они должны быть:
// How do you do 256-bit AES encryption in PHP vs. 128-bit AES encryption??? // The answer is: Give it a key that's 32 bytes long as opposed to 16 bytes long. // For example: $key256 = '12345678901234561234567890123456'; $key128 = '1234567890123456'; // Here's our 128-bit IV which is used for both 256-bit and 128-bit keys. $iv = '1234567890123456';
Я посылаю вам один пример, пожалуйста, проверьте код, хорошо
$data_to_encrypt = "2~1~000024~0910~20130723092446~T~00002000~USD~F~375019001012120~0~0~00000000000~"; $key128 = "abcdef0123456789abcdef0123456789"; $iv = "0000000000000000"; $cc = $data_to_encrypt; $key = $key128; $iv = $iv; $length = strlen($cc); $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'','cbc',''); mcrypt_generic_init($cipher, $key, $iv); $encrypted = base64_encode(mcrypt_generic($cipher,$cc)); mcrypt_generic_deinit($cipher); mcrypt_generic_init($cipher, $key, $iv); $decrypted = mdecrypt_generic($cipher,base64_decode($encrypted)); mcrypt_generic_deinit($cipher); echo "encrypted: " . $encrypted; echo "<br/>"; echo "length:".strlen($encrypted); echo "<br/>"; echo "decrypted: " . substr($decrypted, 0, $length);