2017-10-27 3 views
1

TinyAES(https://github.com/kokke/tiny-AES-c/blob/master/aes.c)を見ていて、私が理解していないコードスニペットを見つけました。ポインタに16を追加しますか?

AES-128(16バイトのキーとブロックサイズを意味する)を仮定すると、forループが1回だけ反復するため、出力結果に0を16加算しないでしょうか?

メインのAES-CBC暗号化機能。

for (i = 0; i < 16; i += 16) 
    { 
    XorWithIv(input); 
    memcpy(output, input, BLOCKLEN); 
    state = (state_t*)output; 
    Cipher(); 
    Iv = output; 
    input += BLOCKLEN; 
    output += BLOCKLEN; 
    //printf("Step %d - %d", i/16, i); 
    } 
+0

ループボディは 'i'が' 0'の状態で一度だけ実行されるようです。 –

+1

この質問は、すでに部分的に、そして間違って、コード内の変数を置き換えているので、私たちを欺くものです。これはソースで見つかったコードではありません。 –

+0

@IngoBürk:はい、その理由をレポを参照し、すべてを説明しました。 – coderredoc

答えて

1

outputはポインタです。この場合、output+=16は、outputがゼロであることを意味することがあり、さらに悪いことに、それは外れている可能性があります。しかし、暗号化された出力の始まりを指す別のポインタを保存しておくべきです。

例:この例ではoutput

uint8_t buffer[32]={0}; 
uint8_t *output = buffer; 
... 
for(i = 0; i < 32; i += 16) 
{ 
    XorWithIv(input); 

    //changing output is the same as changing buffer from index i to i + BLOCKLEN 
    memcpy(output, input, BLOCKLEN); 

    state = (state_t*)output; 
    Cipher(); 
    Iv = output; 
    input += BLOCKLEN; 
    output += BLOCKLEN; //<== prepare to change the next block in buffer 
} 

二回変更されます。現在は範囲外のbuffer[32]を指しています。ただし、bufferは安全に暗号化された結果を保持しています。

1

これは、入力ないキーの長さです。キーの長さはマクロを使用して決定されます。

入力の長さが16である場合は、一度だけ実行されます。

resultの出力に16を加算していません。アルゴリズムを注意深くチェックしてください。

関連する問題