Php openssl_decrypt和base64_decode随机无法解码/解密CryptoJS中的密文

Php openssl_decrypt和base64_decode随机无法解码/解密CryptoJS中的密文,php,encryption,encoding,base64,cryptojs,Php,Encryption,Encoding,Base64,Cryptojs,我使用Brain Foo Long使用CryptoJS和PHP5.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=

我使用Brain Foo Long使用CryptoJS和PHP5.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);
}
我使用以下代码解密服务器端:

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

我认为您需要使用url安全的Base64字母表。在开始处理PHP之前,您是否检查了接收到的内容?当我在PHP openssl_decrypt中出错时,我在控制台日志中发现POST参数的以下错误匹配:“dummydata where”在源代码有“+”时有空格。正确的是带有“+”字符的消息。在php中,输入空格(不是“+”)。我想这是错误匹配,但为什么呢?我做了一个更正:当我在php openssl_decrypt中出现错误时,我在控制台日志中发现POST参数的以下错误匹配:在发送之前,数据有字符“+”,这是在php的空白空间中修改的。我想这就是问题所在,但为什么呢?这可能取决于你如何发送和接收数据。jQuery和PHP可能会对数据进行进一步处理。从PHP.net:-urldecode-解码URL编码字符串解码给定字符串中的任何%###编码。加号(“+”)被解码为空格字符。为此,PHP使e urldecode每次都从客户端接收数据,并在空格char中更改urldecode“+”字符。然后是一个简单的str_replace()解析。我认为您需要使用url安全的Base64字母表。在开始处理PHP之前,您是否检查了接收到的内容?当我在PHP openssl_decrypt中出错时,我在控制台日志中发现POST参数的以下错误匹配:“dummydata where”在源代码有“+”时有空格。正确的是带有“+”字符的消息。在php中,输入空格(不是“+”)。我想这是错误匹配,但为什么呢?我做了一个更正:当我在php openssl_decrypt中出现错误时,我在控制台日志中发现POST参数的以下错误匹配:在发送之前,数据有字符“+”,这是在php的空白空间中修改的。我想这就是问题所在,但为什么呢?这可能取决于你如何发送和接收数据。jQuery和PHP可能会对数据进行进一步处理。从PHP.net:-urldecode-解码URL编码字符串解码给定字符串中的任何%###编码。加号(“+”)被解码为空格字符。为此,PHP使e urldecode每次都从客户端接收数据,并在空格char中更改urldecode“+”字符。然后是一个简单的str_replace()解析。