繁体   English   中英

JavaScript RSA加密到PHP

[英]JavaScript RSA encryption to PHP

我需要通过远程网站上的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 $rsa->loadKey('...'); -不知道我做对了吗? 但是,在此示例中,我看不到输入strExponent (即10001)的位置。

因此,我尝试了另一种解决方案- 在PHP中使用RSA加密和解密文本,并修改了代码,使其外观如下:

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库中发生了一些变化,而我不确定如何重新修改我的代码。

RSA密钥的流行格式通常同时包含指数和模数。 例如,请参阅我对RSA加密的数学理解的答案:〜/ .ssh中的文件与理论有何关系? 有关一种特殊类型的密钥格式的详细讨论。

如果您将指数和模数作为不同的值,请尝试执行以下操作:

$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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM