У вас есть несколько опечаток с '
трейлингом ;
на echo '<select id="species" name="species">';'
и echo '</select>';'
Тогда я не до конца понимаю, почему вы пытаетесь зашифровать данные формы и чтоименно здесь вы пытаетесь достичь.
В любом случае, к технической части вашего вопроса о том, почему не работает часть шифрования-дешифрования:
Прежде всего вы используете $key = password_hash($password, CRYPT_BLOWFISH, ['cost' => 12]);
, чтосоздайте новую строку каждый раз.
Измените это на следующее $key = hash('sha256', $password, true);
Тогда $iv
должно быть уникальным каждый раз, когда вы делаете новое шифрование, и должно быть каким-либо образом передано в вашей переменной POST.Хороший способ получить $ iv - это использовать openssl_random_pseudo_bytes()
Итак, чтобы достичь того, о чем я говорил, прежде чем менять свои функции:
public function encrypt_data($data) {
$plaintext = $data;
$password = '3sc3RLrpd17';
$method = "AES-256-CBC";
$key = hash('sha256', $password, true);
$iv = openssl_random_pseudo_bytes(16);
$ciphertext = openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv);
$hash = hash_hmac('sha256', $ciphertext, $key, true);
return $iv . $hash . $ciphertext;
}
public function decrypt_data($data) {
$ivHashCiphertext = $data;
$password = '3sc3RLrpd17';
$method = "AES-256-CBC";
$iv = substr($ivHashCiphertext, 0, 16);
$hash = substr($ivHashCiphertext, 16, 32);
$ciphertext = substr($ivHashCiphertext, 48);
$key = hash('sha256', $password, true);
if (hash_hmac('sha256', $ciphertext, $key, true) !== $hash) return null;
return openssl_decrypt($ciphertext, $method, $key, OPENSSL_RAW_DATA, $iv);
}
Наконец, вам нужно использовать base64_encode()
и base64_decode()
при вызове функций encrypt_data
и decrypt_data()
$species1Enc = base64_encode($obj->encrypt_data($species1));
$species2Enc = base64_encode($obj->encrypt_data($species2));
$decryptData = $decdata->decrypt_data(base64_decode($_POST['species']));