3

私のプロジェクトの1つでTripleDESを使用するつもりです。私はそれに慣れるためにいくつかの実験をしていました。トリプルDESのブロックサイズは8バイトであることを理解しているので、8バイトのデータを提供する場合、8バイトの暗号化データを取得する必要があると思います。しかし、私が得るものは次のとおりです。

入力サイズ| 暗号化されたサイズ
。| 。
。| 。
6バイト| 8バイト
7バイト| 8バイト
8バイト| 16バイト
9バイト| 16バイト
。| 。
。| 。

正常ですか?それはそれが機能することになっている方法ですか?トリプル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 ();
    }
}

4

1 に答える 1

10

TripleDESCryptoServiceProviderは、デフォルトでPKCS7-paddingを使用します。これにより、メッセージがブロックサイズの次の倍数に埋め込まれます。

パディングの使用を避けるには、Padding-propertyをに設定するだけです。PaddingMode.None

new TripleDESCryptoServiceProvider { 
  KeySize = keySizeInBits, 
  Padding = PaddingMode.None 
};
于 2009-04-20T08:41:15.580 に答える