C# 如何在C中使用Bouncy Castle对公共PGP密钥进行签名#

C# 如何在C中使用Bouncy Castle对公共PGP密钥进行签名#,c#,bouncycastle,pgp,C#,Bouncycastle,Pgp,我想在我的应用程序中创建信任网支持,允许我的用户使用他们的私钥,签署其他用户的公钥-使用C#和Bouncy Castle 我已经解决了大部分问题,比如创建PGP密钥,使用HTTP REST将它们提交到密钥服务器,加密MIME消息并对它们进行加密签名(使用MimeKit)——但剩下的一个障碍是找出一些可以使用我的私钥的代码,为另一个人的公钥签名,使用弹跳城堡 由于不列颠哥伦比亚省的文件编制非常糟糕,要弄清这些部分,以前已经证明几乎是不可能的 作为记录,我使用GnuPG作为密钥存储 如果有人想看看我

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

我已经解决了大部分问题,比如创建PGP密钥,使用HTTP REST将它们提交到密钥服务器,加密MIME消息并对它们进行加密签名(使用MimeKit)——但剩下的一个障碍是找出一些可以使用我的私钥的代码,为另一个人的公钥签名,使用弹跳城堡

由于不列颠哥伦比亚省的文件编制非常糟糕,要弄清这些部分,以前已经证明几乎是不可能的

作为记录,我使用GnuPG作为密钥存储

如果有人想看看我的代码到目前为止我做了什么,请随时检查


我可能不应该在这里问这个问题,但我也希望有一些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();
}

如果这是您问题的解决方案,您可能希望将其标记为已接受的答案。它可以帮助人们在未来,他们鼓励它在这里。