node.js - 使用 Nodejs Crypto 模块的非对称加密
问题描述
我想使用nodejs10的crypto模块,做一个非对称加密。
我在这里找到了答案 但是当我尝试运行下面的代码时,我收到了这个错误:
return method(toBuf(key), buffer, padding, passphrase);
^
Error: error:0608B096:digital envelope routines:EVP_PKEY_encrypt_init:operation not supported for this keytype.
编码:
var crypto = require("crypto");
var path = require("path");
var fs = require("fs");
const passphrase = "mySecret"
var encryptStringWithRsaPublicKey = function(toEncrypt, relativeOrAbsolutePathToPublicKey) {
var absolutePath = path.resolve(relativeOrAbsolutePathToPublicKey);
var publicKey = fs.readFileSync(absolutePath, "utf8");
var buffer = new Buffer(toEncrypt);
var encrypted = crypto.publicEncrypt(publicKey, buffer);
return encrypted.toString("base64");
};
var decryptStringWithRsaPrivateKey = function(toDecrypt, relativeOrAbsolutePathtoPrivateKey) {
var absolutePath = path.resolve(relativeOrAbsolutePathtoPrivateKey);
var privateKey = fs.readFileSync(absolutePath, "utf8");
var buffer = new Buffer(toDecrypt, "base64");
//var decrypted = crypto.privateDecrypt(privateKey, buffer);
const decrypted = crypto.privateDecrypt(
{
key: privateKey.toString(),
passphrase: passphrase,
},
buffer,
)
return decrypted.toString("utf8");
};
const { writeFileSync } = require('fs')
const { generateKeyPairSync } = require('crypto')
function generateKeys() {
const { privateKey, publicKey } = generateKeyPairSync('ec', {
namedCurve: 'secp256k1',
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: passphrase,
},
})
writeFileSync('private.pem', privateKey)
writeFileSync('public.pem', publicKey)
}
generateKeys();
let a = encryptStringWithRsaPublicKey("hello", "public.pem")
let b = decryptStringWithRsaPrivateKey(a, "private.pem");
console.log(b)
我没有发现问题是什么,似乎是密码短语的问题。
解决方案
更新私钥生成的一些参数将使这项工作:
var crypto = require("crypto");
var path = require("path");
var fs = require("fs");
const passphrase = "mySecret"
var encryptStringWithRsaPublicKey = function(toEncrypt, relativeOrAbsolutePathToPublicKey) {
var absolutePath = path.resolve(relativeOrAbsolutePathToPublicKey);
var publicKey = fs.readFileSync(absolutePath, "utf8");
var buffer = Buffer.from(toEncrypt);
var encrypted = crypto.publicEncrypt(publicKey, buffer);
return encrypted.toString("base64");
};
var decryptStringWithRsaPrivateKey = function(toDecrypt, relativeOrAbsolutePathtoPrivateKey) {
var absolutePath = path.resolve(relativeOrAbsolutePathtoPrivateKey);
var privateKey = fs.readFileSync(absolutePath, "utf8");
var buffer = Buffer.from(toDecrypt, "base64");
const decrypted = crypto.privateDecrypt(
{
key: privateKey.toString(),
passphrase: passphrase,
},
buffer,
)
return decrypted.toString("utf8");
};
const { writeFileSync } = require('fs')
const { generateKeyPairSync } = require('crypto')
function generateKeys() {
const { publicKey, privateKey } = generateKeyPairSync('rsa',
{
modulusLength: 4096,
namedCurve: 'secp256k1',
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: passphrase
}
});
writeFileSync('private.pem', privateKey)
writeFileSync('public.pem', publicKey)
}
generateKeys();
let a = encryptStringWithRsaPublicKey("hello", "public.pem")
let b = decryptStringWithRsaPrivateKey(a, "private.pem");
console.log(b)
推荐阅读
- regex - 正则表达式(重复组)似乎不起作用
- css - CSS 使用 z-index 将子级设为最顶层
- mysql - Mysql DB - 更改服务器时区时需要在数据库中完成的操作
- acumatica - 访问登录的用户角色并包含在页面源中
- android - jcenter.bitrary 库支持-v4/26.1.0 无法访问 || 安卓构建 || 离子构建 || 错误
- python - 具有多个值的张量的布尔值在 Pytorch 中不明确
- sqlite - 从 sqlite3 提取数据时定义时间的问题
- axios - 带有 Axios 和 Loopback 的“where”过滤器中的变量
- flutter - flutterBlue.connect(device, timeout: const Duration(seconds: 10),).listen(null); 飘飘然
- image - 如何将 []byte 对象转换为图像并将其作为 jpeg 图像存储在磁盘上