2010-08-25 7 views
0

J'ai géré le cryptage d'un document XML en cryptant un élément et en remplaçant ensuite l'élément par les données cryptées. A montré dans l'exemple de code ci-dessous.Cryptage de plusieurs éléments d'un document xml

Public Shared Sub Encrypt(ByVal textReader As TextReader, ByVal textWriter As TextWriter, ByVal certificateName As String) 
    Dim xmlDoc As New XmlDocument() 
    xmlDoc.Load(textReader) 
    ' Add the schema from Resources 
    AddSchema(xmlDoc) 
    ' Get all elements to encrypt 
    Dim elementsToEncrypt As List(Of XmlElement) = FindElementsToEncrypt(xmlDoc.DocumentElement) 

    ' Get the certificate 
    Dim certificate As X509Certificate2 = FindTrustedCertificate(certificateName) 
    If certificate Is Nothing Then 
     Throw New ArgumentException(String.Format("Certificate {0} not found", certificateName), "certificateName") 
    End If 

    Dim xmlEncrypter As New EncryptedXml(xmlDoc) 

    ' Itterate all elelemts to encrypt 
    For Each elementToEncrypt As XmlElement In elementsToEncrypt 
     ' Encrypt the elements with the given certificate 
     Dim encryptedData As EncryptedData = xmlEncrypter.Encrypt(elementToEncrypt, certificate) 
     EncryptedXml.ReplaceElement(elementToEncrypt, encryptedData, False) 
    Next 

    ' Return the encrypted XmlDocument 
    xmlDoc.Save(textWriter) 
End Sub 

Il en résulte un fichier XML où l'élément a EncryptedData, tenant le certificat X509, comme (je l'ai enlevé les données en vrac):

 <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> 
    <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" /> 
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> 
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> 
     <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
      <X509Data> 
      <X509Certificate>MIIFU......</X509Certificate> 
      </X509Data> 
     </KeyInfo> 
     <CipherData> 
      <CipherValue>dQOzeY81I9XAz......</CipherValue> 
     </CipherData> 
     </EncryptedKey> 
    </KeyInfo> 
    <CipherData> 
     <CipherValue>qfmuwmyrpMOK.....</CipherValue> 
    </CipherData> 
    </EncryptedData> 

Si je chiffre 2 de ces éléments, le même X509 Le certificat est inclus deux fois.

Est-ce que quelqu'un connaît une solution où le certificat est par exemple référencé?

Merci,

Bert Heesbeen

Répondre

0

Dommage que personne ne m'a donné la réponse. Cela m'a pris du temps, mais je me suis débrouillé.

J'ai fait du code pour générer une clé de session Rijndael. Utilisez cette clé pour chaque élément pour crypter et référencer cette clé. Dans le dernier élément EncryptedData, j'inclue la clé de session chiffrée par rsa et une référence au certificat x509.

Cela fonctionne. Bert