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

Ang*_*yel 2 php rsa encryption-asymmetric node.js

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

附言:我用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
}
Run Code Online (Sandbox Code Playgroud)

在PHP中的同样的事情:

<?php

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

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

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

?>
Run Code Online (Sandbox Code Playgroud)

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

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

Sco*_*tus 7

我想填充是您的问题。在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");
Run Code Online (Sandbox Code Playgroud)

我已经准备了一个在线演示:

  1. 使用node.js加密
  2. 复制结果字符串
  3. 并粘贴到$encrypted_encodedPHP解密例子

建议:根据经验,请勿对实际消息使用非对称加密。而是使用它来保护对称密钥。但是,您的用例可能是有效的,我只想在每次有人谈论RSA加密时都声​​明一下。