У меня есть js-скрипт, который шифрует данные, которые являются «Blader». Если я зашифрую его, он вернет вывод
РЕЗУЛЬТАТЫ JS-SCRIPT
uqnOrevjCc2YCvY3uKNjzA==
Теперь, будучи этим ответом в качестве базы для сравнения, я написал или, вернее сказать, искал эквивалентный скрипт на PHP, подобный моему сценарию JS. Меня смущает то, что логика правильная, но ответ другой. На моем php-скрипте, который используется при использовании mcrypt, у меня есть этот результат в
mcrypt РЕЗУЛЬТАТ
HzfWFNKcAmkO6zJEYjbG4Q==
Если вы заметили, длина будет одинаковой, что означает, что логика / модификация кода, который я сделал, была правильной. Теперь, как я уже сказал, я скопировал сценарий над некоторыми сообщениями здесь.
Вот сценарий JS, который, я думаю, использует крипто-JS
function crypto_encrypt(text) { //This is for JS var keyBase64 = CryptoJS.enc.Base64.parse("ITU2NjNhI0tOc2FmZExOTQ=="); var iv = CryptoJS.enc.Base64.parse('AAAAAAAAAAAAAAAAAAAAAA=='); var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(text), keyBase64, { keySize: 128 / 8, iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 //padding: CryptoJS.pad.ZeroPadding }); // Returns a Base64 encoded string. return encrypted; }
И вот код, который я нашел в mcrypt / mycrypt
<?php $encrypted = "Blader"; $iv = "0000000000000000"; // iv_base64 from JS $key = hexdec("213536363361234b4e736166644c4e4d"); // key_base64 from JS $plaintext = mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv ); echo base64_encode($plaintext); ?>
Теперь вопрос в том, что я пробовал из UTF8_encode до всего base64_encode и декодировал, но все еще не могу найти, что не так, и я – это любопытство, которое доступно этому или нет, поскольку я замечаю, что IV из JS-Script отличается от IV в mcryp (PHP) все, что я пытался повторить. Любые советы, комментарии и предложения будут очень благодарны.
Мир.
Во-первых, вы должны использовать точно такой же ключ и IV в PHP, как и в CryptoJS, или это просто не сработает. Вы сравнили значения ключа и IV? Они не совпадают.
Во-вторых, вы должны использовать одинаковое дополнение с каждой стороны. Вы проверили, как прокладки MCrypt? Он использует нулевое дополнение. Ваши два открытых текста различны , потому что заполнение является частью открытого текста.
Наконец, вы не хотите использовать mcrypt_ encrypt вместо mcrypt_decrypt здесь?
Если вы сопоставляете ключ и IV, а также отступы и шифруете в PHP, вы получите тот же результат (я вручную добавил с помощью \ x0a – 10 – в соответствии с вашим дополнением PKCS # 7):
$encrypted = "Blader\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a"; $iv = base64_decode('AAAAAAAAAAAAAAAAAAAAAA=='); $key = base64_decode('ITU2NjNhI0tOc2FmZExOTQ=='); $plaintext = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv ); echo base64_encode($plaintext); uqnOrevjCc2YCvY3uKNjzA==