[C#] Signieren von Daten mit MD5WithRSA aus .Pem / .Pkcs8-Schl├╝sseldatei in C #


Answers

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

Dann kannst du schreiben:

byte[] dataToSign = Encoding.UTF8.GetBytes("Data to sign");
using (CngKey signingKey = CngKey.Import(pkcs8PrivateKey, CngKeyBlobFormat.Pkcs8PrivateBlob))
  using (RSACng rsa = new RSACng(signingKey))
  {
    rsa.SignatureHashAlgorithm = CngAlgorithm.MD5;
    return rsa.SignData(dataToSign);
  }

Aktualisiert dank Simon Mourier: Mit .Net 4.6 benötigen Sie keine separate Bibliothek mehr

Question

Ich habe das folgende Codebeispiel in Java, und ich muss es in C # nachspielen:

PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(pkcs8PrivateKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privKey = keyFactory.generatePrivate(privKeySpec);
Signature sign = Signature.getInstance("MD5withRSA");

sign.initSign(privKey);
sign.update(data);
byte[] signature = sign.sign();

Ist es möglich mit der Standard-.Net-Crypto-API, oder sollte ich BouncyCastle verwenden? Vielen Dank,

b.




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.

Angenommen, Sie könnten einen PKCS # 8-codierten privaten RSA-Schlüssel dekodieren, dann sollte der Rest des Codes nach dem, was ich auf MSDN gelesen habe, folgendermaßen aussehen:

byte[] hv = MD5.Create().ComputeHash(data);
RSACryptoServiceProvider rsp = new RSACryptoServiceProvider();
RSAParameters rsp = new RSAParameters();
// here fill rsp fields by decoding pkcs8PrivateKey
rsp.ImportParameters(key);
RSAPKCS1SignatureFormatter rf = new RSAPKCS1SignatureFormatter(rsp);
rf.SetHashAlgorithm("MD5");
byte[] signature = rf.CreateSignature(hv);

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

Was die PKCS # 8-Schlüsselblob-Decodierung betrifft (dh das Ausfüllen der rsp Felder), habe ich diese Seite gefunden, die ein Befehlszeilen-Dienstprogramm in C # beschreibt, 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's PKCS8EncodedKeySpec .