如何在 C# 中使用 Bouncy Castle 签署 public PGP 密钥

How to sign public PGP key with Bouncy Castle in C#

我想在我的应用程序中创建信任网络支持,允许我的用户使用他们的私钥,签署其他用户的 public 密钥 - 使用 C# 和 Bouncy Castle。

我已经弄清楚了大部分事情,例如创建 PGP 密钥、使用 HTTP REST 将它们提交到密钥服务器、加密 MIME 消息并对其进行加密签名(使用 MimeKit)——但剩下的一个障碍是计算输出一些可以使用我的私钥的代码,使用 Bouncy Castle 为另一个人的 public 密钥签名。

由于 BC 的文档太可怕了,弄清楚这些部分,以前被证明几乎是不可能的...

郑重声明,我使用 GnuPG 作为我的密钥存储。

如果有人想查看我到目前为止所做的代码,请随时查看 here

我可能不应该在这里问这个问题,但如果 BC 专家可以大致了解一下我目前的代码,并检查我是否出丑了,我也很高兴到目前为止我所做的事情...

经过反复试验找到了答案,这里是...

private static byte[] SignPublicKey(
    PgpSecretKey secretKey,
    string password,
    PgpPublicKey keyToBeSigned,
    bool isCertain)
{
    // Extracting private key, and getting ready to create a signature.
    PgpPrivateKey pgpPrivKey = secretKey.ExtractPrivateKey (password.ToCharArray());
    PgpSignatureGenerator sGen = new PgpSignatureGenerator (secretKey.PublicKey.Algorithm, HashAlgorithmTag.Sha1);
    sGen.InitSign (isCertain ? PgpSignature.PositiveCertification : PgpSignature.CasualCertification, pgpPrivKey);

    // Creating a stream to wrap the results of operation.
    Stream os = new MemoryStream();
    BcpgOutputStream bOut = new BcpgOutputStream (os);
    sGen.GenerateOnePassVersion (false).Encode (bOut);

    // Creating a generator.
    PgpSignatureSubpacketGenerator spGen = new PgpSignatureSubpacketGenerator();
    PgpSignatureSubpacketVector packetVector = spGen.Generate();
    sGen.SetHashedSubpackets (packetVector);
    bOut.Flush();

    // Returning the signed public key.
    return PgpPublicKey.AddCertification (keyToBeSigned, sGen.Generate()).GetEncoded();
}