Node.js正确的方法使rsa加密?

时间:2016-01-22 18:40:00

标签: php node.js rsa encryption-asymmetric

我正在尝试为make soap请求创建一个WS。在消息正文中,有一个包含加密文本的字段。 我有公钥来加密文本,但我获得的唯一结果是文本无法识别。 我使用节点的加密模块发出请求,文本被加密但我不知道为什么不加密。

Ps我在php上使用openssl_public_encrypt函数和工作做了同样的事情。但我必须在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中是相同的。

1 个答案:

答案 0 :(得分:4)

我想填充是你的问题。在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. 并将其粘贴到PHP decryption example
  4. 上的$encrypted_encoded

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