Signieren von Daten mit MD5WithRSA aus .Pem / .Pkcs8-Schlüsseldatei in C #

8

Ich habe das folgende Codebeispiel in Java und muss es in C # neu implementieren:

%Vor%

Ist das mit der Standard-.Net-Crypto-API möglich, oder sollte ich BouncyCastle verwenden? Danke,

b.

    
balint 16.02.2010, 17:19
quelle

5 Antworten

3

Ich stoße auf ein sehr ähnliches Problem beim Erstellen eines nativen C # -Tools zum Packen von Chrome-Erweiterungen (mit SHA1, nicht MD5, aber das ist kein großer Unterschied). Ich glaube, ich habe buchstäblich jede mögliche Lösung für .Net: System.Security.Cryptography, BouncyCastle, OpenSSL.Net und Chilkat RSA versucht.

Die beste Lösung ist wahrscheinlich Chilkat; ihre Schnittstelle ist die sauberste und einfachste, sie ist gut unterstützt und gut dokumentiert, und es gibt eine Million Beispiele. Zum Beispiel ist hier ein Code, der ihre Bibliothek verwendet, die etwas sehr nahe an dem was du willst: Ссылка . Allerdings ist es nicht kostenlos (obwohl $ 150 nicht unvernünftig ist, da ich 2 Tage gebrannt habe, um das herauszufinden, und ich mache etwas mehr als 75 $ pro Tag!).

Als kostenlose Alternative bietet JavaScience eine Reihe von Krypto-Dienstprogrammen in Quellform für mehrere Sprachen (einschließlich C # /. Net) unter Ссылка . Der, der am meisten hervorsticht, was Sie versuchen, ist opensslkey ( Ссылка ), mit dem Sie ein generieren können RSACryptoServiceProvider aus einer PEM-Datei. Sie können diesen Anbieter dann verwenden, um Ihren Code zu signieren:

%Vor%     
Tim Keating 19.02.2010, 19:39
quelle
9

Eine andere Möglichkeit ist die Verwendung von CNG (Cryptography Next Generation) zusammen mit der Security.Cryptography DLL von CodePlex

Dann kannst du schreiben:

%Vor%

Aktualisiert dank Simon Mourier: Mit .Net 4.6 brauchen Sie keine separate Bibliothek mehr.

    
Timores 26.02.2010 16:21
quelle
1

Diese SO-Frage beantwortet den PKCS # 8-Teil Ihres Codes. Der Rest der .NET RSA-Klassen ist ein bizarres Durcheinander von teilweise überlappenden Klassen, die sehr schwer zu ergründen sind. Es scheint, dass die Signaturunterstützung in den Klassen RSACryptoServiceProvider und / oder RSAPKCS1SignatureFormatter liegt.

    
James K Polk 17.02.2010 01:06
quelle
1

Haftungsausschluss: Ich kenne Java und Kryptographie, aber meine Kenntnisse in C # und .NET sind sehr begrenzt. Ich schreibe hier nur unter dem Einfluss meiner Google-Fu-Fähigkeiten.

Wenn Sie davon ausgehen, dass Sie einen PKCS # 8-codierten privaten RSA-Schlüssel dekodieren können, sollte der Rest des Codes nach dem, was ich auf MSDN gelesen habe, so aussehen:

%Vor%

Die relevanten Klassen befinden sich im Namensraum System.Security.Cryptography .

Wie bei der PKCS # 8-Schlüsselblob-Decodierung (dh beim Ausfüllen der Felder rsp ) habe ich diese Seite beschreibt ein Befehlszeilen-Dienstprogramm in C #, das diesen Job ausführen kann. Der Quellcode wird bereitgestellt und ist eine einzelne C # -Datei. Von dem, was ich darin gelesen habe, dekodiert dieser Code die PKCS # 8-Datei "manuell"; indirekt sollte dies bedeuten, dass Raw .NET (2.0) nicht über Funktionen für die PKCS # 8-Schlüsseldateidekodierung verfügt (andernfalls wäre der Autor dieses Tools nicht in die Schwierigkeiten geraten, eine solche Dekodierung zu implementieren). Für Ihre anstehende Aufgabe können Sie die benötigten Teile aus dieser Quelldatei aufspüren und alles über PEM und symmetrische Verschlüsselung überspringen. Ihr Einstiegspunkt wäre die Funktion DecodePrivateKeyInfo() , die offensichtlich eine DER-kodierte unverschlüsselte PKCS # 8-Datei erwartet, genau wie Java PKCS8EncodedKeySpec .

    
Thomas Pornin 19.02.2010 19:38
quelle
0

Sie können diesen Code verwenden. Zuallererst sollten Sie "BouncyCastle.Crypto.dll" von Ссылка herunterladen.

%Vor%     
keyle 12.01.2017 09:22
quelle