AES-256-CBC Mcrypt-PHP解密和Crypto-JS加密 [英] AES-256-CBC Mcrypt-PHP decrypt and Crypto-JS Encrypt
问题描述
我正在使用CryptoJS进行Javascript加密,并在PHP中进行解密。 JS代码是:
var salt = CryptoJS.lib.WordArray.random(128/8);
var key256Bits500Iterations = CryptoJS.PBKDF2(Secret Passphrase,salt,{keySize:256/32,iterations:500});
var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); //刚刚选择一个例子,通常是随机的,
encrypted = CryptoJS.AES.encrypt(Message,key512Bits1000Iterations,{iv:iv});
var data_base64 = crypted.ciphertext.toString(CryptoJS.enc.Base64);
var iv_base64 = crypted.iv.toString(CryptoJS.enc.Base64);
var key_base64 = crypted.key.toString(CryptoJS.enc.Base64);
PHP如下:
$ encrypted = base64_decode($ data_base64);
$ iv = base64_decode($ iv_base64);
$ key = base64_decode($ key_base64);
$ plaintext = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$ key,$ encrypted,MCRYPT_MODE_CBC,$ iv);
echo($ plaintext);
这不会返回正确答案。
<我不确定事情发生的不好我需要做自己的IV,但如果我只是说:
CryptoJS.AES.Encrypt(Message,秘密密码);
var data_base64 = crypted.ciphertext.toString(CryptoJS.enc.Base64);
var iv_base64 = crypted.iv.toString(CryptoJS.enc.Base64);
var key_base64 = crypted.key.toString(CryptoJS.enc.Base64);
它可以在PHP代码中成功工作 - 只有key_base64不是可以改变的东西,它必须是用户记住的...然后它给我一个盐从密码输入和IDK得到一个密钥如何设法使用CryptoJS
如果您只是修正了一些打字错误,您的代码将会工作
JS >
< script src =http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups /aes.js\"></script>
< script src =http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js>< / script>
< script>
var salt = CryptoJS.lib.WordArray.random(128/8);
var key256Bits500Iterations = CryptoJS.PBKDF2(Secret Passphrase,salt,{keySize:256/32,iterations:500});
var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); //刚刚选择一个例子,通常是随机的,
var encrypted = CryptoJS.AES.encrypt(Message,key256Bits500Iterations,{iv:iv});
var data_base64 = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
var iv_base64 = encrypted.iv.toString(CryptoJS.enc.Base64);
var key_base64 = encrypted.key.toString(CryptoJS.enc.Base64);
< / script>
PHP
<?php
$ encrypted = base64_decode(data_base64); // data_base64 from JS
$ iv = base64_decode(iv_base64); // iv_base64 from JS
$ key = base64_decode(key_base64); // key_base64 from JS
$ plaintext = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$ key,$ encrypted,MCRYPT_MODE_CBC,$ iv),\t\0);
I am trying to encrypt in Javascript with CryptoJS and decrypt in PHP. The JS code is:
var salt = CryptoJS.lib.WordArray.random(128/8);
var key256Bits500Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32, iterations: 500 });
var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); // just chosen for an example, usually random as well
encrypted = CryptoJS.AES.encrypt("Message", key512Bits1000Iterations, { iv: iv });
var data_base64 = crypted.ciphertext.toString(CryptoJS.enc.Base64);
var iv_base64 = crypted.iv.toString(CryptoJS.enc.Base64);
var key_base64 = crypted.key.toString(CryptoJS.enc.Base64);
And the PHP is as follows:
$encrypted = base64_decode($data_base64);
$iv = base64_decode($iv_base64);
$key = base64_decode($key_base64);
$plaintext = mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv);
echo ($plaintext);
This does not return the correct answer.
I am unsure where things are going poorly! I need to do my own IV, but if I do just say:
CryptoJS.AES.Encrypt("Message", "Secret Passphrase");
var data_base64 = crypted.ciphertext.toString(CryptoJS.enc.Base64);
var iv_base64 = crypted.iv.toString(CryptoJS.enc.Base64);
var key_base64 = crypted.key.toString(CryptoJS.enc.Base64);
It DOES successfully work in the PHP code -- only the key_base64 isn't something that can be changed, it has to be what the user remembers... And then it gives me a salt to get a key from the passphrase entered and IDK how it managed to get that using CryptoJS
Your code WILL work if you just fix a few typos there
JS
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script>
<script>
var salt = CryptoJS.lib.WordArray.random(128/8);
var key256Bits500Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32, iterations: 500 });
var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); // just chosen for an example, usually random as well
var encrypted = CryptoJS.AES.encrypt("Message", key256Bits500Iterations, { iv: iv });
var data_base64 = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
var iv_base64 = encrypted.iv.toString(CryptoJS.enc.Base64);
var key_base64 = encrypted.key.toString(CryptoJS.enc.Base64);
</script>
PHP
<?php
$encrypted = base64_decode("data_base64"); // data_base64 from JS
$iv = base64_decode("iv_base64"); // iv_base64 from JS
$key = base64_decode("key_base64"); // key_base64 from JS
$plaintext = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv ), "\t\0 " );
这篇关于AES-256-CBC Mcrypt-PHP解密和Crypto-JS加密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!