Я хочу реализовать шифрование AES с использованием JavaScript. Используется AES CBC Mode. Мне удалось сделать это на PHP. Похоже:
public function encrypt($value) {
if (empty($value)) {
return $value;
}
$value = Unicode::convertToUtf8($value, 'UTF-8');
if ($key = $this->getEncryptionKey()) {
// Generates from key 1st 16 bytes.
$iv = mb_substr($key, 0, 16);
//encrypt message with key
$message = openssl_encrypt($value, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
return base64_encode($message);
}
}
public function getEncryptionKey() {
$key = 'secret';
$key = Unicode::convertToUtf8($key, 'UTF-8');
// Make sure the key is the correct size.
if (strlen($key) < 32) {
$key = str_pad($key, 32, "\0");
}
if (strlen($key) > 32) {
$key = mb_substr($key, 0, 32);
}
return $key;
}
Если я дам $ value = retest2; это дает мне ukUCH0SvgdmM8vTqQumAVg == вывод
Я знаю, что это правильно, я пробовал это с использованием C #, но получил тот же результат. Но когда я попытался воспроизвести это с помощью JavaScript, я не смог произвести тот же вывод PHP. Ниже приведен код JavaScript, который я пробовал:
const message = utf8.encode('retest2');
const password = utf8.encode('secret').padEnd(32, '\0');
const key = CryptoJS.enc.Hex.parse(password);
const iv = CryptoJS.enc.Hex.parse(password.substring(0, 16));
const encrypted = CryptoJS.AES.encrypt(message, key, {
iv: iv
});
console.log(btoa(encrypted.toString()));
Используя то же значение, я получаю dzd4bjNwenduQT09 .
Я также читал другие подобные вопросы, заданные здесь на ту же тему, но я не могу понять, где я иду не так?
Спасибо!