RSA-modulus und exponent aus dem öffentlichen Schlüssel

Ich haben im Grunde das gleiche problem wie in diese Frage, aber ich habe Probleme beim ausfüllen des scheinbar triviale Teile Links von der akzeptierten Antwort. Dies mache ich in C# mit Mono.

Habe ich ein CA-root-Zertifikat, und von diesem kann ich eine byte[] hält einen öffentlichen Schlüssel. Ich bekomme dann ein nicht vertrauenswürdiges Zertifikat muss überprüft werden. Von dem was ich verstehe, RSACryptoServiceProvider.VerifyData sollten den trick tun, aber zuerst muss ich die set RSAParameters mit dem modulus und exponent aus dem öffentlichen Schlüssel.

(Edit: Das folgende wiederholt einige Dinge, die bereits offensichtlich, die Frage, die ich im Zusammenhang mit oben.)

Der Teil des Codes, sollte das tun, was ich brauche, und validieren Sie ein server-Zertifikat mit dem root-Zertifikat vertraue ich wie folgt:

RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider();
RSAParameters publicKeyParams = new RSAParameters();
publicKeyParams.Modulus = GetPublicKeyModulus();
publicKeyParams.Exponent = GetPublicKeyExponent();
publicKey.ImportParameters(publicKeyParams);
return publicKey.VerifyData(SignedValue(), CryptoConfig.MapNameToOID("SHA1"), Signature());

Mein problem ist der Inhalt der GetPublicKeyModulus() und GetPublicKeyExponent(). In der akzeptierten Antwort Sie ausgelassen werden, wie scheinbar triviale, mit nur einem Kommentar zu sagen, das Modul ist der Wert der ersten TLV in meinem öffentlichen Schlüssel, und der exponent ist die zweite TLV in die öffentlichen Schlüssel. Verstehe ich nicht, was das bedeutet.

byte[] GetPublicKeyExponent()
{
  //The value of the second TLV in your Public Key
}

byte[] GetPublicKeyModulus()
{
  //The value of the first TLV in your Public Key
}
byte[] SignedValue()
{
  //The first TLV in your Ceritificate
}

byte[] Signature()
{
  //The value of the third TLV in your Certificate
}

Meine Frage ist, was machen diese "erste TLV"/"zweite TLV" genau bedeuten und wie bekomme ich diese Werte aus dem byte-array habe ich?

Aus, was ich verstehe, TLV steht für type-length-value. Also wenn ich es richtige, ersten bits des byte-array mit dem öffentlichen Schlüssel Informationen darüber, wie viele bits der Modul-Daten ist. Mit diesen Informationen soll ich kopieren, dass die Menge der bits, die aus dem öffentlichen Schlüssel in ein anderes array, und legen Sie RSAParameters.Modul auf den Wert. Nach dem Modul in der öffentliche Schlüssel kommt der exponent, und ich tun sollten Sie den gleichen Vorgang mit dem. Aber ich kann nicht finden Informationen darüber, in wie vielen bits und in welchem format ist die "TL" - Teil des TLV in der public key-Daten enthalten.

Fand ich Informationen an anderer Stelle zu sagen, das E-Modul ist die ersten 1024 bits im öffentlichen Schlüssel, und der exponent wird der Rest, aber das gab mir eine Fehlermeldung über die Größe beim kopieren von Daten zwischen byte-arrays.

Im moment mein code, ich habe seit bilden auf der Grundlage der akzeptierten Antworten in der Frage, die ich verlinkte sieht grundsätzlich so aus:

using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;

X509Certificate2 trustedRootCertificate = new X509Certificate2(X509Certificate2.CreateFromCertFile(filename));
ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;
.
.
public bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
  .
  .
  byte[] publicKeyBytes = trustedRootCertificate.GetPublicKey();
  byte[] modulusData = //The value of the first TLV in the Public Key??
  byte[] exponentData = //The value of the second TLV in the Public Key??

  RSAParameters publicKeyParams = new RSAParameters();
  publicKeyParams.Modulus = modulusData;
  publicKeyParams.Exponent = exponentData;
  RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider();
  publicKey.ImportParameters(publicKeyParams);

  byte[] certificateData = certificate.GetRawCertData();
  byte[] signedValue = //The first TLV in the certificate??
  byte[] encryptedSignature = //The third TLV in the certificate??

  return publicKey.VerifyData(certificateData, HashAlgorithm.Create("SHA1"), encryptedSignature);
}

Oder soll ich mich mit certificateData (der return-Wert-Zertifikat.GetRawCertData()) in der VerifyData nennen?

Woanders habe ich gefunden, dass die verschlüsselte Signatur-Teil ist der Letzte 256 bits in der certificateData, ich bin mir nicht sicher, ob das das gleiche ist wie "das Dritte TLV im Zertifikat". Wenn nicht, würde ich tun

byte[] certificateData = certificate.GetRawCertData();
byte[] encryptedSignature = new byte[256];
System.Array.Copy(certificateData, certificateData.Length - 256, encryptedSignature, 0, 256);

und dann mit encryptedSignature als letzten parameter in die VerifyData nennen.

Statt dass diese TLV Geschäft habe ich auch versucht, einfach

RSACryptoServiceProvider publicKey = trustedRootCertificate.PublicKey.Key as RSACryptoServiceProvider;

als die person in Frage, die ich im Zusammenhang mit oben, aber mit diesem die VerifyData nennen, dann false zurückgegeben, wenn ich dachte, es sollte nicht sein. Das Zertifikat der Anwendung wird vom server trustedRootCertificate als root-cert, ich sollte in der Lage sein, dies zu tun mit, dass, richtig? Das root-public key sollte in der Lage sein zu überprüfen, der server ist cert?

Es ist sehr viel möglich, ich habe nur die Grundlagen des Zertifikat-Verifizierung von Anfang an falsch. Wenn das nicht der Fall ist, dann ist meine Frage ist wie bekomme ich diese Werte

//The value of the second TLV in your Public Key
..
//The value of the first TLV in your Public Key

aus dem öffentlichen Schlüssel der vertrauenswürdigen root-cert die ich habe.

Edit: ich hab auch überprüft, ob das root-Zertifikat laden Sie aus der Datei und das Zertifikat der app bekommt von dem server sind, was Sie sein sollen, indem Sie drucken Ihre Informationen, das problem ist also nicht mindestens in die Zertifikate falsch. Ich weiß nur nicht, wie Sie richtig zu verwenden.

  • Ich weiß nicht, ob ich deine Frage verstanden habe, klar, aber Sie haben noch Durchlaufen:: social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/...
  • Ja, das ist genau das, wo ich die trustedRootCertificate.PublicKey.Schlüssel als RSACryptoServiceProvider-Ansatz aus. Als für das Verständnis der Frage, die post, wie es jetzt ist ziemlich viel, meint die Frage im ersten Satz ist zu Lesen, auch. Ich werde Bearbeiten meine Frage, Unabhängiger zu werden.
InformationsquelleAutor riksteri | 2013-06-13
Schreibe einen Kommentar