python - xor matrix multiplication for AES mix column stage -
hi i'm writing program aes mix column stage. here have multiply 2 matrices of (4,4)
shape. difference while multiplying 2 matrices have take 'xor' instead of have add. e.g
a = np.array([[1,2],[3,4]]) b = np.array([[5,6],[7,8]]) np.dot(a,b) # gives [[(1*5+2*7),(1*6+2*8)][(3*5+4*7),(3*6+4*8)]] # want [[((1*5)^(2*7)),((1*6)^(2*8))][((3*5)^(4*7)),((3*6)^(4*8))]]
here's solution loops
result = [[0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0]] # iterate through rows of x in range(len(x)): # iterate through columns of y j in range(len(y[0])): # iterate through rows of y k in range(len(y)): result[i][j] = result[i][j] ^ (x[i][k] * y[k][j])
how achieve without using loops?
xor_ab=np.bitwise_xor.reduce(a[...,none]*b,axis=1)
for explanation, consider rectangular problem easier identification:
a=np.arange(12).reshape(4,3).astype(object) b=np.arange(12).reshape(3,4).astype(object)
object provide python int arbitrary precision aes.
products obtained broadcasting,
c=a[...,none]*b # dims : (4,3,1) * ((1),3,4) -> (4,3,4) , c_ijk =a_ij*b_jk
the dot product obtained :
dot_ab=c.sum(axis=1) # ->(4,4) in [734]: (dot_ab==a.dot(b)).all() out[734]: true
then change equivalent xor function :
xor_ab=np.bitwise_xor.reduce(a[...,none]*b,axis=1)
as alternative, can interpret loops numba (0.23):
from numba import jit @jit(nopython=true) def xor(x,y): result=np.zeros((4,4),np.uint64) in range(len(x)): # iterate through columns of y j in range(y.shape[1]): # iterate through rows of y k in range(len(y)): result[i,j] = result[i,j] ^ (x[i,k] * y[k,j]) return result
for impressive efficiency gain,due optimal memory usage. limited 32 bits , b:
in [790]: %timeit xor(a,b) 1000000 loops, best of 3: 580 ns per loop in [791]: %timeit xor_ab=np.bitwise_xor.reduce(a[...,none]*b,axis=1) 100000 loops, best of 3: 13.2 µs per loop in [792] (xor(a,b)==np.bitwise_xor.reduce(a[...,none]*b,axis=1)).all() out[792]: true
Comments
Post a Comment