6

AES暗号化(宿題)を実装しましたが、メッセージのパディングの問題に遭遇しました。

私のメッセージがそのようなバイトの配列である場合:

public byte[] encrypt(byte[] message) {
    int size = (int) Math.ceil(message.length / 16.0);
    byte[] result = new byte[size * 16];
    for (int i = 0; i < size; i++) {
        if ((i+1) * 16 > message.length){
            //padding here????
        } else {
            byte[] block = Arrays.copyOfRange(message, i * 16, (i + 1) * 16);
            byte[] encryptedBlock = encryptBlock(block);                
            System.arraycopy(encryptedBlock, 0, result, i*16, 16);
        }
    }
    return result;
}

どうすればそのようなメッセージを埋めることができますか?

各バイトがゼロになる可能性があるため、ゼロパディングを使用できません。また、末尾がゼロのメッセージに影響を与える可能性があります。

ここでもこれがどのように行われているのかについての言及は見つかりません(AES暗号化について説明している論文)

4

2 に答える 2

12

簡単なものから高度なものまで、使用できる方法はたくさんあります。ブルースシュナイアーは、2つのかなり単純な方法を提案しています。

1つは、最後のブロックをnバイトですべて値nで埋めることです。これは、AlexWienが提案したものです。これには問題があります(256バイト未満のブロックサイズへの制限を含む)。このパディングモードは、PKCS#7パディング(16バイトブロックの場合)またはPKCS#5パディング(8バイトブロックの場合)として知られています。

もう1つは、値が0x80のバイト(バイナリで値が1000 0000のバイト)の後に、最後のブロックを埋めるために必要な数のゼロバイトを追加することです。この方法はISOパディングと呼ばれ、ISO / IEC 9797-1パディング方法2の略です。パディング自体はビットレベルのパディングであり、1ビット値の1が追加され、ブロックに到達するまで0値のビットが追加されます。サイズ。

メッセージがパディングされているかどうかを知る方法については、メッセージは常にパディングされます。メッセージの最後のチャンクがブロック内に完全に収まっている場合でも(つまり、メッセージのサイズがブロックサイズの倍数である場合)、ダミーの最後のブロックを追加する必要があります。

より高度な方法のいくつかを研究することに興味がある場合は、ウィキペディアで暗号文を盗むと呼ばれる手法を調べてください:http: //en.wikipedia.org/wiki/Ciphertext_stealing

于 2012-11-26T20:38:10.420 に答える
0

パディングにはトリックがあります:

パディングの長さのバイト表現でパディングする必要があります。

333

また

4444

または999999999

その後、最初のパディングバイトを読み取ると、残りのバイト数がわかります。

于 2012-11-26T20:06:23.683 に答える