2017-07-18 5 views
1

Je souhaite créer un réseau de confiance dans mon application, permettant à mes utilisateurs d'utiliser leurs clés privées, de signer les clés publiques d'autres utilisateurs - en utilisant C# et Bouncy Castle. J'ai la plupart des choses à faire, comme créer des clés PGP, les soumettre à des serveurs clés en utilisant HTTP REST, crypter des messages MIME et les signer cryptographiquement (en utilisant MimeKit) - Mais le dernier obstacle, c'est de comprendre un morceau de code qui peut utiliser ma clé privée, pour signer pour la clé publique d'une autre personne, en utilisant Bouncy Castle.Comment signer une clé publique PGP avec Bouncy Castle en C#

Depuis la documentation de la Colombie-Britannique est horrible, déterminer ces pièces, ont déjà prouvé presque impossible ...

Pour mémoire, j'utilise GnuPG comme mon stockage pour les clés.

Si quelqu'un veut regarder mon code jusqu'ici pour ce que j'ai fait, n'hésitez pas à le vérifier here.

Je ne suis probablement pas censé poser cette question ici, mais j'aimerais aussi que certains gourous de la Colombie-Britannique puissent avoir un aperçu général de mon code jusqu'à maintenant, et vérifier si je me suis ridiculisé avec les trucs que je l'ai fait jusqu'à présent ...

Répondre

0

a trouvé la réponse après beaucoup d'essais et d'erreurs, voilà ...

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(); 
} 
+0

Si cela est la solution à votre question, vous voudrez peut-être pour le marquer comme la réponse acceptée. Cela pourrait aider les gens à l'avenir et ils l'encouragent ici. https://stackoverflow.com/help/self-answer – user8675309