Размер зашифрованных данных при использовании Triple DES - PullRequest
3 голосов
/ 20 апреля 2009

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

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

Это нормально? Так ли это должно работать? Вот как я пытаюсь использовать тройной DES:

</p> <pre><code>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 (); } }

1 Ответ

10 голосов
/ 20 апреля 2009

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

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

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