AES Encryption: [1][1] and [1][2] in Round 1, [1][1] in Round 2 erronous, the rest is correct -


i trying implement aes cipher according specification: http://techheap.packetizer.com/cryptography/encryption/spec.v36.pdf

according example (page 20 onwards) results state after mixcolumns rounds 1 , 2 erronous:

round 1 after mixcolumns

example state   state 04 e0 48 28     04 e0 48 28 66 cb f8 06     66 60 f8 06< 81 19 d3 26     81 28 d3 26< e5 9a 7a 4c     e5 9a 7a 4c                    ^^ 

if correct 2 different bytes , go on calculate round 2 [1][1] still incorrect whereas [1][2] correct:

example state   state 58 1b db 1b     58 1b db 1b 4d 4b e7 6b     4d 17 e7 6b< ca 5a ca b0     ca 5a ca b0 f1 ac a8 e5     f1 ac a8 e5                    ^^ 

if again correct [1][1] , continue calculating state after mixcolumns round 3 identical example.

these mix-column values [1][1] [1][2] in round 1:

ffmul(2, t[1] = b4) = d8 ffmul(3, t[(1 + 1) % 4] = t[2] = 52) = f6 t[(1 + 2) % 4] = t[3] = ae t[(1 + 3) % 4] = t[0] = e0 => 60  ffmul(2, t[2] = 52) = 95 ffmul(3, t[(2 + 1) % 4] = t[3] = ae) = e9 t[(2 + 2) % 4] = t[0] = e0 t[(2 + 3) % 4] = t[1] = b4 => 28 

and here mix-column values [1][1] in round 3:

ffmul(2, t[1] = 39) = 2e ffmul(3, t[(1 + 1) % 4] = t[2] = 53) = f5 t[(1 + 2) % 4] = t[3] = 89 t[(1 + 3) % 4] = t[0] = 45 

i not seeing obvious reason, sourcecode (key expansion not yet implented therefore round-keys hardcoded):

public class tester {      public static final byte[][] logtable = new byte[][] {           {(byte) 0x00, (byte) 0x00, (byte) 0x19, (byte) 0x01, (byte) 0x32, (byte) 0x02, (byte) 0x1a, (byte) 0xc6,          (byte) 0x4b, (byte) 0xc7, (byte) 0x1b, (byte) 0x68, (byte) 0x33, (byte) 0xee, (byte) 0xdf, (byte) 0x03},         {(byte) 0x64, (byte) 0x04, (byte) 0xe0, (byte) 0x0e, (byte) 0x34, (byte) 0x8d, (byte) 0x81, (byte) 0xef,          (byte) 0x4c, (byte) 0x71, (byte) 0x08, (byte) 0xc8, (byte) 0xf8, (byte) 0x69, (byte) 0x1c, (byte) 0xc1},         {(byte) 0x7d, (byte) 0xc2, (byte) 0x1d, (byte) 0xb5, (byte) 0xf9, (byte) 0xb9, (byte) 0x27, (byte) 0x6a,          (byte) 0x4d, (byte) 0xe4, (byte) 0xa6, (byte) 0x72, (byte) 0x9a, (byte) 0xc9, (byte) 0x09, (byte) 0x78},         {(byte) 0x65, (byte) 0x2f, (byte) 0x8a, (byte) 0x05, (byte) 0x21, (byte) 0x0f, (byte) 0xe1, (byte) 0x24,          (byte) 0x12, (byte) 0xf0, (byte) 0x82, (byte) 0x45, (byte) 0x35, (byte) 0x93, (byte) 0xda, (byte) 0x8e},         {(byte) 0x96, (byte) 0x8f, (byte) 0xdb, (byte) 0xbd, (byte) 0x36, (byte) 0xd0, (byte) 0xce, (byte) 0x94,          (byte) 0x13, (byte) 0x5c, (byte) 0xd2, (byte) 0xf1, (byte) 0x40, (byte) 0x46, (byte) 0x83, (byte) 0x38},         {(byte) 0x66, (byte) 0xdd, (byte) 0xfd, (byte) 0x30, (byte) 0xbf, (byte) 0x06, (byte) 0x8b, (byte) 0x62,          (byte) 0xb3, (byte) 0x25, (byte) 0xe2, (byte) 0x98, (byte) 0x22, (byte) 0x88, (byte) 0x91, (byte) 0x10},         {(byte) 0x7e, (byte) 0x6e, (byte) 0x48, (byte) 0xc3, (byte) 0xa3, (byte) 0xb6, (byte) 0x1e, (byte) 0x42,          (byte) 0x3a, (byte) 0x6b, (byte) 0x28, (byte) 0x54, (byte) 0xfa, (byte) 0x85, (byte) 0x3d, (byte) 0xba},         {(byte) 0x2b, (byte) 0x79, (byte) 0x0a, (byte) 0x15, (byte) 0x9b, (byte) 0x9f, (byte) 0x5e, (byte) 0xca,          (byte) 0x4e, (byte) 0xd4, (byte) 0xac, (byte) 0xe5, (byte) 0xf3, (byte) 0x73, (byte) 0xa7, (byte) 0x57},         {(byte) 0xaf, (byte) 0x58, (byte) 0xa8, (byte) 0x50, (byte) 0xf4, (byte) 0xea, (byte) 0xd6, (byte) 0x74,          (byte) 0x4f, (byte) 0xae, (byte) 0xe9, (byte) 0xd5, (byte) 0xe7, (byte) 0xe6, (byte) 0xad, (byte) 0xe8},         {(byte) 0x2c, (byte) 0xd7, (byte) 0x75, (byte) 0x7a, (byte) 0xeb, (byte) 0x16, (byte) 0x0b, (byte) 0xf5,          (byte) 0x59, (byte) 0xcb, (byte) 0x5f, (byte) 0xb0, (byte) 0x9c, (byte) 0xa9, (byte) 0x51, (byte) 0xa0},         {(byte) 0x7f, (byte) 0x0c, (byte) 0xf6, (byte) 0x6f, (byte) 0x17, (byte) 0xc4, (byte) 0x49, (byte) 0xec,          (byte) 0xd8, (byte) 0x43, (byte) 0x1f, (byte) 0x2d, (byte) 0xa4, (byte) 0x76, (byte) 0x7b, (byte) 0xb7},         {(byte) 0xcc, (byte) 0xbb, (byte) 0x3e, (byte) 0x5a, (byte) 0xfb, (byte) 0x60, (byte) 0xb1, (byte) 0x86,          (byte) 0x3b, (byte) 0x52, (byte) 0xa1, (byte) 0x6c, (byte) 0xaa, (byte) 0x55, (byte) 0x29, (byte) 0x9d},         {(byte) 0x97, (byte) 0xb2, (byte) 0x87, (byte) 0x90, (byte) 0x61, (byte) 0xbe, (byte) 0xdc, (byte) 0xfc,          (byte) 0xbc, (byte) 0x95, (byte) 0xcf, (byte) 0xcd, (byte) 0x37, (byte) 0x3f, (byte) 0x5b, (byte) 0xd1},         {(byte) 0x53, (byte) 0x39, (byte) 0x84, (byte) 0x3c, (byte) 0x41, (byte) 0xa2, (byte) 0x6d, (byte) 0x47,          (byte) 0x14, (byte) 0x2a, (byte) 0x9e, (byte) 0x5d, (byte) 0x56, (byte) 0xf2, (byte) 0xd3, (byte) 0xab},         {(byte) 0x44, (byte) 0x11, (byte) 0x92, (byte) 0xd9, (byte) 0x23, (byte) 0x20, (byte) 0x2e, (byte) 0x89,          (byte) 0xb4, (byte) 0x7c, (byte) 0xb8, (byte) 0x26, (byte) 0x77, (byte) 0x99, (byte) 0xe3, (byte) 0xa5},         {(byte) 0x67, (byte) 0x4a, (byte) 0xed, (byte) 0xde, (byte) 0xc5, (byte) 0x31, (byte) 0xfe, (byte) 0x18,          (byte) 0x0d, (byte) 0x63, (byte) 0x8c, (byte) 0x80, (byte) 0xc0, (byte) 0xf7, (byte) 0x70, (byte) 0x07}     };      public static final byte[][] powtable = new byte[][] {         {(byte) 0x01, (byte) 0x03, (byte) 0x05, (byte) 0x0f, (byte) 0x11, (byte) 0x33, (byte) 0x55, (byte) 0xff,          (byte) 0x1a, (byte) 0x2e, (byte) 0x72, (byte) 0x96, (byte) 0xa1, (byte) 0xf8, (byte) 0x13, (byte) 0x35},         {(byte) 0x5f, (byte) 0xe1, (byte) 0x38, (byte) 0x48, (byte) 0xd8, (byte) 0x73, (byte) 0x95, (byte) 0xa4,          (byte) 0xf7, (byte) 0x02, (byte) 0x06, (byte) 0x0a, (byte) 0x1e, (byte) 0x22, (byte) 0x66, (byte) 0xaa},         {(byte) 0xe5, (byte) 0x34, (byte) 0x5c, (byte) 0xe4, (byte) 0x37, (byte) 0x59, (byte) 0xeb, (byte) 0x26,          (byte) 0x6a, (byte) 0xbe, (byte) 0xd9, (byte) 0x70, (byte) 0x90, (byte) 0xab, (byte) 0xe6, (byte) 0x31},         {(byte) 0x53, (byte) 0xf5, (byte) 0x04, (byte) 0x0c, (byte) 0x14, (byte) 0x3c, (byte) 0x44, (byte) 0xcc,          (byte) 0x4f, (byte) 0xd1, (byte) 0x68, (byte) 0xb8, (byte) 0xd3, (byte) 0x6e, (byte) 0xb2, (byte) 0xcd},         {(byte) 0x4c, (byte) 0xd4, (byte) 0x67, (byte) 0xa9, (byte) 0xe0, (byte) 0x3b, (byte) 0x4d, (byte) 0xd7,          (byte) 0x62, (byte) 0xa6, (byte) 0xf1, (byte) 0x08, (byte) 0x18, (byte) 0x28, (byte) 0x78, (byte) 0x88},         {(byte) 0x83, (byte) 0x9e, (byte) 0xb9, (byte) 0xd0, (byte) 0x6b, (byte) 0xbd, (byte) 0xdc, (byte) 0x7f,          (byte) 0x81, (byte) 0x98, (byte) 0xb3, (byte) 0xce, (byte) 0x49, (byte) 0xdb, (byte) 0x76, (byte) 0x9a},         {(byte) 0xb5, (byte) 0xc4, (byte) 0x57, (byte) 0xf9, (byte) 0x10, (byte) 0x30, (byte) 0x50, (byte) 0xf0,          (byte) 0x0b, (byte) 0x1d, (byte) 0x27, (byte) 0x69, (byte) 0xbb, (byte) 0xd6, (byte) 0x61, (byte) 0xa3},         {(byte) 0xfe, (byte) 0x19, (byte) 0x2b, (byte) 0x7d, (byte) 0x87, (byte) 0x92, (byte) 0xad, (byte) 0xec,          (byte) 0x2f, (byte) 0x71, (byte) 0x93, (byte) 0xae, (byte) 0xe9, (byte) 0x20, (byte) 0x60, (byte) 0xa0},         {(byte) 0xfb, (byte) 0x16, (byte) 0x3a, (byte) 0x4e, (byte) 0xd2, (byte) 0x6d, (byte) 0xb7, (byte) 0xc2,          (byte) 0x5d, (byte) 0xe7, (byte) 0x32, (byte) 0x56, (byte) 0xfa, (byte) 0x15, (byte) 0x3f, (byte) 0x41},         {(byte) 0xc3, (byte) 0x5e, (byte) 0xe2, (byte) 0x3d, (byte) 0x47, (byte) 0xc9, (byte) 0x40, (byte) 0xc0,          (byte) 0x5b, (byte) 0xed, (byte) 0x2c, (byte) 0x74, (byte) 0x9c, (byte) 0xbf, (byte) 0xda, (byte) 0x75},         {(byte) 0x9f, (byte) 0xba, (byte) 0xd5, (byte) 0x64, (byte) 0xac, (byte) 0xef, (byte) 0x2a, (byte) 0x7e,          (byte) 0x82, (byte) 0x9d, (byte) 0xbc, (byte) 0xdf, (byte) 0x7a, (byte) 0x8e, (byte) 0x89, (byte) 0x80},         {(byte) 0x9b, (byte) 0xb6, (byte) 0xc1, (byte) 0x58, (byte) 0xe8, (byte) 0x23, (byte) 0x65, (byte) 0xaf,          (byte) 0xea, (byte) 0x25, (byte) 0x6f, (byte) 0xb1, (byte) 0xc8, (byte) 0x43, (byte) 0xc5, (byte) 0x54},         {(byte) 0xfc, (byte) 0x1f, (byte) 0x21, (byte) 0x63, (byte) 0xa5, (byte) 0xf4, (byte) 0x07, (byte) 0x09,          (byte) 0x1b, (byte) 0x2d, (byte) 0x77, (byte) 0x99, (byte) 0xb0, (byte) 0xcb, (byte) 0x46, (byte) 0xca},         {(byte) 0x45, (byte) 0xcf, (byte) 0x4a, (byte) 0xde, (byte) 0x79, (byte) 0x8b, (byte) 0x86, (byte) 0x91,          (byte) 0xa8, (byte) 0xe3, (byte) 0x3e, (byte) 0x42, (byte) 0xc6, (byte) 0x51, (byte) 0xf3, (byte) 0x0e},         {(byte) 0x12, (byte) 0x36, (byte) 0x5a, (byte) 0xee, (byte) 0x29, (byte) 0x7b, (byte) 0x8d, (byte) 0x8c,          (byte) 0x8f, (byte) 0x8a, (byte) 0x85, (byte) 0x94, (byte) 0xa7, (byte) 0xf2, (byte) 0x0d, (byte) 0x17},         {(byte) 0x39, (byte) 0x4b, (byte) 0xdd, (byte) 0x7c, (byte) 0x84, (byte) 0x97, (byte) 0xa2, (byte) 0xfd,          (byte) 0x1c, (byte) 0x24, (byte) 0x6c, (byte) 0xb4, (byte) 0xc7, (byte) 0x52, (byte) 0xf6, (byte) 0x01}       };      public static final byte[][] substitutiontable = new byte[][] {         {(byte) 0x63, (byte) 0x7c, (byte) 0x77, (byte) 0x7b, (byte) 0xf2, (byte) 0x6b, (byte) 0x6f, (byte) 0xc5,          (byte) 0x30, (byte) 0x01, (byte) 0x67, (byte) 0x2b, (byte) 0xfe, (byte) 0xd7, (byte) 0xab, (byte) 0x76},         {(byte) 0xca, (byte) 0x82, (byte) 0xc9, (byte) 0x7d, (byte) 0xfa, (byte) 0x59, (byte) 0x47, (byte) 0xf0,          (byte) 0xad, (byte) 0xd4, (byte) 0xa2, (byte) 0xaf, (byte) 0x9c, (byte) 0xa4, (byte) 0x72, (byte) 0xc0},         {(byte) 0xb7, (byte) 0xfd, (byte) 0x93, (byte) 0x26, (byte) 0x36, (byte) 0x3f, (byte) 0xf7, (byte) 0xcc,          (byte) 0x34, (byte) 0xa5, (byte) 0xe5, (byte) 0xf1, (byte) 0x71, (byte) 0xd8, (byte) 0x31, (byte) 0x15},         {(byte) 0x04, (byte) 0xc7, (byte) 0x23, (byte) 0xc3, (byte) 0x18, (byte) 0x96, (byte) 0x05, (byte) 0x9a,          (byte) 0x07, (byte) 0x12, (byte) 0x80, (byte) 0xe2, (byte) 0xeb, (byte) 0x27, (byte) 0xb2, (byte) 0x75},         {(byte) 0x09, (byte) 0x83, (byte) 0x2c, (byte) 0x1a, (byte) 0x1b, (byte) 0x6e, (byte) 0x5a, (byte) 0xa0,          (byte) 0x52, (byte) 0x3b, (byte) 0xd6, (byte) 0xb3, (byte) 0x29, (byte) 0xe3, (byte) 0x2f, (byte) 0x84},         {(byte) 0x53, (byte) 0xd1, (byte) 0x00, (byte) 0xed, (byte) 0x20, (byte) 0xfc, (byte) 0xb1, (byte) 0x5b,          (byte) 0x6a, (byte) 0xcb, (byte) 0xbe, (byte) 0x39, (byte) 0x4a, (byte) 0x4c, (byte) 0x58, (byte) 0xcf},         {(byte) 0xd0, (byte) 0xef, (byte) 0xaa, (byte) 0xfb, (byte) 0x43, (byte) 0x4d, (byte) 0x33, (byte) 0x85,          (byte) 0x45, (byte) 0xf9, (byte) 0x02, (byte) 0x7f, (byte) 0x50, (byte) 0x3c, (byte) 0x9f, (byte) 0xa8},         {(byte) 0x51, (byte) 0xa3, (byte) 0x40, (byte) 0x8f, (byte) 0x92, (byte) 0x9d, (byte) 0x38, (byte) 0xf5,          (byte) 0xbc, (byte) 0xb6, (byte) 0xda, (byte) 0x21, (byte) 0x10, (byte) 0xff, (byte) 0xf3, (byte) 0xd2},         {(byte) 0xcd, (byte) 0x0c, (byte) 0x13, (byte) 0xec, (byte) 0x5f, (byte) 0x97, (byte) 0x44, (byte) 0x17,          (byte) 0xc4, (byte) 0xa7, (byte) 0x7e, (byte) 0x3d, (byte) 0x64, (byte) 0x5d, (byte) 0x19, (byte) 0x73},         {(byte) 0x60, (byte) 0x81, (byte) 0x4f, (byte) 0xdc, (byte) 0x22, (byte) 0x2a, (byte) 0x90, (byte) 0x88,          (byte) 0x46, (byte) 0xee, (byte) 0xb8, (byte) 0x14, (byte) 0xde, (byte) 0x5e, (byte) 0x0b, (byte) 0xdb},         {(byte) 0xe0, (byte) 0x32, (byte) 0x3a, (byte) 0x0a, (byte) 0x49, (byte) 0x06, (byte) 0x24, (byte) 0x5c,          (byte) 0xc2, (byte) 0xd3, (byte) 0xac, (byte) 0x62, (byte) 0x91, (byte) 0x95, (byte) 0xe4, (byte) 0x79},         {(byte) 0xe7, (byte) 0xc8, (byte) 0x37, (byte) 0x6d, (byte) 0x8d, (byte) 0xd5, (byte) 0x4e, (byte) 0xa9,          (byte) 0x6c, (byte) 0x56, (byte) 0xf4, (byte) 0xea, (byte) 0x65, (byte) 0x7a, (byte) 0xae, (byte) 0x08},         {(byte) 0xba, (byte) 0x78, (byte) 0x25, (byte) 0x2e, (byte) 0x1c, (byte) 0xa6, (byte) 0xb4, (byte) 0xc6,          (byte) 0xe8, (byte) 0xdd, (byte) 0x74, (byte) 0x1f, (byte) 0x4b, (byte) 0xbd, (byte) 0x8b, (byte) 0x8a},         {(byte) 0x70, (byte) 0x3e, (byte) 0xb5, (byte) 0x66, (byte) 0x48, (byte) 0x03, (byte) 0xf6, (byte) 0x0e,          (byte) 0x61, (byte) 0x35, (byte) 0x57, (byte) 0xb9, (byte) 0x86, (byte) 0xc1, (byte) 0x1d, (byte) 0x9e},         {(byte) 0xe1, (byte) 0xf8, (byte) 0x98, (byte) 0x11, (byte) 0x69, (byte) 0xd9, (byte) 0x8e, (byte) 0x94,          (byte) 0x9b, (byte) 0x1e, (byte) 0x87, (byte) 0xe9, (byte) 0xce, (byte) 0x55, (byte) 0x28, (byte) 0xdf},         {(byte) 0x8c, (byte) 0xa1, (byte) 0x89, (byte) 0x0d, (byte) 0xbf, (byte) 0xe6, (byte) 0x42, (byte) 0x68,          (byte) 0x41, (byte) 0x99, (byte) 0x2d, (byte) 0x0f, (byte) 0xb0, (byte) 0x54, (byte) 0xbb, (byte) 0x16}     };      public static void main(string... args) throws exception     {         byte[] input = new byte[] {             (byte) 0x32, (byte) 0x43, (byte) 0xf6, (byte) 0xa8, (byte) 0x88, (byte) 0x5a, (byte) 0x30, (byte) 0x8d,             (byte) 0x31, (byte) 0x31, (byte) 0x98, (byte) 0xa2, (byte) 0xe0, (byte) 0x37, (byte) 0x07, (byte) 0x34         };         byte[] key = new byte[] {             (byte) 0x2b, (byte) 0x7e, (byte) 0x15, (byte) 0x16, (byte) 0x28, (byte) 0xae, (byte) 0xd2, (byte) 0xa6,             (byte) 0xab, (byte) 0xf7, (byte) 0x15, (byte) 0x88, (byte) 0x09, (byte) 0xcf, (byte) 0x4f, (byte) 0x3c         };          byte[] roundkey1 = new byte[] {             (byte) 0xa0, (byte) 0xfa, (byte) 0xfe, (byte) 0x17, (byte) 0x88, (byte) 0x54, (byte) 0x2c, (byte) 0xb1,             (byte) 0x23, (byte) 0xa3, (byte) 0x39, (byte) 0x39, (byte) 0x2a, (byte) 0x6c, (byte) 0x76, (byte) 0x05         };          byte[] roundkey2 = new byte[] {             (byte) 0xf2, (byte) 0xc2, (byte) 0x95, (byte) 0xf2, (byte) 0x7a, (byte) 0x96, (byte) 0xb9, (byte) 0x43,             (byte) 0x59, (byte) 0x35, (byte) 0x80, (byte) 0x7a, (byte) 0x73, (byte) 0x59, (byte) 0xf6, (byte) 0x7f         };          // [row][col]         byte[][] state = new byte[4][4];          // [round][row][col]         byte[][][] roundkeys = new byte[3][4][4];          // [row]         byte[] shiftrowsoffsets = new byte[] {0, 1, 2, 3};          // fill arrays         filltable(state, input);         filltable(roundkeys[0], key);         filltable(roundkeys[1], roundkey1);         filltable(roundkeys[2], roundkey2);          // printtable(state);         // printtable(roundkeys[0]);          tablexor(state, roundkeys[0]);         //printtable(state);          substitutebytes(state);         // printtable(state);          shiftrows(state, shiftrowsoffsets);         // printtable(state);          mixcolumns(state);         printtable(state);          state[1][1] = (byte) 0xcb;         state[2][1] = (byte) 0x19;          tablexor(state, roundkeys[1]);          substitutebytes(state);         shiftrows(state, shiftrowsoffsets);          mixcolumns(state);         printtable(state);         state[1][1] = (byte) 0x4b;          tablexor(state, roundkeys[2]);         substitutebytes(state);         shiftrows(state, shiftrowsoffsets);         mixcolumns(state);          printtable(state);     }      public static void printtable(byte[][] table)     {         synchronized(system.out)         {             system.out.print("   ");             (byte col = 0;col < table[0].length;col++)             {                 system.out.print(formathex(col, ' '));                 system.out.print(' ');             }             system.out.println();             (byte row = 0;row < table.length;row++)             {                 system.out.print(formathex(row, ' '));                 system.out.print(' ');                 (byte col = 0;col < table[row].length;col++)                 {                     system.out.print(formathex(table[row][col], '0'));                     system.out.print(' ');                 }                 system.out.println();             }         }     }      public static string formathex(byte value, char pad)     {         int val = value & 0xff;         string str = integer.tostring(val, 16);         if (str.length() == 2)         {             return str;         }         else         {             return pad + str;         }     }      public static void substitutebytes(byte[][] target)     {         (int row = 0;row < 4;row++)         {             (int col = 0;col < target[row].length;col++)             {                 target[row][col] = lookuptable(substitutiontable, target[row][col]);             }         }     }      public static void tablexor(byte[][] datatarget, byte[][] xorsource)     {         (int row = 0;row < datatarget.length;row++)         {             (int col = 0;col < datatarget[row].length;col++)             {                 datatarget[row][col] = (byte) (datatarget[row][col] ^ xorsource[row][col]);             }         }     }      public static void filltable(byte[][] table, byte[] data)     {         int pointer = 0;         (int col = 0;col < table[0].length;col++)         {             (int row = 0;row < table.length;row++)             {                 table[row][col] = data[pointer++];             }         }     }      private static void shiftrows(byte[][] target, byte[] offsets)     {         int ncols = target[0].length;         (int row = 0;row < 4;row++)         {             byte[] rowbuff = new byte[offsets[row]];             byte offset = offsets[row];             system.arraycopy(target[row], 0, rowbuff, 0, offset);             system.arraycopy(target[row], offset, target[row], 0, ncols - offset);             system.arraycopy(rowbuff, 0, target[row], ncols - offset, offset);         }     }      private static void mixcolumns(byte[][] target)     {         byte[] t = new byte[4];         int ncols = target[0].length;         (int col = 0;col < ncols;col++)         {             (int row = 0;row < 4;row++)             {                 t[row] = target[row][col];             }             (int row = 0;row < 4;row++)             {                    /*                 state[r,c] = ffmul(0x02, t[r]) xor                     ffmul(0x03, t[(r + 1) mod 4]) xor                     t[(r + 2) mod 4] xor t[(r + 3) mod 4]                 */                 byte = fieldmultiplication((byte) 2, t[row]);                 byte b = fieldmultiplication((byte) 3, t[(row + 1) % 4]);                 byte c = t[(row + 2) % 4];                 byte d = t[(row + 3) % 4];                 target[row][col] = (byte) (                     ^ b ^ c ^ d);                  if (col == 1 && (row == 1 || row == 2))                 {                     int id = row;                     system.out.println("ffmul(2, t[" + id + "] = "                         + formathex(t[id], '0') + ") = "                         + formathex(a, '0'));                      id = (row + 1) % 4;                     system.out.println("ffmul(3, t[(" + row + " + 1) % 4] = "                         + "t[" + id + "] = "                         + formathex(t[id], '0') + ") = "                         + formathex(b, '0'));                      id = (row + 2) % 4;                     system.out.println("t[(" + row + " + 2) % 4] = "                         + "t[" + id + "] = "                         + formathex(c, '0'));                      id = (row + 3) % 4;                     system.out.println("t[(" + row + " + 3) % 4] = "                         + "t[" + id + "] = "                         + formathex(d, '0'));                      system.out.println("=> " + formathex((byte) (a ^ b ^ c ^ d), '0'));                      system.out.println();                 }             }         }     }      private static byte lookuptable(byte[][] table, byte position)     {         int x = (position & 0xf0) >> 4;         int y =  position & 0x0f;         return table[x][y];     }      private static byte fieldmultiplication(byte a, byte b)     {         if (a != 0 && b != 0)         {             int t = lookuptable(logtable, a) + lookuptable(logtable, b);             return lookuptable(powtable, (byte) (t % 0xff));         }         else         {             return 0;         }     } }  

thanks got here! hint welcome!

the error in method fieldmultiplication: lookuptable(...) + lookuptable(...) either or both values greater 0x7f not addition of unsigned values more complex calculation negative numbers (since bytes in java signed). thet let erronous result t , resulted in wrong lookup powtable.

changing line

int t = lookuptable(logtable, a) + lookuptable(logtable, b); 

into

int t = (lookuptable(logtable, a) & 0xff) + (lookuptable(logtable, b) & 0xff); 

solved problem. nik , numbers spending time , thoughts on this!


Comments

Popular posts from this blog

PHPMotion implementation - URL based videos (Hosted on separate location) -

javascript - Using Windows Media Player as video fallback for video tag -

c# - Unity IoC Lifetime per HttpRequest for UserStore -