Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中解密npm rsa创建的数据?_Php_Node.js_Encryption_Cryptography_Phpseclib - Fatal编程技术网

如何在PHP中解密npm rsa创建的数据?

如何在PHP中解密npm rsa创建的数据?,php,node.js,encryption,cryptography,phpseclib,Php,Node.js,Encryption,Cryptography,Phpseclib,我用JS在浏览器中加密数据,然后用PHP在后端解密 在JS中,我使用的是使用browserify构建的npm rsa。 在PHP中,我使用的是phpseclib 我的JS: key = new rsa({ environment: 'browser', encryptionScheme: 'pkcs1_oaep', signingScheme: 'pkcs1-sha256', b: 2048

我用JS在浏览器中加密数据,然后用PHP在后端解密

在JS中,我使用的是使用browserify构建的npm rsa。 在PHP中,我使用的是phpseclib

我的JS:

key = new rsa({
            environment: 'browser',
            encryptionScheme: 'pkcs1_oaep',
            signingScheme: 'pkcs1-sha256',
            b: 2048
        });

cleartext = 'this is a test';
console.log(key.encrypt(cleartext, 'base64'));
console.log(this.key.exportKey('pkcs8-private-pem'));
然后,我将公钥和密码文本带到PHP:

$rsa = new RSA();
$rsa->load($privkey, 'pkcs8');
$cleartext = $rsa->decrypt(base64_decode($cyphertext));
运行此命令时,
$cleartext
null
。使用Xdebug,我可以看到
$rsa->load($pubkey,'pkcs8')
似乎正在填充
$rsa
的模、指数、素数、系数等字段

我甚至试过
$rsa->setHash('sha256')decrypt()
之前使用code>,但据我所知,哈希方法仅用于加密,甚至不用于解密

另外,我知道这是不安全的,因为我正在共享私钥。我只是想验证这两个库之间的兼容性

我已经测试过,我可以分别使用这两个库进行加密和解密,但是从JS库到PHP库获取密钥时,我无法开始工作

编辑: 导出的私钥:

-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDX7/224Phogd/B
4DGOf81GeNAkE0bAWieN9Tmq6S1Xe0iMY56J9hJ86HveCcJcJCMNAJtGVPjOObNf
HZ58CUrqyMoj6VJ8wXGVPZuwkvBQrVFg4k/h+8+b3p5Z0cb8J9m8WWpnL/hifoyt
9O7aEiSnkvHBWBgEK6qxEYVLJKUPI94HlZe4B+ScCaflUMw1/uMfp1pVGxVUAfER
f8URfCjCUY8cL+yFNQ5/CVNMQ8CTlb6HItpfS/QVBqTUD3wNf97oFZDPzbFfFCD7
M50NbCal6CfRTaMBPoWrhsUGVab/Nj81qcY7dpoYEFyLLnJ80jHR6+o1fKDSinuQ
KIYkQ9PxAgMBAAECggEBANKs7tgx/anYrDo3RaJFxjzvOgM4W1rnmpfBnRXGkdo8
CbgOqWrojXkYSWGEHABRsXDKGrQvyt9JJFu0Rh+14UXXyH/o7/WPtgVpKjDH63aK
4k6n/k/4ocDtHYl8RatWJfTBODKcdrWByjceNLrF4MUtdHiyPhwzjkFbWrTJd9Cf
3wEh0aD83JT/wg1VkRYEOdJTPeq2kCpgoukBFXYAnGj9DYL2+Kityhnx/GB0RG/8
GGpMyG8R72P6zYkXr0YfLhGLlW7+XbLT+WiPThjT9+e00uPAKMj7d0qaerKR6Asf
NGSAg83eWG9ZKT1GXtn8mOP6p+15DcVLBbFXvPAA/cECgYEA7IYRWGNhEJ9l+XJH
DYQVndS9KN8+zMx5OM/wy47v9FiiwGdAnwwHFAX3GyZe6eJ2sAX73tPm56QadRPK
HGZFNnYx3BBdcl7WKT13DrmgpsH9CO6ish+2TwHfYDqOKs5EvT3yHJIG4T/Z50JM
bUKSdrndV6LtOT2gplLxjUwastUCgYEA6bf23y5p8t9Unn55bIYKdFWj/5kLJdI1
d/MBP3eZ405veVzZqvhs04JscElx1M0U1mTx7g96IWnBTuqsgkU9TLlXg8N5nLM0
AWVlFlu657NwJaAc9zfmaamI4UKwNHCXDoxx+u2zJuzNOJwttPV3d7NTBWZOh+P+
DEgAzNYOEq0CgYEA42Oo/U7dnHuCMCTbhnT7yzchfE/UMlRKHoJbP3f13PXx0gPy
LnYDwA5UGLf0++oKrQOzt/AEx6IPBYu2/UKdO9S57pWVIUVno1JCSdfQSUGqoJG7
vH+cZ6ynMf5Ze3G+yCjrwOfq0VbviNNGYqxj3tylnYE3i5ZiAkUvkOYfrNkCgYBa
rZBvyN88Zt+62pEbxOm7dxq46VUE6IjsL/EVAb9IDL99U8Pz7Iy0h06xRh2PFb52
7BVdas3UtuZUSwKBTIHbCbHlomrFnFWaEQ/mW9KpYNorDvMOC7cu2aMM2sXooqJI
976lP6IZgRiiVR36rp4aaA3W83mWiaOgejMtRgORxQKBgQDTMG0Wl3FbPZ57uqmi
rE2Gwr1TiZ7LcYSEt4Z7KQV/u0Q7b9hyNXctaK2DzcEz+wA1eiAzioC9ZULOVVvW
xZzVvj2D741A6EXMITa3E/Wv1XkbotNg8RXG8lvNY/IJ+35TZGBNzJ4gD+n0lOCK
IrdIMYPrt9dcGIqqRE4wwaeLmA==
-----END PRIVATE KEY-----
密码文本:

mbPLBF3YNmyb5AD1vk6D8K0C9AiRU3C2a2aCKXpzDXb1uUCy7KYUFB3bOoU4ZhU7RXcWr9VHZq3APxtdyqKyEqr48NqVEPeBuYsDjcgDfPBFdPXf36f1FveeCJ7cFtHIvGy9/2EHIyNyXKy/6VaoakGRwBB3V14shXdqCDIW2FfEdUcfka5X8sAroq9pKrTGbN21hwtbiAjP2MmTHDYWu1zhDmrKxdcBbP6wdBgnZodCwGhBw11uXoEAnL1/yYFFqGZeKAhzxfjdPY2irvAuQOPN3U7UDBF0zhyMNF07JbCccCsNIguX4esferShw8w1mVzAxgwHzbjDpudko1/VSg==
cat cypher.text | base64 --decode > -in cypher.bin
我将它们保存到两个文件中,privatekey.pem和cypher.text。然后我对密码进行了base64解码:

mbPLBF3YNmyb5AD1vk6D8K0C9AiRU3C2a2aCKXpzDXb1uUCy7KYUFB3bOoU4ZhU7RXcWr9VHZq3APxtdyqKyEqr48NqVEPeBuYsDjcgDfPBFdPXf36f1FveeCJ7cFtHIvGy9/2EHIyNyXKy/6VaoakGRwBB3V14shXdqCDIW2FfEdUcfka5X8sAroq9pKrTGbN21hwtbiAjP2MmTHDYWu1zhDmrKxdcBbP6wdBgnZodCwGhBw11uXoEAnL1/yYFFqGZeKAhzxfjdPY2irvAuQOPN3U7UDBF0zhyMNF07JbCccCsNIguX4esferShw8w1mVzAxgwHzbjDpudko1/VSg==
cat cypher.text | base64 --decode > -in cypher.bin
并使用openssl对其进行解密:

openssl rsautl -decrypt -inkey privatekey.pem -in cypher.bin -oaep

这给了我清晰的文本!因此,phpseclib似乎在解码方面存在问题。

结果表明,必须在解密方法中使用以下两种方法设置哈希:

$rsa->setMGFHash('sha1');
$rsa->setHash('sha1');

虽然我用
setHash()
尝试过,但如果没有
setMGFHash()

您知道RSA和base64的工作顺序吗?如果您的javascript首先使用base64编码,然后进行加密,那么您的PHP将以另一种方式进行编码,解码/解密将返回
null
,因为它无法使用提供的格式。我相信JS版本会加密,然后base64编码。结果输出肯定是base64。然后在PHP中,该函数通常接受一个字节字符串输入,因此我在将其放入decrypt方法之前手动对其进行base64解码。我在这两个库中都尝试过验证这些是他们输入和输出的格式。好的(你可能想在你的问题中编辑这个),你是否验证过密码文本的发送是否正常,就像在。。。
$cyphertext
是否已设置?(不好意思问)。此外,请验证编码前的密码是否等于解码后的密码。我已投票结束此问题,因为描述与源代码不匹配<代码>$rsa->load($pubkey,'pkcs8')在代码中找不到,如果没有所需的部分,就不可能找到错误。@Glubus是的,事实上我现在甚至没有发送它。我将其转储到控制台,并在测试php脚本中将其显式分配给变量。如果有帮助的话,我可以将示例数据放在这里,包括npm rsa创建的cyphertext,它可以由npm rsa解密,但不能由phpseclib解密。我不认为这会有用,因为它只是大量base64编码的二进制数据