¿Por qué necesitaría usar la clave PRIVATE para verificar la firma de un archivo?

0

Uso JavaScript para abrir la tienda CAPICOM para elegir el certificado. Después de eso, exporto el certificado seleccionado, la clave pública y la clave privada de ese certificado y los coloco en tres campos ocultos.

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

Al firmar xml usé:

Para tomar el certificado:

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

Para definir la clave privada que utilicé:

Dim keyC As String = hideKey 

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

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

Esto firmará correctamente mi xml.

Para verificar el xml que utilicé:

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

Pero esto no funciona. Solo funciona si uso la clave privada nuevamente.

¿Es una buena práctica firmar y verificar con la misma clave privada o hacer ambas cosas con una clave pública?

    
pregunta SeaSide 13.05.2016 - 13:00
fuente

1 respuesta

0

Pude firmar con clave privada y verificar la firma con clave pública, y quiero compartir con ustedes.

En la función SignXml () exporté clave pública de clave privada:

Dim publicKey as String = tmpRsa.ToXmlString(False) 

Luego, en la misma función, llamo a la función VerifyXml ():

Dim verifySign As Boolean

verifySign = VerifyXml(doc, publicKey)

En la función VerifyXml () tomé la clave pública de esta manera:

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
    
respondido por el SeaSide 16.05.2016 - 10:06
fuente

Lea otras preguntas en las etiquetas