2017-07-18 25 views
1

Ich möchte Web of Trust-Unterstützung in meiner Anwendung erstellen, so dass meine Benutzer ihre privaten Schlüssel verwenden können, um öffentliche Schlüssel anderer Benutzer zu signieren - Verwenden von C# und Bouncy Castle.Wie öffentliche PGP-Schlüssel mit Bouncy Castle in C signieren #

Ich habe die meisten Dinge herausgefunden, wie PGP-Schlüssel erstellen, sie an Schlüsselserver mit HTTP-REST senden, MIME-Nachrichten verschlüsseln und kryptografisch signieren (mit MimeKit) - Aber die einzige verbleibende Hürde, ist herauszufinden ein Code, der meinen privaten Schlüssel verwenden kann, um den öffentlichen Schlüssel einer anderen Person unter Verwendung von Bouncy Castle zu signieren.

Da die Dokumentation BC horrend ist, diese Teile herauszufinden, haben so gut wie unmöglich vorher schließen bewiesen ...

Für das Protokoll, ich bin mit GnuPG als mein Speicher für Schlüssel.

Wenn jemand meinen Code bis jetzt für das, was ich getan habe, ansehen möchte, zögern Sie nicht, es zu überprüfen here.

Ich sollte das hier wahrscheinlich nicht fragen, aber ich würde es auch lieben, wenn einige BC-Gurus da draußen meinen Code bis jetzt allgemein ansehen könnten, und überprüfen, ob ich mich damit zum Narren gemacht habe ich die Sachen bisher getan haben ...

Antwort

0

Konnten Sie die Antwort nach einer Menge von Versuch und Irrtum, hier ist es ...

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

Wenn dies die Lösung Ihrer Frage ist, möchten Sie vielleicht um es als die akzeptierte Antwort zu markieren. Es könnte Menschen in der Zukunft helfen und sie ermutigen es hier. https://stackoverflow.com/help/self-answer – user8675309

Verwandte Themen