2016-05-11 2 views
0

Ich benutze Javascript, um CAPICOM Speicher zu öffnen, um Zertifikat zu wählen. Danach exportiere ich das ausgewählte Zertifikat, den öffentlichen Schlüssel und den privaten Schlüssel dieses Zertifikats und lege sie in drei versteckte Felder.Überprüfen Sie den privaten Schlüssel in signierten XML mit öffentlichen Schlüssel

var privateKey = certificates.Item(1).PrivateKey; 
    var cert = certificates.Item(1); 
    var publicKey = cert.PublicKey().EncodedKey.Value 

Wenn xml Unterzeichnung verwendet I:

Zertifikat nehmen

Dim hideCertCapicom As String = Replace(HiddenCert.Value, " ", "+") 
    Dim certificate As New X509Certificate2(Convert.FromBase64String(hideCertCapicom)) 

Für den privaten Schlüssel definieren ich

verwendet
Dim keyC As String = hideKey 

    Dim cspp As New CspParameters() 
    cspp.KeyContainerName = keyC 

    Dim tmpRsa As New RSACryptoServiceProvider(cspp) 
    tmpRsa.PersistKeyInCsp = True 

Das wird mein xml erfolgreich abgeschlossen.

Für xml Verifizieren ich verwendet:

Dim hidePublicKey As String = HiddenPublicKey.Value 

    Dim keyC As String = hidePublicKey 

    Dim cspp As New CspParameters() 
    cspp.KeyContainerName = keyC 

    Dim tmpRsa As New RSACryptoServiceProvider(cspp) 
    tmpRsa.PersistKeyInCsp = True 

Aber das funktioniert nicht. Es funktioniert nur, wenn ich den privaten Schlüssel erneut verwende.

Ist es eine gute Vorgehensweise, mit demselben privaten Schlüssel zu signieren und zu verifizieren oder beides mit einem öffentlichen Schlüssel zu tun?

Antwort

0

Ich konnte mit privaten Schlüssel unterschreiben und die Signatur mit öffentlichen Schlüssel überprüfen, und ich möchte mit Ihnen teilen.

In SignXml() Funktion I öffentlichen Schlüssel aus privaten Schlüssel exportiert:

Dim publicKey as String = tmpRsa.ToXmlString(False) 

Dann in der gleichen Funktion nenne ich verifyXml() Funktion:

Dim verifySign As Boolean 

verifySign = VerifyXml(doc, publicKey) 

In verifyXml() Funktion, die ich nahm Öffentlicher Schlüssel auf diesem Weg:

Public Function VerifyXml(Doc As XmlDocument, Key As String) As Boolean 

Dim tmpRsa As New RSACryptoServiceProvider() 
tmpRsa.FromXmlString(Key) 

Dim signedXml As New SignedXml(Doc) 

Dim nodeList As XmlNodeList = Doc.GetElementsByTagName("Signature") 

If nodeList.Count <= 0 Then 
    Throw New CryptographicException("Verification failed: No Signature was found in the document.") 
End If 

If nodeList.Count >= 2 Then 
    Throw New CryptographicException("Verification failed: More that one signature was found for the document.") 
End If 

signedXml.LoadXml(DirectCast(nodeList(0), XmlElement)) 

Return signedXml.CheckSignature(tmpRsa) 

End Function 
Verwandte Themen