1

I'm trying to implement this question i asked in the past Securely Encrypt 64bits w/o per element overhead?

In the immediate window i entered TripleDES.Create().LegalBlockSizes.First() and got

{System.Security.Cryptography.KeySizes}
    MaxSize: 64
    MinSize: 64
    SkipSize: 0

64bits/8bits per byte is 8bytes. Exactly what length a long is. Anyways i run it through the code below and the exception throws. The length of the block is 16bytes. Not what i want to have... I would ask how to change it to 64bits but as the results say the min and max are both 64bits so why am i getting 128bits instead??

long enc(long v, byte[] iv)
{
    using (var m = new MemoryStream())
    {
        using (var c = des.CreateEncryptor(des.Key, iv))
        using (var s = new CryptoStream(m, c, CryptoStreamMode.Write))
        {
            var b = BitConverter.GetBytes(v);
            s.Write(b, 0, b.Length);
        }
        m.Flush();
        var arr = m.ToArray();
        if(arr.Length!=8)
            throw new Exception();
        return BitConverter.ToInt64(arr, 0);
    }
}
4

1 に答える 1

2

これはパディングによるものだと思います。.NETFrameworkの対称暗号のデフォルトのパディングモードはPKCS7です。

PKCS#7パディング文字列は一連のバイトで構成され、各バイトは追加されたパディングバイトの総数に等しくなります。

行を追加する場合:

des.Padding = PaddingMode.None;

残りの暗号化コードの前に、配列の長さが8バイトになっていることがわかります。もちろん、これは、暗号化されるプレーンテキストがブロック長で正確に割り切れることを確認する必要があることを意味します。

また、とにかくさらに8バイトのIVを送信する必要があります。IVは再利用しないでください。そのため、プレーンテキストと比較してストレージ/送信のサイズが2倍になります。


パディング

暗号ブロック連鎖(CBC)モードは、一般的なブロック暗号モードの操作です。長さがブロックサイズの倍数(通常は8または16バイト)であるメッセージが必要なため、メッセージをこの長さにするには、メッセージをパディングする必要があります。1つの方法は、最後のブロックに1ビットとそれに続く0ビットを入力することです。入力がたまたまブロック全体を埋め尽くした場合、パディングに対応するために「ダミーブロック」が追加されます。そうしないと、入力平文の終わりがパディングとして誤って解釈される可能性があります。

(強調が追加されました。CBCは.NET Frameworkの暗号のデフォルトモードです)

于 2012-08-09T06:11:48.210 に答える