openssl_decrypt和base64_decode随机无法解密/解密来自CryptoJS

时间:2016-02-29 10:05:11

标签: php encryption encoding base64 cryptojs

我使用来自Brain Foo Long的example code与CryptoJS和php 5.5.12合作。

我使用以下代码加密客户端:

var msg = 'String to crypt';
var key = 'password';
var crypt_text = CryptoJS.AES.encrypt(JSON.stringify(msg), key, {format: CryptoJSAesJson}).toString();
sendString = "msg=" + crypt_text +"&key=" + k ; 
//... call jQuery.ajax

我使用以下代码解密服务器端:

function cryptoJsAesDecrypt($passphrase, $jsonString){
    $jsondata = json_decode($jsonString, true);
    try {
        $salt = hex2bin($jsondata["s"]);
        $iv  = hex2bin($jsondata["iv"]);
    } catch(Exception $e) { return null; }
    $ct = base64_decode($jsondata["ct"]);
    $concatedPassphrase = $passphrase.$salt;
    $md5 = array();
    $md5[0] = md5($concatedPassphrase, true);
    $result = $md5[0];
    for ($i = 1; $i < 3; $i++) {
        $md5[$i] = md5($md5[$i - 1].$concatedPassphrase, true);
        $result .= $md5[$i];
    }
    $key = substr($result, 0, 32);
    $data = openssl_decrypt($ct, 'aes-256-cbc', $key, true, $iv);
    return json_decode($data, true);
}

随机地,服务器代码openssl_decrypt返回false。 通常情况下,我看到$ct = base64_decode($jsondata["ct"]);错误地输入&#34; base64在字母表外面#34;但我尝试在发送之前检查js,看起来是正确的。代码如下:

var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij ............" };
var sendString = "msg=" + crypt_text +"&key=" + k ; 
if( Base64.decode( Base64.encode(sendString) )=== sendString  ){
    // ok
} else {
    alert('base 64 error');
    return;
}

0 个答案:

没有答案