2012-01-07 4 views
0

Voilà donc comment je fais le cryptage en ce moment:Accélération de cryptage

public static byte[] Encrypt(byte[] Data, string Password, string Salt) 
     { 
      char[] converter = Salt.ToCharArray(); 
      byte[] salt = new byte[converter.Length]; 
      for (int i = 0; i < converter.Length; i++) 
      { 
       salt[i] = (byte)converter[i]; 
      } 

      PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, salt); 
      MemoryStream ms = new MemoryStream(); 
      Aes aes = new AesManaged(); 
      aes.Key = pdb.GetBytes(aes.KeySize/8); 
      aes.IV = pdb.GetBytes(aes.BlockSize/8); 
      CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write); 

      cs.Write(Data, 0, Data.Length); 
      cs.Close(); 

      return ms.ToArray(); 
     } 

J'utilise cet algorithme sur des données en streaming sur un réseau. Le problème est que c'est un peu lent pour ce que j'essaie de faire. Donc, je me demandais si quelqu'un a une meilleure façon de le faire? Je ne suis pas un expert en cryptage cette méthode a été reconstituée à partir de différentes sources. Je ne suis pas entièrement sûr de comment cela fonctionne.

Je l'ai cadencé à environ 0.5-1.5ms et je dois descendre à environ 0.1ms toutes les idées?

+0

Sur combien de données? – rsaxvc

+1

Vous voulez ignorer les éléments gérés alors. Essayez plutôt les chiffrements natifs. – leppie

+0

@ rsaxvc Pas beaucoup de données. la taille moyenne des paquets est d'environ 20 octets. Les temps mesurés étaient sur un paquet de 6 octets. @ leppie Que voulez-vous dire chiffrements natifs? Googling, il n'a pas beaucoup avec. – Axis

Répondre

4

Je suis assez sûr que la performance est le moindre de vos problèmes ici.

Le sel est-il réutilisé pour chaque paquet? Si c'est le cas, vous utilisez un chiffre fort de manière faible. Vous démarrez chaque paquet avec le chiffrement exactement dans le même état. C'est un défaut de sécurité. Quelqu'un de qualifié en cryptographie serait capable de casser votre cryptage après seulement quelques milliers de paquets.

Je suppose que vous envoyez un flux de paquets au même destinataire. Dans ce cas, votre utilisation d'AES sera beaucoup plus forte si vous gardez l'objet Aes et le réutilisez. Cela rendra votre utilisation du chiffre beaucoup plus forte et accélérera grandement les choses. En ce qui concerne la question de performance, la plus grande partie de votre temps est consacrée à l'initialisation du chiffrage. Si vous ne le réinitialisez pas à chaque fois, vous accélérerez beaucoup.

+0

droite ré-initialiser c'était le problème. Merci pour les conseils de sécurité que je vais changer cela maintenant. – Axis

+0

Juste testé dehors et maintenant je reçois 10microsecondes. Merci pour l'aide. – Axis

+0

N'est-ce pas beaucoup plus lent que ce que vous avez commencé? Ou est-ce que je manque quelque chose? –

0

aes.KeySize>>3 serait plus rapide que aes.KeySize/8.

+2

Vous réalisez 'sizeof (char)! = Sizeof (byte)'? – leppie

+0

Ma faute, j'ai oublié unicode, je ne fais pas beaucoup .NET. Je suppose que si vous avez besoin d'un tableau d'octets ou d'une chaîne ansi pour crypter alors vous pourriez envisager de passer cela dans la fonction, se débarrasser de la conversion C# en octets permettrait d'économiser beaucoup de temps. – Motes

+0

le problème est plus dans le pdb PasswordDeriveBytes à CryptoStream cs = new. Le code que vous modifiez déjà s'exécute en environ 10 microsecondes – Axis