2016-12-19 4 views
2

Я шифровании некоторые параметры в PHP с помощьюШифрование в PHP OpenSSL и расшифровки в JavaScript CryptoJS

openssl("parameter", "AES-256-ECB", "client") 

, и я хочу, чтобы расшифровать в CryptoJS:

CryptoJS.AES.decrypt(parameter, "client", {mode: CryptoJS.mode.ECB}).toString(CryptoJS.enc.Utf8); 

но бросает пустой строка.

Любые предложения?

ответ

4

CryptoJS: PHP OpenSSL шифровать -> Javascript дешифрования

PHP:

function CryptoJSAesEncrypt($passphrase, $plain_text){ 

    $salt = openssl_random_pseudo_bytes(256); 
    $iv = openssl_random_pseudo_bytes(16); 
    //on PHP7 can use random_bytes() istead openssl_random_pseudo_bytes() 
    //or PHP5x see : https://github.com/paragonie/random_compat 

    $iterations = 999; 
    $key = hash_pbkdf2("sha512", $passphrase, $salt, $iterations, 64); 

    $encrypted_data = openssl_encrypt($plain_text, 'aes-256-cbc', hex2bin($key), OPENSSL_RAW_DATA, $iv); 

    $data = array("ciphertext" => base64_encode($encrypted_data), "iv" => bin2hex($iv), "salt" => bin2hex($salt)); 
    return json_encode($data); 
} 

$string_json_fromPHP = CryptoJSAesEncrypt("your passphrase", "your plain text"); 

JS:

function CryptoJSAesDecrypt(passphrase,encrypted_json_string){ 

    var obj_json = JSON.parse(encrypted_json_string); 

    var encrypted = obj_json.ciphertext; 
    var salt = CryptoJS.enc.Hex.parse(obj_json.salt); 
    var iv = CryptoJS.enc.Hex.parse(obj_json.iv); 

    var key = CryptoJS.PBKDF2(passphrase, salt, { hasher: CryptoJS.algo.SHA512, keySize: 64/8, iterations: 999}); 


    var decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: iv}); 

    return decrypted.toString(CryptoJS.enc.Utf8); 
} 

console.log(CryptoJSAesDecrypt('your passphrase','<?php echo $string_json_fromPHP?>')); 

CryptoJS: JavaScript шифровать -> PHP OpenSSL дешифрования

JS:

function CryptoJSAesEncrypt(passphrase, plain_text){ 

    var salt = CryptoJS.lib.WordArray.random(256); 
    var iv = CryptoJS.lib.WordArray.random(16); 
    //for more random entropy can use : https://github.com/wwwtyro/cryptico/blob/master/random.js instead CryptoJS random() or another js PRNG 

    var key = CryptoJS.PBKDF2(passphrase, salt, { hasher: CryptoJS.algo.SHA512, keySize: 64/8, iterations: 999 }); 

    var encrypted = CryptoJS.AES.encrypt(plain_text, key, {iv: iv}); 

    var data = { 
     ciphertext : CryptoJS.enc.Base64.stringify(encrypted.ciphertext), 
     salt : CryptoJS.enc.Hex.stringify(salt), 
     iv : CryptoJS.enc.Hex.stringify(iv)  
    } 

    return JSON.stringify(data); 
} 

PHP:

function CryptoJSAesDecrypt($passphrase, $jsonString){ 

    $jsondata = json_decode($jsonString, true); 
    try { 
     $salt = hex2bin($jsondata["salt"]); 
     $iv = hex2bin($jsondata["iv"]);   
    } catch(Exception $e) { return null; } 

    $ciphertext = base64_decode($jsondata["ciphertext"]); 
    $iterations = 999; //same as js encrypting 

    $key = hash_pbkdf2("sha512", $passphrase, $salt, $iterations, 64); 

    $decrypted= openssl_decrypt($ciphertext , 'aes-256-cbc', hex2bin($key), OPENSSL_RAW_DATA, $iv); 

    return $decrypted; 

}