2009-04-20 6 views
3

J'ai l'intention d'utiliser TripleDES dans l'un de mes projets. Je faisais des expériences pour être à l'aise avec ça. Je comprends que la taille de bloc de triple DES est de 8 octets, donc je suppose que si donne 8 octets de données, je devrais obtenir 8 octets de données cryptées. Mais ce que je reçois est:Taille des données cryptées lors de l'utilisation de Triple DES

 
Input Size | Encrypted Size 
.   | . 
.   | . 
6 bytes  | 8 bytes 
7 bytes  | 8 bytes 
8 bytes  | 16 bytes 
9 bytes  | 16 bytes 
.   | . 
.   | . 

Est-ce normal? Est-ce la façon dont il est censé fonctionner? Voici comment je suis en train d'utiliser le triple DES:

class TripleDESEncryption 
{ 
    private readonly TripleDESCryptoServiceProvider engine; 

    public TripleDESEncryption() : this (256) { } 

    public TripleDESEncryption (int keySizeInBits) { 
     engine = new TripleDESCryptoServiceProvider { KeySize = keySizeInBits }; 
     engine.GenerateKey(); 
    } 

    public byte[] Encrypt (byte[] plain) { 
     return engine.CreateEncryptor().TransformFinalBlock (plain, 0, plain.Length); 
    } 

    public byte[] Decrypt (byte[] encrypted) { 
     return engine.CreateDecryptor().TransformFinalBlock (encrypted, 0, encrypted.Length); 
    } 
} 

class Program 
{ 
    static readonly int MAX_TEXT_LENGTH = 128; 

    static void Main (string[] args) { 
     Console.WriteLine ("{0,10}{1,10}{2,10}{3,10}", "Algo", "Key Size", "Input Size", "Encrypted Size"); 

     var tripleDES = new TripleDESEncryption(); 
     var input = new List<byte>(); 

     for (int i = 0; i <= MAX_TEXT_LENGTH; i++) { 
      var plain = input.ToArray(); 
      var encrypted = tripleDES.Encrypt (plain); 
      Console.WriteLine ("{0,10}{1,10}{2,10}{3,10}", "Triple DES", keySize, input.Count, encrypted.Length); 
      input.Add (0x65); 
     } 

     Console.ReadLine(); 
    } 
} 

Répondre

10

par défaut TripleDESCryptoServiceProvider à l'aide PKCS7-padding. Ceci remplit n'importe quel message au multiple suivant de la taille de bloc.

Pour éviter d'utiliser le rembourrage, situé juste à la Padding -property à PaddingMode.None

new TripleDESCryptoServiceProvider { 
    KeySize = keySizeInBits, 
    Padding = PaddingMode.None 
}; 
+0

Merci beaucoup. Votre solution a fonctionné. Je ne comprends tout simplement pas la mise en œuvre. Si le bloc donné est un multiple exact de blocksize, il ne doit rien bourrer. Je suppose que n'importe quel programmeur sain d'esprit le ferait. – Hemant

+4

Un remplissage réversible doit ajouter des données au texte en clair pour communiquer comment il doit être supprimé. Il faudra donc étendre n * 8 octets à (n + 1) * 8 octets. –

Questions connexes