簡體   English   中英

如何使用 nodejs 使用密碼短語加密私鑰和公鑰?

[英]How do I encrypt a private and public key with a pass phrase using nodejs?

我想得到一個生成公鑰和私鑰的 function,然后這些密鑰可以用明文加密。 在我的例子中,我設法用這些密鑰加密了明文,但這與我想要實現的相反。

這就是我的工作,但我想做相反的事情。 使用明文或密碼短語加密密鑰。

"use strict";

// Requires NodeJS >= 11.6.0

const crypto = require("crypto"); const util = require("util");

const generateKeyPair = util.promisify(crypto.generateKeyPair);

async function main() {
const exportOptions = {
    format: "pem",
    type: "pkcs1"
};

const { privateKey, publicKey } = await generateKeyPair("rsa", {
    modulusLength: 2048,
});

const plainText = "PRUEBA"; //Texto X a cifrar
const cipherText = crypto.publicEncrypt(publicKey, Buffer.from(plainText)); //Buffer is encrypted by the key

//console.log("Keys: ")
//console.log(publicKey.export(exportOptions)); // Public Key not encrypted
//console.log(privateKey.export(exportOptions)); // Private Key not encrypted

console.log("Plain text:", plainText); //Este es nuestro Pass Phrase
console.log("Cipher text:", cipherText.toString("hex")); 

const decrypted = crypto.privateDecrypt(privateKey, cipherText).toString(); 
console.log("Decrypted:", decrypted);
console.log("Success: ", decrypted === plainText);

}

main();

這是我試過的。

"use strict";

// Requires NodeJS >= 11.6.0

const crypto = require("crypto"); const util = require("util");

const generateKeyPair = util.promisify(crypto.generateKeyPair);

async function main() {
const exportOptions = {
    format: "pem",
    type: "pkcs1"
};

const { privateKey, publicKey } = await generateKeyPair("rsa", {
    modulusLength: 2048,
});

console.log(publicKey.export(exportOptions)); // Public Key not encrypted
console.log(privateKey.export(exportOptions)); // Private Key not encrypted

const plainText = "PRUEBA"; //Pass phrase 
var clavePublica = publicKey.export(exportOptions);

console.log("Prueba",clavePublica);
const cipherText = crypto.publicEncrypt(plainText, clavePublica); //Encrypt "clavePublica" with plainText
//const cipherText = crypto.publicEncrypt(Buffer.from(plainText),Buffer.from(publicKey) );
//console.log("Keys: ")
//console.log("Plain text:", plainText); //Este es nuestro Pass Phrase
//console.log("Cipher text:", cipherText.toString("hex")); //Texto X cifrado

//const plainText2 = "PRUEBA2";
//const decrypted = crypto.privateDecrypt(privateKey, cipherText).toString(); //Texto X descifrado
//console.log("Decrypted:", decrypted);
//console.log("Success: ", decrypted === plainText);
}

main();

這是結果:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAwCs5V1/qCqdLxgh/LBfhkLr4HF0Z7s9Bq2//fq4YEQ0lNgouYHfg
wEohDjTInJ/l7kOVkxoDknopJrc7Jac3in5y37o5yO7bThhg8/tpoZL/KT6FoDXt
0PH+o7qq2aSgYU/qJkfLl5DTViwHBDbE/A9byr9frV7+CWDA7i4nMe3692FA+xYv
nRbJ1OinEaDIts7YMJHfJJxHb0SNSrohof1Zqx5DOxs9T5JHHiC8XwSTfebilR+i
LVQPwevX9/ZLzU7FYbMSBiqYbaUp/VQ/4SBd2IE1naKTd/8mWgUPqn1DoOjC907T
h0zfkif+/RSR7lgtZ9t5IjlBoBOrOTI82QIDAQAB
-----END RSA PUBLIC KEY-----

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAwCs5V1/qCqdLxgh/LBfhkLr4HF0Z7s9Bq2//fq4YEQ0lNgou
YHfgwEohDjTInJ/l7kOVkxoDknopJrc7Jac3in5y37o5yO7bThhg8/tpoZL/KT6F
oDXt0PH+o7qq2aSgYU/qJkfLl5DTViwHBDbE/A9byr9frV7+CWDA7i4nMe3692FA
+xYvnRbJ1OinEaDIts7YMJHfJJxHb0SNSrohof1Zqx5DOxs9T5JHHiC8XwSTfebi
lR+iLVQPwevX9/ZLzU7FYbMSBiqYbaUp/VQ/4SBd2IE1naKTd/8mWgUPqn1DoOjC
907Th0zfkif+/RSR7lgtZ9t5IjlBoBOrOTI82QIDAQABAoIBABr0NR0coUQ7RkqR
mIeDwKoUlNvNnJHoKirfZl52EX7FcZRh2zLBaG8wNptlK0T6EeiDPEX0ySQmKa16
LTv7zLOKnEGQlQL/qxe0yFc7IAwqBSDbhHyonncclP3myd4F1E+x7i15C9pyKuJp
rIDvzwjCfWUzxeTDGoNljx9urnq3IFqR9AVGP5h821mAo+nZIkOqc8B0vuVaQviU
ZZ5W0uPKynO+GGI+41hR/i2wU03C1VSfAACOJKn8g+O0i9p+gU+rXcFT/t6e+r5G
6MjWeqLnAYKuBoZ7fS7k5/S+pXSExf7UJm9vj/fOoQr7HtKY4VJXcIoW4/nIRAGY
+NdBKV0CgYEA9gXMbCSVvg1hUtVNboIlpiiaeYToeKNNV/xUJoorqvztA7OGV+mw
R0MGUMMCrQXUNsSgY/GoWWpi2ITR0S76HnLaWJ5mPJSDFDtUbVHHBn5bgxw4g7o3
/7EHacRUCNnG2kIvHxvHyZ0U6oHqeHv/q1p0Lz9DRwtRFu6qXmbGSccCgYEAx/ZR
BT4vuw3AXiM50gPaQ9mqXWt+DD4oyDa3+SKqoZu+QdOYzo8MzgYV55FJ8P2BVgu6
WVU29J2qZgKUAmlgszEzTSc2NvIb2e/4Lw3hUzqHBHsl6ihaKi46/NL/tsDVA1A9
Td7VFGwg0ZXDjQwh1ZVdLXzWAC7xgu7DkOXcRF8CgYBFIQX60SDeYUYaj2MNjTZl
BP267ZSg6Un/UiCXH7X7esxigNxb8YcdzwCESveChKPHq+JhkvK6BUG3E0MdozSW
v7EIu6GAnj5ivfUQLq1c7r5qDdD3eqjniOfLWWY/gmn0xCoXdKfjx+arqkunBTim
/mitKfqOiOiFKBTpJ7nJ2wKBgH752tkJdCXDxbQBimXiLGeJgLVx3MjJb/wzQv/h
E5kr3NTQGOiRzf/FvYMer2VolQieyeaQRiVvORUt7e7aG52uUHVdwP+DHkx2JZM7
rSm8sKAX0yuuFBNU6ABDvD3AlYNVIJiiN4yQXQa5o0OdwJ5wCosoCnxzUslh9K2+
SPDhAoGAYBEqi55ZUspaSWUDlEBpwk9RAl8Lr6daLrsnSQNNCrVYnRPg06DOCInu
9X5mrZWkht+Ou8ILhgfpwdm23ObIv3KI5oZ4tX43g5aIuF8yiUQVo4WDPFo9n8dD
jlDOAYOhAGa6+MOfgSpyaU5eBIZl+tkD/F4w1yQ1LVU1yjGMfFo=
-----END RSA PRIVATE KEY-----

node:internal/crypto/cipher:79
    return method(data, format, type, passphrase, buffer, padding, oaepHash,
           ^

Error: error:1E08010C:DECODER routines::unsupported
    at Object.publicEncrypt (node:internal/crypto/cipher:79:12)
    at main (C:\Users\mmorena\Oracle Content - Accounts\Oracle Content\Escritorio\Comu BC\PubyPriv.js:28:31) {
  library: 'DECODER routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_UNSUPPORTED'
}

Node.js v18.12.0

您只需要在選項 object 中添加“密碼”鍵。

這是一些代碼(假設您已經導入了密鑰和節點加密):

const publicKey = ... // Public key
const privateKey = ... //Private key
const options = {
    type:"pkcs1",
    format:"pem",
    passphrase:"YOUR PASSPHRASE"
}
const exportedPublic = publicKey.export(options);
const exportedPrivate = privateKey.export(options);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM