我正在尝试为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中是相同的。
答案 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");
我准备了一个在线演示:
$encrypted_encoded
醇>
建议:根据经验,不要对实际消息使用非对称加密。使用它来保护对称密钥。但是,您的用例可能有效,我只想在每次有人使用RSA加密时说明这一点。