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

Node.js correct way to make rsa encrypt?

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

Ps 我在 php 上用 openssl_public_encrypt 功能和工作做了同样的事情。但我必须在 node.js.

完成

有什么想法或建议吗? openssl_public_encrypt 与 crypto.publicEncrypt 函数有何不同?

这里是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

?>

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

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

我想填充是你的问题。在 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 加密时说明这一点。