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
Post a Comment