gpt4 book ai didi

node.js - crypto.privateDecrypt 适用于 Windows 但不适用于 ubuntu

转载 作者:可可西里 更新时间:2023-11-01 10:41:06 26 4
gpt4 key购买 nike

我有一个代码可以读取私钥(PEM 格式)和我想要解密的加密文本。当我在 Windows 中运行代码时,一切正常,它通过

解密文本
let buffer = Buffer.from(encryptedData,'base64');
crypto.privateDecrypt(privatekey, buffer);

然而,当我在 Ubuntu 中运行相同的代码时,我收到以下错误:

"'Passphrase required for encrypted key.TypeError: Passphrase ' +
'required for encrypted key at Object.privateDecrypt ' +
'(internal/crypto/cipher.js:53:12) at e1c2 ' +...

我在 Windows 和 Ubuntu 系统中都使用了 console.log(encryptedData,privatekey,buffer),它们是相同的。同样在私钥中,我没有使用密码。任何人都知道为什么在 Ubuntu 中我会收到这样的错误,而在 Windows 中它工作正常?它可能与实际上是 .pam 格式的私钥格式有关,并且由于空格 linux 无法处理它?

编辑:

我的私钥有这种格式

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIJrTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIdq79fP1MZogCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBDMX/L46fPKcSQkgXrwpLtqBIIJ
..

我基本上是通过

生成的
crypto.generateKeyPairSync('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: ''
}
});

当我在互联网上查看更多内容时,我在 enter link description here 看到了一个示例私钥的 header 是“-----BEGIN RSA PRIVATE KEY-----”,实际上我可以在 Ubuntu 中运行该代码并且没有错误发生。所以看起来问题与由于 privateKeyEncoding 中的“pkcs8”类型而改变的 header 有关。我还注意到我在 Windows 上的 Node 版本是 10.15.3,在 ubuntu 上是 12.4会不会也跟 Node 版本变化有关?

最佳答案

我在 Windows 10 和 Ubuntu 18.04 上都尝试过非常相似的东西。在我的例子中,我生成公钥/私钥文件,使用这些文件加密然后解密。它在两个平台上都运行良好。值得一试,看看它是否适合您。 Node 版本为:Windows:10.15 Ubuntu 10.16。

const crypto = require('crypto');
const fs = require("fs");

function generateKeyFiles() {

const keyPair = crypto.generateKeyPairSync('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: ''
}
});

fs.writeFileSync("public_key", keyPair.publicKey);
fs.writeFileSync("private_key", keyPair.privateKey);
}

// Encrypt a string given a public key file. Encode the result in base64.
function encryptString (plaintext, publicKeyFile) {
const publicKey = fs.readFileSync(publicKeyFile, "utf8");
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(plaintext));
return encrypted.toString("base64");
}

// Encrypt a string given a cipherText (in base64) and a private key file.
function decryptString (ciphertext, privateKeyFile) {
const privateKey = fs.readFileSync(privateKeyFile, "utf8");
const decrypted = crypto.privateDecrypt(privateKey, Buffer.from(ciphertext, "base64"));
return decrypted.toString("utf8");
}

generateKeyFiles();

const plainText = "I have spread my dreams under your feet. Tread softly because you tread on my dreams.";

const cipherText = encryptString(plainText, "./public_key");

console.log();
console.log("Plaintext:", plainText);
console.log();
console.log("Ciphertext: ", cipherText);
console.log();
console.log("Decrypted Text: ", decryptString(cipherText, "private_key"));
console.log();

您也可以尝试将 key 文件从 Windows 复制到 Ubuntu(跳过生成 key 文件的步骤)。这对我也有用。

关于node.js - crypto.privateDecrypt 适用于 Windows 但不适用于 ubuntu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56555318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com