Php openssl_decrypt和base64_decode随机无法解码/解密CryptoJS中的密文
我使用Brain Foo Long使用CryptoJS和PHP5.5.12 我使用以下代码加密客户端: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=
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()解析。