2010-07-17 2 views
0

Dans ma situation, j'ai un certain nombre de fichiers qui seront stockés sur un serveur. Chacun de ces fichiers est créé par une application C# que j'écris.comment appeler RijndaelAlg.CreateEncryptor en C# correctement lors de l'enregistrement de nombreux fichiers indépendants

fond: Pour cette application, la quantité de temps nécessaire pour chiffrer isnt importante, les fichiers ont tendance à être petit et nous avons beaucoup de cycles CPU pour épargner (le client est le seul ordinateur qui encrypte ou décrypte les données).

Chaque fichier est sans rapport et j'ai besoin du contenu à protéger contre l'espionnage par le sysadmin ou toute personne qui met la main sur le disque dur (en supposant un mauvais gars)

ma compréhension est RijndaelAlg est un algorithme solide pour ce genre d'opération? En supposant que cette information est correcte, comment utiliser correctement la fonction RijndaelAlg.CreateEncryptor?

la facilité d'utilisation que je veux est pour mon utilisateur de saisir un mot de passe, supposer que le mot de passe est un bon mot de passe.

mes questions sont

  1. la meilleure façon de convertir une chaîne inputed utilisateur (C# « string) dans un octet []? Je suppose que je devrais hachage pour contourner le problème d'avoir des 0 sur tous les autres personnages? Quelle est la meilleure façon de faire cette conversion?

  2. Que dois-je utiliser pour l'intraveineuse? Je crois que c'est une valeur qui devrait être renseignée (même si MSDN dit qu'il est correct de passer 'null'). qu'est-ce que j'utilise pour cette valeur? Gardez à l'esprit pour ma situation J'ai un tas de fichiers indépendants qui doivent être décryptés indépendamment. Et si la IV est bien connue, est-ce un problème? (Puis-je utiliser un hash du nom de fichier car il s'agit d'une valeur unique)

  3. Y at-il un meilleur algorithme que RijndaelAlg pour crypter de nombreux fichiers indépendants en utilisant le même mot de passe?

Répondre

3

Q1. J'utilise généralement la méthode GetBytes() de la classe UTF8 pour convertir des chaînes en tableaux d'octets.

Encoding.UTF8.GetBytes(myString) 

Q2. Chaque fois que vous créez une instance de la classe RijndaelManaged, une IV est générée aléatoirement pour vous (accessible à l'aide de la propriété IV). Vous pouvez randomiser à nouveau en appelant la méthode GenerateIV(). Comme vous avez besoin de cette IV pour décrypter des données, il vaut mieux stocker cette IV quelque part au lieu d'avoir une IV unique par fichier. Si vous cryptez tous vos fichiers à l'aide d'une IV statique, veillez à définir l'IV lorsque vous créez une nouvelle instance de la classe RijndaelManaged chaque fois que vous déchiffrez un fichier.

Q3. RijndaelManaged/AES est l'algorithme le plus sûr, je n'utiliserais rien d'autre.

+2

N'essayez pas de coder la chaîne, utilisez PasswordDeriveBytes ou Rfc2898DeriveBytes. –

+0

Hmm, bon point car j'ai oublié que c'est pour crypter un mot de passe. –

+0

'PasswordDeriveBytes' est obsolète maintenant. Utilisez ['Rfc2898DeriveBytes.GetBytes'] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.getbytes.aspx) – Elmo

Questions connexes