Вот мой код PHP:
$cipher = 'aes-256-cbc';
// 128-bit key
$key = md5('super secret', true);
// 128-bit IV
$iv = openssl_random_pseudo_bytes(16);
$ciphertext = openssl_encrypt($message, $cipher, $key, OPENSSL_RAW_DATA, $iv);
error_log(__FILE__ . __LINE__ . ' key: ' . bin2hex($key));
error_log(__FILE__ . __LINE__ . ' iv: ' . bin2hex($iv));
error_log(__FILE__ . __LINE__ . ' ciphertext: ' . bin2hex($ciphertext));
file_put_contents($courseOutlineFile, bin2hex($iv) . bin2hex($ciphertext));
И мой код Javascript, где res - это текст из ответа ajax для чтения файла, сгенерированного PHP:
var k = CryptoJS.MD5('super secret');
var iv = CryptoJS.enc.Hex.parse(res.substring(0, 32));
var data = CryptoJS.enc.Hex.parse(res.substring(32));
console.log("key: ", CryptoJS.enc.Hex.stringify(k))
console.log("iv: ", CryptoJS.enc.Hex.stringify(iv))
console.log("ciphertext: ", CryptoJS.enc.Hex.stringify(data))
var cipher = CryptoJS.lib.CipherParams.create({
ciphertext: data
});
var dec = CryptoJS.AES.decrypt(cipher, k, {
iv: iv,
mode: CryptoJS.mode.CBC
});
console.log("decrypted:", dec.toString(CryptoJS.enc.Hex));
var json = dec.toString(CryptoJS.enc.Utf8);
console.log("json:", json)
I 'С помощью инструмента сравнения мы убедились, что шестнадцатеричные значения ключа, IV и данных в PHP одинаковы, и что выводится на консоль браузера.Он успешно расшифровывает (что-то), но последний оператор console.log выдает ошибку: Ошибка: «Неверные данные UTF-8».Если я попробую Latin1, то получится куча непечатаемых символов.
Переменная $ message, которую я шифрую, является выводом из массива json_encode.
Кто-нибудь знает, что ямне не хватает?
Это первые 80 шестнадцатеричных цифр дешифрованного результата, вся вещь чуть меньше 28k шестнадцатеричных цифр.1018 * Вот полный пример:
<?php
ini_set('display_errors', 1);
$jsonObj = [
'el1' => 'val1',
'ar1' => [
'el2' => 'val2',
'el3' => 'val3',
],
];
$message = json_encode($jsonObj);
echo $message . '<br>';
$cipher = 'aes-256-cbc';
// 128-bit key
$key = md5('super secret', true);
// 128-bit IV
$iv = openssl_random_pseudo_bytes(16);
$ciphertext = openssl_encrypt($message, $cipher, $key, OPENSSL_RAW_DATA, $iv);
echo ' key: ' . bin2hex($key) . '<br>';
echo ' iv: ' . bin2hex($iv) . '<br>';
echo ' ciphertext: ' . bin2hex($ciphertext) . '<br>';
echo bin2hex($iv) . bin2hex($ciphertext);
Вывод:
{"el1":"val1","ar1":{"el2":"val2","el3":"val3"}}
key: 5f1903f5f2cb32acb4c1dcae9e30d374
iv: bfdb765d1ca4734c5748ffb9883dd15c
ciphertext:
02717027440040375f7e0dbea69e77783949d3c160529eef0b9d59a751a2a312fa137a5034f6f4c9f89a348ef3f96fce40c8afe0c8a20a2f7a2535417cca2dd2
bfdb765d1ca4734c5748ffb9883dd15c02717027440040375f7e0dbea69e77783949d3c160529eef0b9d59a751a2a312fa137a5034f6f4c9f89a348ef3f96fce40c8afe0c8a20a2f7a2535417cca2dd2
И Javascript:
res = 'bfdb765d1ca4734c5748ffb9883dd15c02717027440040375f7e0dbea69e77783949d3c160529eef0b9d59a751a2a312fa137a5034f6f4c9f89a348ef3f96fce40c8afe0c8a20a2f7a2535417cca2dd2';
var k = CryptoJS.MD5('super secret');
var iv = CryptoJS.enc.Hex.parse(res.substring(0, 32));
var data = CryptoJS.enc.Hex.parse(res.substring(32));
console.log("key: ", CryptoJS.enc.Hex.stringify(k))
console.log("iv: ", CryptoJS.enc.Hex.stringify(iv))
console.log("ciphertext: ", CryptoJS.enc.Hex.stringify(data))
var cipher = CryptoJS.lib.CipherParams.create({
ciphertext: data
});
var dec = CryptoJS.AES.decrypt(cipher, k, {
iv: iv,
mode: CryptoJS.mode.CBC
});
console.log("dec:", dec.toString());
console.log("decrypted:", dec.toString(CryptoJS.enc.Hex));
var json = dec.toString(CryptoJS.enc.Utf8);
console.log("json:", json)
// parse the JSON string to get the object
var obj = JSON.parse(json);
И вывод консоли:
key: 5f1903f5f2cb32acb4c1dcae9e30d374
iv: bfdb765d1ca4734c5748ffb9883dd15c
ciphertext: 02717027440040375f7e0dbea69e77783949d3c160529eef0b9d59a751a2a312fa137a5034f6f4c9f89a348ef3f96fce40c8afe0c8a20a2f7a2535417cca2dd2
dec: 50d411522f2d08b34d68f847fb78e0cfabf1144f933d83839431732a473079d9b3ed843e120d9ad6a239
decrypted: 50d411522f2d08b34d68f847fb78e0cfabf1144f933d83839431732a473079d9b3ed843e120d9ad6a239
Error during decryption: Error: "Malformed UTF-8 data"