Расшифровка AES с помощью Javascript CryptoJS после шифрования с помощью PHP mcrypt

Шифрование в PHP с помощью mcrypt

<?php
$string = 'Secret Message';
$key = 'd4b494e4502a62edd695a903a94c2701';
$iv = '02f30dffbb0d084755f438f7d8be4a7d';

$encrypted = base64_encode(
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_256,
        $key,
        $string,
        MCRYPT_MODE_CBC,
        $iv
    )
);
//$encrypted results in 'nYoFAiyDARVSI09lH/IPdim5TvE51izVjk6sc2AK9Rg='
?>

Расшифровка в Javascript с помощью CryptoJS

<script>
var encrypted = 'nYoFAiyDARVSI09lH/IPdim5TvE51izVjk6sc2AK9Rg=';
var key = CryptoJS.enc.Hex.parse('d4b494e4502a62edd695a903a94c2701');
var iv = CryptoJS.enc.Hex.parse('02f30dffbb0d084755f438f7d8be4a7d');

var decrypted = CryptoJS.AES.decrypt(encrypted,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});

console.log(decrypted.toString(CryptoJS.enc.Utf8)); //prints an empty string
</script>

Я не могу понять, как заставить сторону Javascript выплевывать исходный текст.

1 ответ

Решение

РЕШИТЬ

Примечание: я обнаружил, что "MCRYPT_RIJNDAEL_256" в mcrypt PHP НЕ включен в AES. Он использует метод Rijndael, НО с 256-битным размером блока (не входит в AES). Итак, CryptoJS не обрабатывает 256-битные размеры блоков для Rijndael. Спасибо, Грегс

Тем не менее, я нашел реализацию, которая успешно расшифровывала зашифрованный текст, который я получал, запустив вышеописанную функцию PHP mcrypt, используя MCRYPT_RIJNDAEL_256 (Rijndael, 256-битный размер блока с 256-битным ключом /32-байтовым ключом).

Вот оно: https://code.google.com/p/js-mcrypt/

<script>
var encrypted = 'nYoFAiyDARVSI09lH/IPdim5TvE51izVjk6sc2AK9Rg=';
var key = 'd4b494e4502a62edd695a903a94c2701';
var iv = '02f30dffbb0d084755f438f7d8be4a7d';
var decrypted = mcrypt.Decrypt(atob(encrypted), iv, key, 'rijndael-256', 'cbc');
</script>

Я надеюсь, что это поможет кому-то, поскольку я провел неделю своего свободного времени, пытаясь понять это и почти сдаться.

Другие вопросы по тегам