如何通过JSencrypt加密PHP中的数据



我正在尝试通过使用对称和非对称加密来确保JS前端和PHP后端之间的通信。我在客户端上创建对称密钥,并使用服务器的公共密钥对其进行加密,并将其发送到服务器以备将来使用。但是,当我将数据获取在服务器端时,我会卡住。OpenSSL_OPEN需要一个信封来解密对称键,而我什至没有积极的信封在信封中应该是什么数据。我的印象是,信封是使用公共密钥加密的对称键,但使用该密钥尚未起作用。我还尝试了解码的不同组合,因为我读到Jsencrypt在基础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代码所示,我已加密消息"测试"。

我以前从未实施过加密,所以我可能会在这里脱颖而出,但是在盯着这个代码几天后,任何见解都将不胜感激。

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

弄清楚了!!!因此,我发现PHP具有解密的函数,而无需一个名为OpenSSL_PRIVATE_DECRYPT的信封,该信封使用使用私钥解密消息。通过使用该功能和基础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;

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

最新更新