CryptoJS дешифрование из PHP - PullRequest
       27

CryptoJS дешифрование из PHP

0 голосов
/ 24 октября 2018

Вот мой код 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"
...