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");
我准备了在线演示:
- Encrypt using node.js
- 复制结果字符串
- 并将其粘贴到 PHP decryption example
上的 $encrypted_encoded
建议:根据经验,不要对实际消息使用非对称加密。而是用它来保护对称密钥。但是,您的用例可能是有效的,我只想在每次有人谈论 RSA 加密时说明这一点。
我正在尝试为 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");
我准备了在线演示:
- Encrypt using node.js
- 复制结果字符串
- 并将其粘贴到 PHP decryption example 上的
$encrypted_encoded
建议:根据经验,不要对实际消息使用非对称加密。而是用它来保护对称密钥。但是,您的用例可能是有效的,我只想在每次有人谈论 RSA 加密时说明这一点。