【问题标题】:JavaScript RSA encryption to PHPJavaScript RSA 加密到 PHP
【发布时间】:2017-06-20 20:22:28
【问题描述】:

我需要通过远程网站上的 PHP 脚本进行身份验证,并且网站使用基于 JS 的 RSA 加密密码。这是来自网站的代码:

function rsa_encrypt(strPlainText) {
    var strModulus = "some_random_string";
    var strExponent = "10001";
    var rsa = new RSAKey();
    rsa.setPublic(strModulus, strExponent);
    var res = rsa.encrypt(strPlainText);
    if (res) {
        return res;
    }
    return false;
}

在这个网站上浏览了很多主题,发现推荐的方式是使用phpseclib(如果还有其他的,请告诉我)。但是,使用http://phpseclib.sourceforge.net/rsa/examples.html#encrypt,enc2 的基本示例,我得到的只是一个空页面。我在$rsa->loadKey('...'); 中输入了some_random_string - 不确定我做对了吗?但是,在此示例中,我看不到输入 strExponent(即 10001)的地方。

所以我尝试了另一种解决方案 - Encrypt and Decrypt text with RSA in PHP 并将我的代码修改为如下所示:

include('Crypt/RSA.php');

$privatekey = "some_random_string";

$rsa = new Crypt_RSA();
$rsa->loadKey($privatekey);

$plaintext = new Math_BigInteger('10001');
echo $rsa->_exponentiate($plaintext)->toBytes();

但是,我收到此错误:

Fatal error: Call to a member function abs() on null in Math\BigInteger.php on line 1675

解决方案是前段时间发布的,所以我猜在这段时间里 phpseclib 库中发生了一些变化,我只是不确定如何重新修改我的代码。

【问题讨论】:

    标签: javascript php encryption rsa phpseclib


    【解决方案1】:

    RSA 密钥的流行格式通常包含指数和模数。例如,请参阅我对I understand the mathematics of RSA encryption: How are the files in ~/.ssh related to the theory? 的回答,以更详细地讨论一种特定类型的密钥格式。

    如果您将指数和模数作为不同的值,请尝试这样做:

    $rsa->loadKey([
        'e' => new Math_BigInteger('10001', 16),
        'n' => new Math_BigInteger('some_random_string', 16);
    ]);
    

    注意, 16 位。 65537(十六进制的 10001)是一个常见的 RSA 指数。 Math_BigInteger 默认情况下假定传递给它的数字是以 10 为基数的,除非您另有明确说明。 RSA 的一个要求是 e 与 phi(n) 或 lcm(n) 互质。 65537 是微不足道的互质数,因为它质数。 10001 不是素数。可以分解为 73*137。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 2015-03-16
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2017-11-03
      相关资源
      最近更新 更多