Проверить закрытый ключ в подписанном XML с помощью открытого ключа

Я использую javascript, чтобы открыть магазин CAPICOM для выбора сертификата. После этого я экспортирую выбранный сертификат, открытый ключ и закрытый ключ этого сертификата и помещаю их в три скрытых поля.

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

При подписании xml я использовал:

Взять сертификат

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

Для определения закрытого ключа я использовал

    Dim keyC As String = hideKey 

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

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

Это успешно подпишет мой xml.

Для проверки xml я использовал:

    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

Но это не работает. Это работает, только если я снова использую закрытый ключ.

Является ли хорошей практикой подписывать и проверять с помощью одного и того же закрытого ключа или делать и то, и другое с помощью открытого ключа?


person SeaSide    schedule 11.05.2016    source источник


Ответы (1)


Мне удалось подписать с помощью закрытого ключа и проверить подпись с помощью открытого ключа, и я хочу поделиться с вами.

В функции SignXml() я экспортировал открытый ключ из закрытого ключа:

 Dim publicKey as String = tmpRsa.ToXmlString(False) 

Затем в той же функции я вызываю функцию verifyXml():

 Dim verifySign As Boolean

 verifySign = VerifyXml(doc, publicKey)

В функции verifyXml() я взял открытый ключ следующим образом:

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
person SeaSide    schedule 26.05.2016