Perché dovrei usare il tasto PRIVATO per verificare la firma di un file?

0

Uso JavaScript per aprire l'archivio CAPICOM per scegliere il certificato. Successivamente esporto il certificato selezionato, la chiave pubblica e la chiave privata del certificato e le metto in tre campi nascosti.

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

Durante la firma di xml ho usato:

Per ricevere il certificato:

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

Per definire la chiave privata ho usato:

Dim keyC As String = hideKey 

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

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

Questo firmerà correttamente il mio xml.

Per verificare xml ho usato:

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

Ma questo non funziona. Funziona solo se uso di nuovo la chiave privata.

È buona pratica firmare e verificare con la stessa chiave privata o fare entrambe le cose con la chiave pubblica?

    
posta SeaSide 13.05.2016 - 13:00
fonte

1 risposta

0

Sono riuscito a firmare con la chiave privata e a verificare la firma con la chiave pubblica, e voglio condividerlo con te.

Nella funzione SignXml () ho esportato la chiave pubblica dalla chiave privata:

Dim publicKey as String = tmpRsa.ToXmlString(False) 

Quindi nella stessa funzione chiamo la funzione verifyXml ():

Dim verifySign As Boolean

verifySign = VerifyXml(doc, publicKey)

Nella funzione verifyXml () ho preso la chiave pubblica in questo modo:

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
    
risposta data 16.05.2016 - 10:06
fonte

Leggi altre domande sui tag