2016-05-11 4 views
0

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

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 

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

Хорошая практика - подписывать и проверять с помощью того же закрытого ключа или делать как с открытым ключом?

ответ

0

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

В 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 
Смежные вопросы