我在javascript https://notepad.pw/codeherejs
中有代码var c = 'd3bcef1f00424f3261c89323fa8cdfa12bbac400d9fe8bb627e8d27a44bd5d59dce559135d678a8143beb5b8d7056c4e1f89c4e1f152470625b7b41944a97f02da6f605a49a93ec6eb9cbaf2e7ac2b26a354ce69eb265953d2c29e395d6d8c1cdb688978551aa0f7521f290035fad381178da0bea8f9e6adce39020f513133fb';
var f = '10001';
var g = new RSAKey;
g.setPublic(c, f);
var result = g.encrypt(password)
工作正常。给我的结果是result = 1e2738d762382f82f8412b87e9dd9a18aaa52ea28f6b204bb0f1e0f710a973aaa417e533d39127fd1d8959c553ae53dd83738e4eb6544cb77fd08438afd33594c42ff7e5186bd23908b642188b82b7552140af82f7bd5d768770cd9305573640739be4a70bbc2bd190c5a192685ab88c5a612680005eff2f37944c8e24803ea2
我将代码转换为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。全是假的,请帮帮我
答案 0 :(得分:0)
$fm_modulus
和$fm_exponent
不是base64编码的,也不是base-256。它们是十六进制编码的,就是这样。所以试试这个:
$rsa = new Crypt_RSA();
$modulus = new Math_BigInteger($fm_modulus, 16);
$exponent = new Math_BigInteger($fm_exponent, 16);
我能够通过$fm_exponent
为10001这一事实来认识到这一点.10001是65537的十六进制编码,这是一个非常常见的RSA指数。
我还怀疑phpseclib使用的填充模式可能不正确。您可能需要执行$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_NONE);
或$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
。
实际上有点难以确定,因为您没有发布私钥,因此无法解密结果。您还没有发布您尝试加密的明文。正如Maarten Bodewes所说,使用良好的填充模式,每次尝试加密相同的明文时,密文都会有所不同,但是你的JS库可能没有使用好的填充模式。默认情况下,phpseclib使用OAEP,它具有随机输出,但“教科书RSA”不使用随机填充(或任何填充,实际上)。