0

我无法使用 Tom Wu 的 jsbn 库在 JavaScript 中加密数据。

我最终得到了一个加密数据,但是当我尝试在 PHP 上解密数据时,openssl_private_decrypt 返回 false。

我编码公钥的方式有可能吗?

这是加密数据的 JavaScript 代码。

function encryptData(data)
{
    var $oDataEncrypted = "";

    // Do not forget to escape the lines:
    var $pem = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCoEu5N3x/6aK7E4A9f+7AV/A9T\nT6zu5zdM6L+6XViYC6JssiV1JVE/x/5yd4mVrG8CFkOaF9QqOIFFnQnQw+O+5B/3\nRdoIAssExytGyjY7k11u9jKZI+xRslCxQRoQnUzEVE29Vr6TWUwpxrnpsl+z/5ej\n+Yk8UsMJRkBvmSMdDwIDAQAB\n-----END PUBLIC KEY-----";

    // Create the RSA object.
    var $key = RSA.getPublicKey($pem);

    $oDataEncrypted = RSA.encrypt(data, $key);

    return $oDataEncrypted;
}

一种想法是“\n”,也许 JavaScript 与 PHP 不同,它不会自动理解结构,或者库不会。

我正在使用在以下位置获得的最新文件:

http://www-cs-students.stanford.edu/~tjw/jsbn/

https://github.com/ziyan/javascript-rsa/tree/master/src

为了进行测试,我将加密值(使用 Visual Studio 用于 JavaScript 端进行测试)复制并粘贴到我的 PHP 文件中。我将密钥传递给 openssl_private_decrypt() 并返回 FALSE。遗憾的是,openssl_private_decrypt 没有返回原因,JavaScript 代码似乎返回了一个值,并且没有抛出或返回错误。

我的猜测是与公钥有关,但显然问题可能出在其他地方。

4

1 回答 1

1

为了后代,我会给出答案。答案已经在我面前出现了一段时间,只是太密集而无法意识到。

JavaScript 以 base-64 编码数据,因此必须先对数据进行解码,然后 PHP 才能识别它。因此,在 PHP 端,需要做一个简单的添加:

if(!openssl_private_decrypt(base64_decode($dataArg1), $sensitiveData, $key))

我将 data 参数包装在 base64_decode() 中。

于 2013-03-29T21:11:25.627 回答