2009-04-20 3 views
3

Я намерен использовать TripleDES в одном из моих проектов. Я делал несколько экспериментов, чтобы им было удобно. Я понимаю, что размер блока triple DES равен 8 байтам, поэтому я предполагаю, что если дать 8 байт данных, я должен получить 8 байтов зашифрованных данных. Но я получаю:Размер зашифрованных данных при использовании Triple DES

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

Нормально ли это? Так оно и должно работать. Вот как я пытаюсь использовать тройной 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(); 
    } 
} 

ответ

10

TripleDESCryptoServiceProvider по умолчанию использует PKCS7-padding. Это накладывает любое сообщение на следующее кратное размеру блока.

Чтобы избежать использования отступов, просто установите Padding -property к PaddingMode.None

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

Большое спасибо. Ваше решение сработало. Я просто не понимаю реализации. Если заданный блок является точным, кратным блокам, он ничего не должен делать. Я думаю, любой здравомыслящий программист сделает это. – Hemant

+4

Обратимое заполнение необходимо добавить некоторые данные в открытый текст, чтобы сообщить, как его следует удалить. Таким образом, он должен будет расширить n * 8 байт до (n + 1) * 8 байтов. –

Смежные вопросы