0

学校のプロジェクトに AES を実装しています。メッセージとして uint8_t の 1 次元配列 (長さ 16) を受け入れる関数 aes_block があります。このメッセージをその場で暗号化したいと思います。最初のステップは、バイト in[0]、in[1]、... in[15] を 2 次元状態配列 s[0,0]、s[1,0]、s[2、 0]、s[3,0]、s[0,1]、...、s[3,3]、FIPS 197 で指定されています。

void aes_block(int keylen, const uint8_t *key, uint8_t *msg){
    uint8_t state[4][4] = msg;
    ...
}

state[col][row] によって状態配列にインデックスを付けることができます。これにより、「無効な初期化子」というコンパイラ エラーが発生しました。どうすればやろうとしていることを達成できますか?

4

3 に答える 3

1

これに対する一般的な解決策は、配列を別の方法でアドレス指定することです。

の代わりにarr[i][j]、 を使用できますarr[i*4+j]。最終結果は同じですが、配列を 2 次元配列にコピーする必要はありません。

于 2013-10-18T19:20:20.920 に答える
1
uint8_t (*state)[4] = (uint8_t (*)[4]) msg;

説明:

msgのバイトをの 4 行 4 列の配列として再解釈したいとしますuint8_tstateこれを使用して、そのような配列へのポインターになるように定義できます。

uint8_t (*state)[4][4] = (uint8_t (*)[4][4]) msg;

ただし、その場合、配列の要素に でアクセスする必要があります(*state)[i][j]

代わりに、C は通常、配列をその最初の要素へのポインターに変換することを認識しているだけです。これにより、配列のインデックス付けが適切に機能します。したがって、それを模倣して自分で変換を行いstateます。配列の配列の最初の要素へのポインターであることを宣言します。したがって、stateは 4 つの最初の配列へのポインターuint8_tです。次にstate、通常の配列が使用される方法で使用できますstate[i][j]。i 番目の配列の j 番目の要素です。


注:uint8_tが文字型である場合は、主流のハードウェアのすべての通常の C 実装と同様に、この再解釈は C 標準によって定義されています。

于 2013-10-18T19:56:07.800 に答える