2014-01-17 6 views
7

Ich versuche in Javascript mit CryptoJS zu verschlüsseln und in PHP zu entschlüsseln. Der JS-Code ist:AES-256-CBC Mcrypt-PHP entschlüsseln und Crypto-JS verschlüsseln

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); 

Und die PHP ist wie folgt:

$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); 

Dies schließt nicht die richtige Antwort zurück.

Ich bin unsicher, wo es schlecht läuft! Ich brauche mein eigenes IV zu tun, aber wenn ich sage, tun gerade:

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); 

Es erfolgreich in der PHP-Code funktioniert - nur die key_base64 ist nicht etwas, das geändert werden kann, muss es das sein, was die Benutzer erinnert ... und dann gibt es mir ein Salz, das einen Schlüssel aus dem Passwort zu erhalten eingegeben und IDK, wie es geschaffen, dass CryptoJS mit bekommen

Antwort

14

Ihr Code funktioniert, wenn Sie nur ein paar Tippfehler beheben es

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

Das machte mich so wütend = [ – Paul

+0

Works, obwohl ich 'hinzugefügt \ r \ n 'in die Liste der Zeichen PHP-Seite –

+0

@Shuric trimmen ich ein Projekt Verwendung cryptoJS haben . Es ist Client Server Mobile App mit Cordova. Ich benutze CryptoJS für die Verschlüsselung und Entschlüsselung nur auf der Client-Seite vorher, weil ich nur die SQLite-Daten nicht lesen können. aber ich muss die Daten auf der Server-Seite verschlüsseln, um sie unlesbar zu machen, während sie über das Internet übertragen. Also ich denke es ist das Gegenteil von deiner Antwort. Kannst du mir helfen, es zu lösen? ehrlich gesagt verstehe ich immer noch nicht mit aes-verschlüsselung ich benutze nur passwort in verschlüsseln und entschlüsseln mit cryptoJS. Ich weiß nicht, was iv und Salz ist. Danke im Voraus. –

Verwandte Themen