【问题标题】:How to decrypt data in PHP encrypted with JSEncrypt如何解密使用 JSEncrypt 加密的 PHP 中的数据
【发布时间】:2018-08-04 10:45:18
【问题描述】:

我正在尝试通过使用对称和非对称加密来保护 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)。当我对 $encryptedKey 变量进行 base 64 解码时,我得到:

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

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

我以前从未实施过加密,所以我在这里可能有点离题,但是在盯着这段代码几天之后,任何见解都会受到赞赏。

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

【问题讨论】:

  • 有什么问题?我在问题中找不到任何详细说明。 "...这些尝试也没有结果" 之类的语句对于故障排除毫无用处。请显示安全参数、预期输出和实际输出。
  • 您这样做是否有原因,而不仅仅是使用 SSL?
  • 问题是它不起作用......我没有正确加密或者我没有正确解密,因为我没有得到“测试”或任何可读的东西当我解密时PHP(我将为我尝试过的各种场景添加确切的输出)并且我正在为一个不太有用的教授的课堂项目尝试这个,所以这就是我不使用 SSL 的原因

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


【解决方案1】:

想通了!!!所以,我发现 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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 2012-06-10
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2012-10-14
    • 2019-04-13
    相关资源
    最近更新 更多