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

C# Bouncy Castle生成ASC密钥文件导入Kleopatra报错求解

问题根因

你当前代码无法导入Kleopatra的核心原因有两个:

  • 格式标准不匹配:你使用PemWriter生成的是普通PKCS标准的PEM格式密钥,文件头为-----BEGIN RSA PUBLIC KEY-----/-----BEGIN RSA PRIVATE KEY-----;而Kleopatra等GPG工具识别的.asc密钥是OpenPGP标准格式,文件头为-----BEGIN PGP PUBLIC KEY BLOCK-----/-----BEGIN PGP PRIVATE KEY BLOCK-----,两种格式结构完全不兼容。
  • 代码逻辑错误:
    1. 写入私钥前没有重置StringWriter,生成的私钥字符串会包含之前写入的公钥内容
    2. 私钥写入时错误将文件路径填为PublicKey.asc,会覆盖之前生成的公钥文件
正确实现方案

要生成Kleopatra可识别的OpenPGP格式ASC密钥,需要使用BouncyCastle的OpenPGP专属API,不能直接用普通PEM写入方法,完整实现代码如下:

  1. 首先引入所需命名空间
using Org.BouncyCastle.Bcpg;
using Org.BouncyCastle.Bcpg.OpenPgp;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using System.IO;
using System.Text;
  1. 密钥生成与导出代码
// 生成2048位RSA原生密钥对
RsaKeyPairGenerator rsaGenerator = new RsaKeyPairGenerator();
rsaGenerator.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
AsymmetricCipherKeyPair rsaKeyPair = rsaGenerator.GenerateKeyPair();

// 将原生RSA密钥封装为OpenPGP格式密钥,必须绑定用户标识(一般填邮箱即可)
PgpKeyPair pgpKeyPair = new PgpKeyPair(
    PublicKeyAlgorithmTag.RsaGeneral,
    rsaKeyPair,
    DateTime.UtcNow
);
string userId = "your_account@example.com"; // 替换为你自己的用户标识
// 私钥加密配置:示例为不加密私钥,生产环境建议替换为Aes256等算法并设置密码
PgpSecretKey pgpSecretKey = new PgpSecretKey(
    PgpSignature.DefaultCertification,
    pgpKeyPair,
    userId,
    SymmetricKeyAlgorithmTag.Null,
    null,
    null,
    new SecureRandom()
);
PgpPublicKey pgpPublicKey = pgpKeyPair.PublicKey;

// 导出公钥到PublicKey.asc
using (FileStream pubFs = File.Create(@"c:\temp\PublicKey.asc"))
using (ArmoredOutputStream pubArmored = new ArmoredOutputStream(pubFs))
{
    pgpPublicKey.Encode(pubArmored);
}

// 导出私钥到PrivateKey.asc
using (FileStream privFs = File.Create(@"c:\temp\PrivateKey.asc"))
using (ArmoredOutputStream privArmored = new ArmoredOutputStream(privFs))
{
    pgpSecretKey.Encode(privArmored);
}

注意:如果需要给私钥设置访问密码,将PgpSecretKey构造函数中的SymmetricKeyAlgorithmTag.Null替换为SymmetricKeyAlgorithmTag.Aes256,并在对应参数位置传入密码的字节数组即可。生成的文件可以直接被Kleopatra、Gpg4win等OpenPGP兼容工具正常导入。

内容的提问来源于stack exchange,提问作者miguelito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:24:15