phpseclib/jsbn : encrypt with public key in PHP, 在jsbn中用私钥解密

标签 php rsa phpseclib jsbn

我可以使用 jsbn 成功生成公钥/私钥对在客户端。使用这些 key 加密和解密客户端是可以的。我还可以将该公钥传输到服务器并通过 PHP 将其存储在 MySQL 中。

我无法使用 jsbn 公钥在 PHP 中加密某些内容,然后使用 jsbn 私钥在客户端对其进行解密。

// attempting to encrypt in PHP using the jsbn public key.
// (this public key came from jsbn client side)
$jsbn_public_key = '763989d1f75a779dae752ac236b011e85f9496bb414d72f5e89bf44274a942277fab2d4f5c58a57634d4000eecc8009d2efaeff17aa4a0efae2c4d41f3423be88be043628c6bac86f97deaadf23231793e6fa02550fb2ca65b2600e074205d23338e28ab3c5e92265e6bd7995c173085e3dc042e59ef464c5ed058c3ad863911';
$rsa = new Crypt_RSA();
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); // tried various options here.
$public_key = array(
    'n' => new Math_BigInteger($jsbn_public_key, 16),
    'e' => new Math_BigInteger('65537', 10), // same value as jsbn
);
$rsa->loadKey($public_key,CRYPT_RSA_PUBLIC_FORMAT_RAW);  // tried various options here.
$ciphertext = $rsa->encrypt($value);
$ciphertext_web_safe = bin2hex($ciphertext); // I think this is where the problem is!
// $ciphertext_web_safe looks something like this:
// 1b02bee0422028accba74f37e6e6974125fd16bdf83a72b8d6462e140ee6e85adae869fddc5e83635aaf90bc6074a3128890eeadf9537c33ebdfd665e16a3f1b617fa2fa5454f469e84f86d77ffcbc234dfc8a32291fbc84df61a0098c97fd90bb10204f68e783d9996678cd7853f3cbd932a4a067cb7f4f9eb62ca0542964f6
// which is exactly the same length as an encrypted string generated by jsbn

这是客户端加密:

var my_rsa = {
    ....
    e: "65537",
    public_key: '763989d1f75a779dae752ac236b011e85f9496bb414d72f5e89bf44274a942277fab2d4f5c58a57634d4000eecc8009d2efaeff17aa4a0efae2c4d41f3423be88be043628c6bac86f97deaadf23231793e6fa02550fb2ca65b2600e074205d23338e28ab3c5e92265e6bd7995c173085e3dc042e59ef464c5ed058c3ad863911',
    encrypt: function(value){
        var rsakey = new RSAKey();
        rsakey.setPublic(this.public_key, this.e);
        return rsakey.encrypt(value);
    },
    decrypt: function(ciphertext){
        var rsakey = new RSAKey();
        rsakey.setPrivateEx(this.public_key, this.e, this.private_key.d, this.private_key.p, this.private_key.q, this.private_key.dmp1, this.private_key.dmq1, this.private_key.coeff);
        return rsakey.decrypt(ciphertext);
    },
    ....
};

当我尝试在 JavaScript 中解密“$ciphertext_web_safe”值时,我只是得到一个空字符串。控制台日志等中没有错误。

PHP中使用的“bin2hex”有问题吗?在将加密的二进制数据转换为十六进制之前,是否应该应用某种填充等?

干杯, 戴夫

最佳答案

我的问题是 javascript 中的“e”。

我将“65537”更改为“010001”,现在我可以使用公钥和 PHP 加密服务器端。呸!

关于phpseclib/jsbn : encrypt with public key in PHP, 在jsbn中用私钥解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11293589/

相关文章:

php - 在 C 和 PHP 中进行数字签名的正确算法是什么?

php - 如何从 HTML 表单运行 PHP 函数?

php - 将 UNIX 时间戳转换为格式化的日期字符串

python - 如何使用RSA?

java.security.spec.InvalidKeySpecException : java. security.InvalidKeyException: key 格式无效

python - NotImplementedError : Use module Crypto. Cipher.PKCS1_OAEP 而不是错误

java - php中的RSA加密到JAva中的RSA解密

php - 使用phpseclib的Crypt_RSA加密银行验证码

php - 支持多重php签名

php - Laravel whereHas to realted model,whereHas to that related modal not working