Javascript到PHP-使用模和指数进行RSA加密

Javascript到PHP-使用模和指数进行RSA加密,javascript,php,encryption,rsa,phpseclib,Javascript,Php,Encryption,Rsa,Phpseclib,我有javascript代码 它工作得很好。给我的结果是result=1E2738D762382F8412B87E9DD9A18AAA52EA28F6B204BB0F1E0F710A973AA417E5333D39127FD1D89C553AE53DD83738E4EB6544CB77FD08438AFD33594C42FF7E5186BD23908B642188B82B7552140AF82F7D5D768770CD9305573640739BE4BBC2190C5A192685AB88C5A

我有javascript代码

它工作得很好。给我的结果是
result=1E2738D762382F8412B87E9DD9A18AAA52EA28F6B204BB0F1E0F710A973AA417E5333D39127FD1D89C553AE53DD83738E4EB6544CB77FD08438AFD33594C42FF7E5186BD23908B642188B82B7552140AF82F7D5D768770CD9305573640739BE4BBC2190C5A192685AB88C5A6800052FF37948E24803EA2

我将代码转换为PHP,我使用phpseclib

$fm_modulus = 'd3bcef1f00424f3261c89323fa8cdfa12bbac400d9fe8bb627e8d27a44bd5d59dce559135d678a8143beb5b8d7056c4e1f89c4e1f152470625b7b41944a97f02da6f605a49a93ec6eb9cbaf2e7ac2b26a354ce69eb265953d2c29e395d6d8c1cdb688978551aa0f7521f290035fad381178da0bea8f9e6adce39020f513133fb';

$fm_exponent = '10001';

$rsa = new Crypt_RSA();
$modulus = new Math_BigInteger(base64_decode($fm_modulus), 256);
$exponent = new Math_BigInteger(base64_decode($fm_exponent), 256);

$rsa->loadKey(array('n' => $modulus, 'e' => $exponent));
$pass_ok = $rsa->encrypt($pass);

PHP为我返回符号,我不知道如何将其转换为纯文本(与javascript中的结果相同)。我尝试base64,hash sha256 sha512。全部为false,请帮助我

$fm\u模数
$fm\u指数
不是base64编码,也不是base-256。它们是十六进制编码的,就这样。所以试试这个:

$rsa = new Crypt_RSA();
$modulus = new Math_BigInteger($fm_modulus, 16);
$exponent = new Math_BigInteger($fm_exponent, 16);
我能够通过
$fm\u指数
是10001这一事实来认识到这一点。10001是的十六进制编码,这是一个非常常见的RSA指数

我还怀疑phpseclib使用的填充模式可能不正确。您可能需要执行
$rsa->setEncryptionMode(CRYPT\u rsa\u ENCRYPTION\u NONE)
$rsa->setEncryptionMode(CRYPT\u rsa\u ENCRYPTION\u PKCS1)


这实际上有点难以确定,因为您没有发布私钥,因此无法解密结果。您也没有发布您试图加密的内容的明文。正如Maarten Bodewes所说,使用良好的填充模式,每次尝试加密相同的明文时,密文都会有所不同,但您的JS库可能没有使用良好的填充模式。默认情况下,phpseclib使用OAEP,OAEP具有随机输出,但“教科书式RSA”不使用随机填充(实际上也不使用任何填充)。

加密返回字节数组。JS显示的是字节数组的十六进制表示。显然,PHP直接将其转换为字符串。所以你应该使用一些常用的东西——Base64应该很好,尝试将JS数组转换为Base64来查看结果(使用安全密码加密的结果应该总是不同的:结果是随机的。您应该通过使用一个运行时加密和使用另一个运行时解密进行检查。即使在同一平台上,您也可以尝试在加密后创建相同的字节数组,直到世界末日为止。
$rsa = new Crypt_RSA();
$modulus = new Math_BigInteger($fm_modulus, 16);
$exponent = new Math_BigInteger($fm_exponent, 16);