2016-01-22 187 views
0

我正在尝试为make soap请求创建一个WS。在邮件正文中有一个包含加密文本的字段。 我有公钥加密文本,但我得到的唯一结果是文本无法识别。 我使用节点的加密模块进行请求和文本被加密,但我不知道为什么不正确加密。Node.js纠正rsa加密的方法?

Ps我做了与openssl_public_encrypt函数和工作的PHP相同的东西。但我必须在node.js中完成它。

任何想法或建议? crypto.publicEncrypt函数有哪些不同的openssl_public_encrypt?

这里是node.js中的加密部分:

var crypto = require("crypto"); 
var fs = require('fs'); 

fs.readFile("./certificate.pem", 'utf8', function (err, data) { 
    var bufferToEncrypt = new Buffer("textToEncrypt"); 
    var encrypted = crypto.publicEncrypt({"key":data, padding:crypto.RSA_NO_PADDING}, bufferToEncrypt).toString("base64"); 
    console.log(encrypted); // length 128 
} 

在PHP中同样的事情:

<?php 

    $publicKey = "./certificate.pem"; 
    $plaintext = "textToEncrypt"; 

    openssl_public_encrypt($plaintext, $encrypted, $publicKey); 

    echo base64_encode($encrypted); //encrypted string length 128 

?> 

我没有解密文本的私钥,我只有公钥。

另请注意,加密文本(在base64中)的长度在php和node.js中是相同的。

+0

除非您包含您用于加密和解密的实际代码,否则任何人都不可能在这里为您提供帮助,以便我们可以看到您拥有的内容并尝试确定您做错了什么。 – jfriend00

+0

@ jfriend00你是对的!我已经用加密部分的代码更新了帖子 – AngelPoyel

回答

2

我想填充是你的问题。在node.js中,您指定padding:crypto.RSA_NO_PADDING。当查找openssl_public_encrypt()的文档时,它说它默认使用OPENSSL_PKCS1_PADDING。请尝试以下操作:

var constants = require("constants"); 
var encrypted = crypto.publicEncrypt({"key":data, 
    padding:constants.RSA_PKCS1_PADDING}, bufferToEncrypt).toString("base64"); 

我准备了一个在线演示:

  1. Encrypt using node.js
  2. 复制生成的字符串
  3. 并粘贴到$encrypted_encodedPHP decryption example

建议:根据经验,不要对实际消息使用非对称加密。改用它来保护对称密钥。但是,您的用例可能是有效的,我只是想在每次有人谈论RSA加密时说明这一点。

+0

对不起,但也改变了填充类型,根据你的解决方案,生成的加密文本不被系统识别。 – AngelPoyel

+0

我看到我拥有的公钥是证书。另外我尝试使用openssl从这个证书创建一个公钥,但不工作 – AngelPoyel

+0

@AngelPoyel我修复了代码,不幸的是常量没有定义,因此填充仍然是错误的。我还为node.js加密和php解密添加了一些演示。 – Scolytus