8
votes

C # chiffrer un fichier xml

J'ai besoin de deux méthodes à chiffrer et de chiffrer un fichier XML avec une clé = "Hello World", la clé Hello World devrait être utilisée pour chiffrer et déchiffrer le fichier XML. Ces méthodes doivent fonctionner sur toutes les machines !! ! Toute méthode de cryptage fera. Contenu de fichier XML ci-dessous:

<root>
    <lic>
        <number>19834209</number>
        <expiry>02/02/2002</expiry>
    </lic>
</root>


6 commentaires

Veuillez poster un court exemple de votre code et ce qui ne fonctionne pas exactement (par exemple, la ligne 12, je reçois une erreur de compilateur 12345 'ou' pendant l'exécution, je reçois une exception SecurityException sur la ligne 15 ').


mauvaises données lancées par la classe de cryptage ah bien


Avez-vous besoin de chiffrer les données pour le masquer ou de protéger les données des modifications?


J'ai besoin de chiffrer tout le fichier pour que les gens ne fassent pas avec elle.


Empêcher les personnes vissées avec elle s'intégrerait à la "protection des données des modifications". Quoi qu'il en soit, si vous choisissez de chiffrer le fichier complet, assurez-vous que vous n'abandonnez pas la clé que vous avez utilisée pour chiffrer les données dans votre programme, ou sa connaissance gratuitement (avec réflecteur).


Eh bien, j'ai un schéma terminé partiellement, je vais aller quelque part, tous les schémas sont assez inutiles en raison de la corruption pour contourner le mécanisme.Hashes que je trouve sont un peu plus utiles.


4 Réponses :


14
votes

Si vous voulez la même clé pour chiffrer et déchiffrer, vous devez utiliser une méthode symétrique (qui est la définition, vraiment). Voici le plus proche de votre échantillon (même source). http://msdn.microsoft.com/en-us/library/sb7w85t6. ASPX

L'échantillon ne fonctionne pas affiché le parce qu'ils n'utilisent pas les mêmes touches. Non seulement sur des machines différentes:. En cours d'exécution du programme sur la même machine deux fois ne devraient pas travailler non plus (n'a pas fonctionné pour moi), parce qu'ils utilisent des clés aléatoires à chaque fois
essayez d'ajouter ce code après avoir créé votre clé: p>

key = new RijndaelManaged();

string password = "Password1234"; //password here
byte[] saltBytes = Encoding.UTF8.GetBytes("Salt"); // salt here (another string)
var p = new Rfc2898DeriveBytes(password, saltBytes); //TODO: think about number of iterations (third parameter)
// sizes are devided by 8 because [ 1 byte = 8 bits ]
key.IV = p.GetBytes(key.BlockSize / 8);
key.Key = p.GetBytes(key.KeySize / 8);


11 commentaires

J'ai essayé cet échantillon, si je commencez uniquement à déchiffrer, puis de chiffrer puis commencez à enregistrer crypt et le déchiffrement ne fonctionne pas? Pourquoi?


Merci, sacrément ces gars MSDN, eh bien vous avez sauvé ma journée.Merci de nouveau pour votre temps et votre ressource.


Comme si j'avais le temps de comprendre tous ces éléments de cryptage complexes.i essayait de comprendre en lisant le MSDN, mais s'ils ne peuvent pas l'expliquer correctement, alors que d'autres que d'autres puissent comprendre l'ensemble de la théorie cryptographique d'encaisser un fichier.well .NET a des cours et j'ai juste besoin de les utiliser pour sauver mon temps! .et Je vous donne un exemple, puis au moins, il devrait fonctionner sur différentes machines!


Si vous êtes intéressé, sur votre temps libre, MSDN n'est pas un bon endroit pour apprendre la théorie. Je commencerais avec Wikipedia - en.wikipedia.org/wiki/symmetric -key_algorithm . Si vous êtes très intéressé et que vous voulez quelque chose en anglais sympathique, le livre de code de Simon Singh est probablement votre meilleur choix.


I Deuxième proposition de Kobi pour Le livre de code . Il est très divertissant et informatif en même temps!


Avez-vous des votes pour cela? N'hésitez pas à me dire si j'ai fait quelque chose de mal.


@ VILX-Pourquoi les gens doivent-ils comprendre le cryptage lorsque tout ce qu'ils veulent est de chiffrer un fichier? J'utilise beaucoup de chaîne, mais je ne comprends pas comment fonctionne la chaîne. Dois-je vraiment comprendre comment une chaîne fonctionne jusqu'à un point où je suis capable de créer une classe de cordes, quand tout ce que je veux, c'est stocker une chaîne?


la ligne RFC2898DRENDBYtes P = NOUVEAU RFC2898DERIVESBYTES (Passwordytes, Saltbytes); ne peut pas être compilé. Le paramètre Itérations est manquant (int). Quelles itérations signifie? Y a-t-il une valeur recommandée pour cela? BTW - tu as eu de moi vote.


@Ofir - merci. J'ai édité le code de sorte qu'il compile (il a été édité par quelqu'un d'autre qui l'a cassé, ou peut-être que l'API a changé). Je ne sais pas quels sont les arguments optimaux pour rfc2898derivebytes , mais j'ai ajouté un lien qui répond à cette question (pas numériquement, malheureusement). La valeur par défaut est de 1000.


@WOWSTAD - J'ai édité le code parce qu'il n'a pas compilé. J'ai utilisé le nombre d'itérations par défaut pour rfc2898derivebytes - ça va bien?


@Kobi Le problème avec l'API de Microsoft (Toute API) est qu'ils sont sous-spécifiés. Il est probablement préférable d'utiliser le mot de passe octet [], l'octet [] sel, int itérations constructeur (le nombre d'itérations a été manquant dans la réponse modifiée). Le problème est que avec l'API, il est impossible de connaître le codage du personnage pour le mot de passe, le sel. Idée va pour le nombre d'itérations par défaut. Pour tout type d'interopérabilité (peut-être même entre deux autres postes .NET) à l'aide des autres constructeurs est dangereux au mieux.



5
votes

serait plus cool si vous avez utilisé une clé privée pour signer l'élément et ajouter le résultat au fichier (dans un élément peut-être). Cela permettrait à chacun de lire le fichier XML au cas où votre support doit connaître le numéro de licence ou la date d'expiration, mais ils ne peuvent modifier aucune valeur sans la clé privée.

La clé publique nécessaire pour vérifier La signature serait une connaissance courante.

Clarification

Signature de votre code ne le protégera que contre les modifications, il ne conservera aucune information dedans cachés. Votre question initiale mentionne le cryptage, mais je ne suis pas sûr que ce soit une exigence de masquer les données ou de le protéger de la modification.

Exemple code: (Ne jamais publier privékey.key. ServerMethods n'est nécessaire que lorsque Signature du fichier XML, les méthodes client ne sont nécessaires que lors de la vérification du fichier XML.) xxx


1 commentaires

J'ai essayé deux échantillons de msdn mais..Le problème est que je peux l'obtenir pour décyctifier correctement sur une machine diff.



6
votes

Tout d'abord, si vous souhaitez utiliser la même clé pour le cryptage et le déchiffrement, vous devriez regarder cryptographie symétrique . La cryptographie asymétrique est lorsque les clés de cryptage et de déchiffrement sont différentes. Juste pour que vous sachiez - RSA est asymétrique, Tripledes et Rijndael sont symétriques. Il y en a d'autres aussi, mais .NET n'a pas d'implémentations par défaut pour eux.

Je conseillerais d'étudier l'espace de noms System.Security.Cryptography . Et apprendre un peu de tout ce genre de choses. Il vous suffit de chiffrer et de déchiffrer des fichiers, ainsi que de générer un mot de passe. En particulier, vous pourriez être intéressé par ces classes:

  • cryptostream
  • PasswordDeiveBytes
  • rijndaélanied

    Il existe également des exemples d'utilisation dans MSDN pour chacun d'eux. Vous pouvez utiliser ces classes pour chiffrer n'importe quel fichier, pas seulement XML. Si toutefois, vous souhaitez chiffrer simplement quelques éléments, vous pouvez consulter System.Security.Cryptography.xml Espace de noms. Je vois que vous avez déjà trouvé un article à ce sujet. Continuez à suivre les liens de cette page et vous en apprendrez plus sur ces classes.


0 commentaires