node.js - node-rsa 和 openssl 兼容性

标签 node.js encryption openssl node-rsa

我有一组公钥/私钥,在仅使用两种加密和解密方法中的一种来加密/解密某些数据时,它可以完美地工作。

我仍然没有运气尝试用两者之一加密数据并用另一个解密。

示例场景:

a) 我使用带有以下 node.js 代码的公钥创建一些加密数据:

#!/usr/bin/env node

var NodeRSA = require('node-rsa');
var fs = require('fs');

function createUsingPubKey(Pub, data) {
    var pk = new NodeRSA();
    pk.importKey(Pub);
    encrypted = pk.encrypt(data, 'base64');
    return encrypted;
}

var sampledata = "SECRET STUFF";

var genkey = createUsingPubKey(fs.readFileSync('id_rsa.pub'), sampledata)
console.log(genkey);

b) 然后我尝试使用 openssl 实用程序解密它:

node test.js | openssl base64 -d -A | openssl rsautl -inkey id_rsa

但是我得到:

RSA operation error
1068:error:0406706C:rsa routines:RSA_EAY_PUBLIC_DECRYPT:data greater than mod len:.\crypto\rsa\rsa_eay.c:680:

我认为他们可能会在加密/解密过程中使用不同的算法,所以我前往此处查看 node-rsa 文档: https://www.npmjs.com/package/node-rsa我找到了这个选项:

encryptionScheme — padding scheme for encrypt/decrypt. Can be 'pkcs1_oaep' or 'pkcs1'. Default 'pkcs1_oaep'.

然后我尝试解密传递 openssl util 中的 -oaep 选项,如下所示:

node test.js | openssl base64 -d -A | openssl rsautl -oaep -inkey id_rsa

但我仍然得到:

RSA operation error
5216:error:0406706C:rsa routines:RSA_EAY_PUBLIC_DECRYPT:data greater than mod len:.\crypto\rsa\rsa_eay.c:680:

我的密码学知识非常基础。任何帮助将不胜感激:)

编辑 1: node.js 模块可以在这里找到: https://github.com/rzcoder/node-rsa

编辑 2: 正如 Maarten Bodewes 所要求的,这里有一些示例数据:

待加密的明文数据:

You're no good, you're no good, you're no good Baby, you're no good (I'm gonna say it again) You're no good, you're no good, you're no good Baby, you're no good

生成的私钥

openssl genrsa -out key 512

-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBALOUBygyX11BsDoEIKoZzn2/HAXPorNR/X8wCDaBlcPtOHxKAZFk
Vra1+Pem1urtSlnEqc07DwAP6v0GEGHpxbkCAwEAAQJAGAZ17qrOl2tyaFClDhzl
w20OErj0y4jsoVeLwb8UimG48JslS14hfM9XxE/fG6qypN8u7LUhlnBC68ZcQ9Jg
AQIhAORaVlB7trWp6n7dETvdY9J2p8ubOuyLTX0BA2jF8agxAiEAyVHzDWQPWx/s
gt+ABErqN+ZUWS016DD34QUVGyp9nAkCIQC39JpSDcd7gx1YA8jNXCT9N/8mg6+t
PO84g2d2sPdjEQIgXwWMF/TzfopJ4tfFH8GQXYQcqd66A/cg+Jeih6j9kqkCIGD4
hBAO0haqnqeSO65Mm1IjY/6Z77pKxzJAGys5XeXk
-----END RSA PRIVATE KEY-----

及其等效的公钥

openssl rsa -in key -pubout > key.pub

-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALOUBygyX11BsDoEIKoZzn2/HAXPorNR
/X8wCDaBlcPtOHxKAZFkVra1+Pem1urtSlnEqc07DwAP6v0GEGHpxbkCAwEAAQ==
-----END PUBLIC KEY-----

上述明文数据使用 node.js rsa 库使用给定的公钥加密:

nbp1tBlcev9PvD3xDmEQkcBd8ewNxW8Xm7oZWVcsFika3dU/H3VFoxdeH75DPy4/xLvN1Gxqfb/bXTnfKZLZBYV1q4XfmR4p3ji41MAybpMiEl5h4fSFYacg5SiQ/KxxmQr0SLs4rttwcbaGBLG6rcIU+6SSYBYu1GhC+XBlBG94zbqFV9ZvohEbnlnqDDW1Kg9hGT9/vBBtiLEQnTiKDwztIgY3DhqadsVW0g37PFFwuQKXtHw/lQqrRhc+Pb03g+Oq8nIpX8eaurL8lo3lZNkhlY4NfFCYwP7v12MYwSrMeWPMe20LDDQ6NXbJnrsLGl5x08aYn7liS5qsYdtqRpYv+JbJc3EoXIZEyHv17gU1R0OmLsSd/Teln9VAvM+jt4jwQjlvE1WF8g9Qc/WNo28RR4KaNOvUpLDwfuc3gTgkG90ac8EchmKB3LAgU47kQComyphuPAI/G4phqeXOeYnbBrB1aqwxAkAwOIvanGjCY6FXlV8Cve1jao0ejQ0EFE1180yjhltgh5U2EErQLDd5S4y5YLbLz4xIiKo3k06Yktk4dSJsBalHPxi7Z+kofjT3KdeHyGMynodGzOmH5CaAAS2enZpp2VytcawlDu84EvrPYIRPWah9cA6dtxARx6us8EytrNIDv7UVGXw/cQEPR1nZamz6HROqT4Fpwfc=

最佳答案

只需为 openssl 添加 -decrypt 参数

node test.js | openssl base64 -d -A | openssl rsautl -decrypt -oaep -inkey id_rsa

对我来说非常好。

关于node.js - node-rsa 和 openssl 兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29098963/

相关文章:

angularjs - 客户端主机名被附加到客户端请求中

javascript - Express 中间件在使用 postman 时不触发,但在与浏览器连接时有效

linux - openssl 不起作用,但在浏览器中它可以

bash - 使用 openssl 从 pkcs12 证书中提取信息

node.js - Sequelize : how to implement a search based on associated keywords?

java - 用于 Comet 应用程序的 Node.js 与 Java

ruby - 如何在 Ruby 中以十六进制执行三重 DES 计算?

java - 如何解密在.net中加密的java文件

python - 使 Vigenére 加密/解密跳过空格

ssl - 这些PEM文件(包括链)如何转换为KEY和CRT文件?