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

У меня проблема при расшифровке (с помощью CryptoJs) моих зашифрованных данных PHP.
Вот мое шифрование PHP:

function encrypt($pure_string, $encryption_key, $iv) {
$encrypted_string = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_CBC, $iv);
return $encrypted_string;
}

function cripto()
{
$crypto_key = "230e8cb8c43d532f389ff0e2b5337919";
$data_to_encrypt = "Data to encrypt";

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$ciphertext = $this->encrypt($data_to_encrypt, $crypto_key, $iv);
return array("iv" => pack('H*', $iv), "chipertext" => base64_encode($ciphertext),"key" => $crypto_key);

}

А вот мой код JavaScript (результат криптографической функции php хранится в зашифрованной переменной):

var ciphertext = <?php echo '"'.$encrypted["ciphertext"].'"'; ?>;
var iv = <?php echo '"'.$encrypted["iv"].'"'; ?>;
var crypto_key = <?php echo '"'.$encrypted["key"].'"'; ?>;

iv = CryptoJS.enc.Hex.parse(iv);
ciphertext = CryptoJS.enc.Base64.parse(ciphertext);

var decrypted = CryptoJS.AES.decrypt(ciphertext, crypto_key,{ iv: iv });
console.log(decrypted.toString(CryptoJS.enc.Utf8));

Мое расшифрованное значение всегда пустая строка, и я не могу понять, почему.

-1

Решение

У вас есть две проблемы:

  • PHP использует заполнение нулями (заполнение 0-15 байтов 0x00), но CryptoJS по умолчанию использует заполнение PKCS # 7. Это несовместимо.
  • CryptoJS» decrypt() Функция ожидает объект CipherParams, который вы можете просто эмулировать, передавая объект с ciphertext набор свойств.

Все вместе:

iv = CryptoJS.enc.Hex.parse(iv);
ciphertext = CryptoJS.enc.Base64.parse(ciphertext);

var decrypted = CryptoJS.AES.decrypt({ ciphertext: ciphertext }, crypto_key, {
iv: iv,
padding: CryptoJS.pad.ZeroPadding
});
console.log(decrypted.toString(CryptoJS.enc.Utf8));

Не забудьте включить коврик-zeropadding-min.js.


Имейте в виду, что криптография JavaScript имеет свои проблемы для оправдания. Вы действительно должны использовать SSL, потому что без SSL это просто запутывание (ключ отправляется вместе с зашифрованным текстом).

Было бы лучше сделать PKCS # 7 отступ в PHP и оставьте значение по умолчанию в CryptoJS.

1

Другие решения

Других решений пока нет …