I am coming from a java background and am new to python
is there a more efficient or more pythonic what of writing:
S_BOX_TABLE = [
[BitArray('0x63'), BitArray('0x7C'), BitArray('0x77'), BitArray('0x7B'), BitArray('0xF2'), BitArray('0x6B'), BitArray('0x6F'), BitArray('0xC5'), BitArray('0x30'), BitArray('0x01'), BitArray('0x67'), BitArray('0x2B'), BitArray('0xFE'), BitArray('0xD7'), BitArray('0xAB'), BitArray('0x76')],
[BitArray('0xCA'), BitArray('0x82'), BitArray('0xC9'), BitArray('0x7D'), BitArray('0xFA'), BitArray('0x59'), BitArray('0x47'), BitArray('0xF0'), BitArray('0xAD'), BitArray('0xD4'), BitArray('0xA2'), BitArray('0xAF'), BitArray('0x9C'), BitArray('0xA4'), BitArray('0x72'), BitArray('0xC0')],
[BitArray('0xB7'), BitArray('0xFD'), BitArray('0x93'), BitArray('0x26'), BitArray('0x36'), BitArray('0x3F'), BitArray('0xF7'), BitArray('0xCC'), BitArray('0x34'), BitArray('0xA5'), BitArray('0xE5'), BitArray('0xF1'), BitArray('0x71'), BitArray('0xD8'), BitArray('0x31'), BitArray('0x15')],
[BitArray('0x04'), BitArray('0xC7'), BitArray('0x23'), BitArray('0xC3'), BitArray('0x18'), BitArray('0x96'), BitArray('0x05'), BitArray('0x9A'), BitArray('0x07'), BitArray('0x12'), BitArray('0x80'), BitArray('0xE2'), BitArray('0xEB'), BitArray('0x27'), BitArray('0xB2'), BitArray('0x75')],
[BitArray('0x09'), BitArray('0x83'), BitArray('0x2C'), BitArray('0x1A'), BitArray('0x1B'), BitArray('0x6E'), BitArray('0x5A'), BitArray('0xA0'), BitArray('0x52'), BitArray('0x3B'), BitArray('0xD6'), BitArray('0xB3'), BitArray('0x29'), BitArray('0xE3'), BitArray('0x2F'), BitArray('0x84')],
[BitArray('0x53'), BitArray('0xD1'), BitArray('0x00'), BitArray('0xED'), BitArray('0x20'), BitArray('0xFC'), BitArray('0xB1'), BitArray('0x5B'), BitArray('0x6A'), BitArray('0xCB'), BitArray('0xBE'), BitArray('0x39'), BitArray('0x4A'), BitArray('0x4C'), BitArray('0x58'), BitArray('0xCF')],
[BitArray('0xD0'), BitArray('0xEF'), BitArray('0xAA'), BitArray('0xFB'), BitArray('0x43'), BitArray('0x4D'), BitArray('0x33'), BitArray('0x85'), BitArray('0x45'), BitArray('0xF9'), BitArray('0x02'), BitArray('0x7F'), BitArray('0x50'), BitArray('0x3C'), BitArray('0x9F'), BitArray('0xA8')],
[BitArray('0x51'), BitArray('0xA3'), BitArray('0x40'), BitArray('0x8F'), BitArray('0x92'), BitArray('0x9D'), BitArray('0x38'), BitArray('0xF5'), BitArray('0xBC'), BitArray('0xB6'), BitArray('0xDA'), BitArray('0x21'), BitArray('0x10'), BitArray('0xFF'), BitArray('0xF3'), BitArray('0xD2')],
[BitArray('0xCD'), BitArray('0x0C'), BitArray('0x13'), BitArray('0xEC'), BitArray('0x5F'), BitArray('0x97'), BitArray('0x44'), BitArray('0x17'), BitArray('0xC4'), BitArray('0xA7'), BitArray('0x7E'), BitArray('0x3D'), BitArray('0x64'), BitArray('0x5D'), BitArray('0x19'), BitArray('0x73')],
[BitArray('0x60'), BitArray('0x81'), BitArray('0x4F'), BitArray('0xDC'), BitArray('0x22'), BitArray('0x2A'), BitArray('0x90'), BitArray('0x88'), BitArray('0x46'), BitArray('0xEE'), BitArray('0xB8'), BitArray('0x14'), BitArray('0xDE'), BitArray('0x5E'), BitArray('0x0B'), BitArray('0xDB')],
[BitArray('0xE0'), BitArray('0x32'), BitArray('0x3A'), BitArray('0x0A'), BitArray('0x49'), BitArray('0x06'), BitArray('0x24'), BitArray('0x5C'), BitArray('0xC2'), BitArray('0xD3'), BitArray('0xAC'), BitArray('0x62'), BitArray('0x91'), BitArray('0x95'), BitArray('0xE4'), BitArray('0x79')],
[BitArray('0xE7'), BitArray('0xC8'), BitArray('0x37'), BitArray('0x6D'), BitArray('0x8D'), BitArray('0xD5'), BitArray('0x4E'), BitArray('0xA9'), BitArray('0x6C'), BitArray('0x56'), BitArray('0xF4'), BitArray('0xEA'), BitArray('0x65'), BitArray('0x7A'), BitArray('0xAE'), BitArray('0x08')],
[BitArray('0xBA'), BitArray('0x78'), BitArray('0x25'), BitArray('0x2E'), BitArray('0x1C'), BitArray('0xA6'), BitArray('0xB4'), BitArray('0xC6'), BitArray('0xE8'), BitArray('0xDD'), BitArray('0x74'), BitArray('0x1F'), BitArray('0x4B'), BitArray('0xBD'), BitArray('0x8B'), BitArray('0x8A')],
[BitArray('0x70'), BitArray('0x3E'), BitArray('0xB5'), BitArray('0x66'), BitArray('0x48'), BitArray('0x03'), BitArray('0xF6'), BitArray('0x0E'), BitArray('0x61'), BitArray('0x35'), BitArray('0x57'), BitArray('0xB9'), BitArray('0x86'), BitArray('0xC1'), BitArray('0x1D'), BitArray('0x9E')],
[BitArray('0xE1'), BitArray('0xF8'), BitArray('0x98'), BitArray('0x11'), BitArray('0x69'), BitArray('0xD9'), BitArray('0x8E'), BitArray('0x94'), BitArray('0x9B'), BitArray('0x1E'), BitArray('0x87'), BitArray('0xE9'), BitArray('0xCE'), BitArray('0x55'), BitArray('0x28'), BitArray('0xDF')],
[BitArray('0x8C'), BitArray('0xA1'), BitArray('0x89'), BitArray('0x0D'), BitArray('0xBF'), BitArray('0xE6'), BitArray('0x42'), BitArray('0x68'), BitArray('0x41'), BitArray('0x99'), BitArray('0x2D'), BitArray('0x0F'), BitArray('0xB0'), BitArray('0x54'), BitArray('0xBB'), BitArray('0x16')]]
for k in range(len(state_matrix)):
for l in range(len(state_matrix[k])):
state_matrix[k][l] = self.__sBoxSubstitution(state_matrix[k][l])
def __sBoxSubstitution(self, byte):
column, row = byte.cut(4)
return self.S_BOX_TABLE[row.int][column.int]
Few things -
You can iterate over a list directly, you do not need to take its length and then iterate over the indices and take element using indices.
Seems like for every item in the 2D list, you are running a function and storing the result of the function back , you can use list comprehension for this (They may be a little faster than their for-loop counterparts , though this would create a new matrix and assign that new matrix to state_matrix inplace)
Code -
state_matrix[:] = [[self.__sBoxSubstitution(y) for y in x] for x in state_matrix ]
Assigning to state_matrix
inplace, as that would be the exact behavior of the original nested loop.