【问题标题】:Node.js correct way to make rsa encrypt?Node.js 使 rsa 加密的正确方法?
【发布时间】:2016-01-29 03:30:45
【问题描述】:

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

Ps 我用 openssl_public_encrypt 函数在 php 上做了同样的事情并且可以工作。但我必须在 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

?>

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

还要注意加密文本的长度(base64 格式)在 php 和 node.js 中是一样的。

【问题讨论】:

  • 除非您包含用于加密和解密的实际代码,否则任何人都不太可能在这里为您提供帮助,以便我们可以查看您拥有的内容并尝试确定您做错了什么。跨度>
  • @jfriend00 你是对的!我已经用加密部分的代码更新了帖子

标签: php node.js rsa encryption-asymmetric


【解决方案1】:

我猜填充是你的问题。在 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_encoded PHP decryption example

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

【讨论】:

  • 对不起,还要更改填充类型,根据您的解决方案,系统无法识别生成的加密文本。
  • 我看到我拥有的公钥是一个证书。我也尝试使用 openssl 从此证书创建公钥,但不工作
  • @AngelPoyel 我已经修复了代码,不幸的是常量未定义,因此填充仍然是错误的。我还为 node.js 加密和 php 解密添加了一些仅演示。
  • 我尝试了新的解决方案,现在它可以工作了。非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 2018-07-06
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
相关资源
最近更新 更多