2014-01-17 97 views
7

我想用CryptoJS在Javascript中加密並在PHP中解密。 JS代碼是:AES-256-CBC Mcrypt-PHP解密和Crypto-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'); // 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); 

而且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", "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); 

它成功地在PHP代碼的工作 - 只有key_base64是不是可以改變的,它必須是什麼用戶記得......然後它給了我一個鹽擺脫輸入的密碼的關鍵,IDK它是如何設法獲取使用CryptoJS

回答

14

您的代碼將工作,如果你只是修復了幾個錯別字有

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 "); 
+0

這讓我很生氣= [ – Paul

+0

作品,雖然我加了'\ r \ N'字符修剪PHP端 –

+0

@Shuric的名單我有一個項目使用cryptoJS 。它是科爾多瓦的客戶端服務器移動應用程序。我之前在客戶端使用cryptoJS進行加密和解密,因爲我只需要無法讀取sqlite數據。但我需要加密服務器端的數據,以便在通過互聯網傳輸時使其無法讀取。所以我認爲這與你的答案相反。所以你能幫我解決它。老實說,我仍然不明白與AES加密我只使用密碼加密和cryptoJS解密。我不知道iv和鹽是什麼。提前致謝。 –