2016-05-11 17 views
0

JavaScriptを使用してCAPICOMストアを開いて証明書を選択します。 その後、選択した証明書、公開鍵、およびその証明書の秘密鍵をエクスポートし、3つの隠しフィールドに入れます。 XMLに署名するとき公開鍵で署名されたXMLの秘密鍵を確認する

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

は、私が使用:

を、私はこれが正常に私のxmlを締結します

Dim keyC As String = hideKey 

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

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

を使用する秘密鍵を定義するための証明書

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

を取ります。

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 
をしかし、これは動作しません:私が使用してXMLを検証するために

。これは、私が再び秘密鍵を使用する場合にのみ機能します。

同じ秘密鍵で署名して検証するか、公開鍵で両方を行うのがよいでしょうか?

答えて

0

私は秘密鍵で署名し、署名を公開鍵で検証することができました。私はあなたと共有したいと思います。私が撮ったverifyXml()関数では

Dim verifySign As Boolean 

verifySign = VerifyXml(doc, publicKey) 

:私はverifyXml()関数を呼び出し、同じ機能に続いて

Dim publicKey as String = tmpRsa.ToXmlString(False) 

:私は、秘密鍵から公開鍵をエクスポートしSignXml()関数で

この方法で公開鍵:

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 
関連する問題