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-----,两种格式结构完全不兼容。 - 代码逻辑错误:
- 写入私钥前没有重置
StringWriter,生成的私钥字符串会包含之前写入的公钥内容 - 私钥写入时错误将文件路径填为
PublicKey.asc,会覆盖之前生成的公钥文件
- 写入私钥前没有重置
正确实现方案
要生成Kleopatra可识别的OpenPGP格式ASC密钥,需要使用BouncyCastle的OpenPGP专属API,不能直接用普通PEM写入方法,完整实现代码如下:
- 首先引入所需命名空间
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;
- 密钥生成与导出代码
// 生成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
相关产品推荐
相关产品推荐

