You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:05:20