如何解密用JSEncrypt

时间:2018-02-24 14:12:01

标签: php cryptojs encryption-asymmetric php-openssl jsencrypt

我正在尝试通过使用对称和非对称加密来保护JS前端和PHP后端之间的通信。我正在客户端创建一个对称密钥,并使用服务器的公钥和JSEncrypt对其进行加密,然后将其发送到服务器以备将来使用。但是,当我在服务器端获取数据时,我会陷入困境。 openssl_open需要一个信封来解密对称密钥,我甚至不肯认为数据应该在信封中。我的印象是信封是用公钥加密的对称密钥,但使用它不起作用。我也尝试过不同的解码组合,因为我读过JSEncrypt在base 64中编码消息而十六进制的密钥,但这些尝试也没有结果。

JS加密代码:

let pub = "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----";

//I have a function that just creates a random string of characters
let key = generateKey(32);
let aesData = CryptoJS.AES.encrypt( "test", key );
let symKey = aesData.key + ":::" + aesData.iv;
let msg = aesData.toString();

let rsa = new JSEncrypt();
rsa.setPublicKey( pub );
let cryptKey = rsa.encrypt( symKey );

//I'm passing the data through a hidden form field
$("#key").val(cryptKey + ":::" + msg);

PHP解密代码:

$key = openssl_get_privatekey( file_get_contents( $_SERVER["PRIV_KEY"]) );
$encryptedKey = explode( ":::", $msg )[0];
$realMsg = base64_decode(explode( ":::", $msg )[1]);

openssl_open($realMsg, $decrypted, $encryptedKey, $key);
return $decrypted;

上面的代码没有输出,因为openssl_open调用失败(返回false)。当我基于64解码$ encryptedKey变量时,我得到:

�vEi���pΕ��d_���@����욲JE��

但对称密钥每次都会改变,因此输出也会每次都改变。就像我说的,我尝试了不同的编码组合,但它们都返回类似的废话。正如JS代码所示,我已经加密了消息“test”。

我之前从未实施过加密技术,所以我可能会在这方面脱颖而出,但在盯着这段代码几天之后,任何见解都会受到赞赏。

编辑:我在使用PHP中的私钥解密时遇到问题,而不是使用对称密钥

1 个答案:

答案 0 :(得分:2)

想出来!!!因此,我发现PHP具有解密功能,而不需要使用私钥来解密消息的名为openssl_private_decrypt的信封。通过使用该函数和base 64解码加密密钥,我能够解密服务器端的对称密钥,并且希望能够对称地解密消息。对于那些感兴趣的人,我在服务器端的代码是:

$key = openssl_get_privatekey( file_get_contents( $_SERVER['PRIV_KEY'] ) );
$encryptedKey = base64_decode(explode( ":::", $msg )[0]);

if( openssl_private_decrypt($encryptedKey, $decrypted, $key) )
{
    return $decrypted;
}
return $encryptedKey;

在客户端,我的代码与上面的相同。希望这有助于某人!