2010-12-21 4 views
3

J'ai un champ Byte [] qui est un contenu de fichier dont j'ai besoin pour crypter. Rien de spécial ou de fantaisie, juste assez pour s'assurer que la prochaine personne qui l'obtiendra ne sera pas capable de le décoder facilement sans effort. J'utiliserais le cryptage fourni avec .Net Framework 4.0, mais je n'ai absolument pas besoin de rendre le fichier plus grand que ce qu'il est.C# Byte [] Cryptage

Je pensais simplement à inverser le tableau ou à ajouter quelques octets à la fin ...?

Si je peux éviter de rendre le tableau beaucoup plus grand ce serait génial.

Des suggestions?

Merci!

+0

Pourquoi avez-vous besoin de ce cryptage? –

+0

ROT13? (min 15 caractères) –

+0

duplication possible de [Chiffrer/Décrypter la chaîne dans .NET] (http://stackoverflow.com/questions/202011/encrypt-decrypt-string-in-net) – Bobby

Répondre

10

L'ajout de 1-16 octets nuit-il? AES sera tamponné par défaut en utilisant la méthode ci-dessous:

private static void EncryptThenDecrypt() 
    { 
     byte[] message; // fill with your bytes 
     byte[] encMessage; // the encrypted bytes 
     byte[] decMessage; // the decrypted bytes - s/b same as message 
     byte[] key; 
     byte[] iv; 

     using (var rijndael = new RijndaelManaged()) 
     { 
      rijndael.GenerateKey(); 
      rijndael.GenerateIV(); 
      key = rijndael.Key; 
      iv = rijndael.IV; 
      encMessage = EncryptBytes(rijndael, message); 
     } 

     using (var rijndael = new RijndaelManaged()) 
     { 
      rijndael.Key = key; 
      rijndael.IV = iv; 
      decMessage = DecryptBytes(rijndael, encMessage); 
     } 
    } 

    private static byte[] EncryptBytes(
     SymmetricAlgorithm alg, 
     byte[] message) 
    { 
     if ((message == null) || (message.Length == 0)) 
     { 
      return message; 
     } 

     if (alg == null) 
     { 
      throw new ArgumentNullException("alg"); 
     } 

     using (var stream = new MemoryStream()) 
     using (var encryptor = alg.CreateEncryptor()) 
     using (var encrypt = new CryptoStream(stream, encryptor, CryptoStreamMode.Write)) 
     { 
      encrypt.Write(message, 0, message.Length); 
      encrypt.FlushFinalBlock(); 
      return stream.ToArray(); 
     } 
    } 

    private static byte[] DecryptBytes(
     SymmetricAlgorithm alg, 
     byte[] message) 
    { 
     if ((message == null) || (message.Length == 0)) 
     { 
      return message; 
     } 

     if (alg == null) 
     { 
      throw new ArgumentNullException("alg"); 
     } 

     using (var stream = new MemoryStream()) 
     using (var decryptor = alg.CreateDecryptor()) 
     using (var encrypt = new CryptoStream(stream, decryptor, CryptoStreamMode.Write)) 
     { 
      encrypt.Write(message, 0, message.Length); 
      encrypt.FlushFinalBlock(); 
      return stream.ToArray(); 
     } 
    } 
+0

Comment puis-je décrypter une fois qu'il est crypté? – ErocM

+0

Tout d'abord, gardez votre clé et IV à portée de main lorsque vous avez créé votre 'SymmetricAlgorithm'. Ensuite, utilisez la méthode 'DecryptBytes' que je suis sur le point de modifier la réponse à avoir. –

+0

Des trucs géniaux! Merci beaucoup! – ErocM

2

Ne pas inventer votre propre mécanisme de chiffrement (par exemple, sécurité par obfuscation), utilisez l'un des classes provided by the framework.

+1

Si j'ai des fichiers de tailles variées, cela ne changerait-il pas la taille du tableau, le rendant beaucoup plus grand que l'original? – ErocM

+0

Toute approche digne d'être faite va augmenter la taille du fichier. Quelle est la taille actuelle du fichier, une route que vous pourriez prendre est de simplement compresser le fichier. Vous n'aurez pas à annoncer ce que vous avez fait au fichier, cela n'augmenterait pas la taille du fichier, cela pourrait même diminuer la taille. –