現状動作している以下のプログラムを用いて異なるハードで動作させようとしているのですが
以下の処理の動作が理解できず困っておりますのでお助けください。
不明点(以下ソースコードに番号を振ってあります。)
①について
word_typeという構造体を wという名前で44個作るという意味であっていますでしょうか?
4*(10+1) はシンプルに4×11=44と考えてよろしかったでしょうか?
②について
dataには16個しかデータは入っていないのですがdata[4*i+3]この記述だとiが3の時
data[24]となり参照できないのではと考えているのですが合っていますでしょうか?
③について
①と同様に44回繰り返すと考えてよろしいでしょうか?
④について
tmp→tmpへの値の入れ替えをしているように見えますが
これには意味があるのでしょうか?この関数を通ってもtmpの値は変わらないのでは?
⑤について
「^」は何を意味しているのでしょうか?
無知で申し訳ありません。
分かるところだけでも教えていただければと思います。
よろしくお願いします。
以下ソースコード抜粋
C++
1 byte data[16] ={0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23}; 2 3struct word_type { 4 byte b[4]; 5} ; 6struct word_type w[4*(10+1)] ;//・・・・・① 7 8void Expansion(byte data[], struct word_type w[]) 9{ 10 struct word_type tmp; 11 byte i; 12 13 i = 0; 14 while (i < 4) 15 { 16 w[i].b[0] = data[4*i] ;//・・・・・・② 17 w[i].b[1] = data[4*i+1];//・・・・・② 18 w[i].b[2] = data[4*i+2];//・・・・・② 19 w[i].b[3] = data[4*i+3];//・・・・・② 20 i = i+1; 21 } 22 23 i = 4; 24 while (i < (4 * (10+1))) ・・・・③ 25 { 26 tmp.b[0] = w[i-1].b[0]; 27 tmp.b[1] = w[i-1].b[1]; 28 tmp.b[2] = w[i-1].b[2]; 29 tmp.b[3] = w[i-1].b[3]; 30 31 if (i % 4 == 0) { 32 RWord(tmp,tmp);//・・・・・④ 33 SWord(tmp,tmp); 34 XWord( tmp, Rcon[i/4], tmp); 35 } 36 XWord(w[i-4], tmp, w[i]); 37 i = i + 1; 38 } 39 40} 41 42 43void RWord(struct word_type w, struct word_type s) 44{ 45 struct word_type result; 46 result.b[0] = w.b[1] ; 47 result.b[1] = w.b[2] ; 48 result.b[2] = w.b[3] ; 49 result.b[3] = w.b[0] ; 50 51 s.b[0] = result.b[0] ; 52 s.b[1] = result.b[1] ; 53 s.b[2] = result.b[2] ; 54 s.b[3] = result.b[3] ; 55} 56 57void XWord( struct word_type w1, struct word_type w2, struct word_type s ) 58{ 59 struct word_type result; 60 result.b[0] = w1.b[0] ^ w2.b[0] ;// ・・・・⑤ 61 result.b[1] = w1.b[1] ^ w2.b[1] ;// ・・・・⑤ 62 result.b[2] = w1.b[2] ^ w2.b[2] ;// ・・・・⑤ 63 result.b[3] = w1.b[3] ^ w2.b[3] ;// ・・・・⑤ 64 65 s.b[0] = result.b[0] ; 66 s.b[1] = result.b[1] ; 67 s.b[2] = result.b[2] ; 68 s.b[3] = result.b[3] ; 69} 70 71 72 73byte SByte(byte b){ return Sbox[b]; } 74 75byte Sbox[256] = {ここにはバラバラの数字が256個16進数で格納されています} 76 77void SWord(struct word_type w, struct word_type o ) 78{ 79 struct word_type result; 80 result.b[0] = SByte(w.b[0]) ; 81 result.b[1] = SByte(w.b[1]) ; 82 result.b[2] = SByte(w.b[2]) ; 83 result.b[3] = SByte(w.b[3]) ; 84 85 o.b[0] = result.b[0] ; 86 o.b[1] = result.b[1] ; 87 o.b[2] = result.b[2] ; 88 o.b[3] = result.b[3] ; 89} 90コード