如何仅使用PGP公钥实现消息的加密与解密?
关于OpenPGP.js仅用公钥完成加密解密的说明
首先得明确PGP非对称加密的核心逻辑:
- 公钥只能用来加密消息,只有对应的私钥才能解密该消息
- 私钥负责解密对应公钥加密的内容,同时用于签名消息
所以严格来说,仅靠公钥是没法完成解密的——公钥的设计就是单向加密,不能反向解密自己加密的内容。但如果你的需求是“只拿着公钥就能完成加密+解密的闭环”,有两种可行的实现方式:
方案一:使用自己的密钥对(你实际持有对应私钥)
如果这个公钥是你自己生成的,那你肯定有对应的私钥(公钥私钥是成对生成的,不可能单独存在)。你可以把私钥和公钥配合使用,代码示例如下:
const openpgp = require('openpgp'); (async () => { // 替换成你自己的密钥对内容 const myPublicKeyArmored = `-----BEGIN PGP PUBLIC KEY BLOCK----- ... -----END PGP PUBLIC KEY BLOCK-----`; const myPrivateKeyArmored = `-----BEGIN PGP PRIVATE KEY BLOCK----- ... -----END PGP PRIVATE KEY BLOCK-----`; const passphrase = '你的私钥密码'; // 私钥未加密可删除此行 // 读取公钥 const publicKey = await openpgp.readKey({ armoredKey: myPublicKeyArmored }); // 读取并解密私钥(私钥未加密时,直接调用openpgp.readPrivateKey即可) const privateKey = await openpgp.decryptKey({ privateKey: await openpgp.readPrivateKey({ armoredKey: myPrivateKeyArmored }), passphrase }); // 用公钥加密消息 const encryptedMsg = await openpgp.encrypt({ message: await openpgp.createMessage({ text: 'Hello, World!' }), encryptionKeys: publicKey, signingKeys: null // 不需要签名可留空 }); console.log('加密后内容:', encryptedMsg); // 用私钥解密消息 const parsedMsg = await openpgp.readMessage({ armoredMessage: encryptedMsg }); const { data: decryptedMsg } = await openpgp.decrypt({ message: parsedMsg, decryptionKeys: privateKey }); console.log('解密后内容:', decryptedMsg); })();
方案二:混合加密模式(本质仍需私钥)
如果你手里只有他人的公钥,想加密后自己解密是完全不可能的——除非你同时持有该公钥对应的私钥。OpenPGP本身采用混合加密逻辑:先用对称密钥加密消息,再用公钥加密这个对称密钥。解密时必须用私钥解开对称密钥,再解密消息,这和常规流程无本质区别,只是拆分了步骤。
必须澄清的误区
PGP的非对称加密算法决定了公钥和私钥是数学配对的,公钥既不能推导出私钥,也不能解密自己加密的内容。不存在“仅用公钥完成加密+解密”的非对称方案——要是有人说可以,那肯定是把非对称加密和对称加密的概念搞混了。
内容的提问来源于stack exchange,提问作者Edison-Myplanet
相关产品推荐
相关产品推荐

