AES - Crypto JS& PHP

时间:2014-12-12 21:24:29

标签: javascript php encryption aes

我在加密密码中加密的解密数据存在问题。有时它的工作原理有时不会,如果工作它返回"消息",但如果剂量它返回垃圾。

    var salt = CryptoJS.lib.WordArray.random(128/8); 
    var key256Bits500Iterations = CryptoJS.PBKDF2("password", salt, { keySize: 256/32, iterations: 5 });
    var iv  = CryptoJS.enc.Hex.parse('1011121c1d1e1f');
    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);

PHP

 $encrypted = base64_decode($_POST['data']); /
    $iv        = base64_decode($_POST['iv']);
    $key       = base64_decode($_POST['key']); 
    $plaintext = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, rtrim($key, "\t\0\r\n "), rtrim($encrypted, "\t\0\r\n "), MCRYPT_MODE_CBC, $iv ), "\t\0\r\n ");

我想继续使用cryptoJS。

2 个答案:

答案 0 :(得分:1)

最后我结束了: http://wiki.birth-online.de/snippets/php/aes-rijndael http://wiki.birth-online.de/snippets/javascript/aes-rijndael

但仍然需要进行一些调整:

$crypted = rtrim($_POST['msg'],'\t\0\r\n ');
$crypted = str_replace(" ","+",$crypted);
$password = 'itsmysecret';
$blocksize = 256; 
$decrypted =  AES::decrypt($crypted, $password, $blocksize);

现在可行。

答案 1 :(得分:0)

你不应该rtrim这把钥匙。密钥可以包含任何字节值,包括您刚删除的字节值。较旧的版本很乐意用0值字节填充密钥,这意味着密钥可能与CryptoJS源中使用的密钥不同。

使用密文发送密钥没有意义。相反,最好在PHP中使用PBKDF2并从密码中计算密钥。

最后,请注意PHP mcrypt默认为零填充,而不是使用PKCS#7。帮助页面上对mcrypt的评论包含一个很好的PKCS#7实现来执行取消填充。