用于AES混合色谱柱阶段的xor矩阵乘法

时间:2016-02-06 07:58:38

标签: python numpy encryption matrix aes

您好我正在为AES混合色谱柱阶段编写程序。在这里,我必须乘以(4,4)形状的两个矩阵。唯一的区别是,虽然乘以两个矩阵,但我必须采用“xor”和“xor”。而不是我必须添加的地方。例如

a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.dot(a,b) # this gives [[(1*5+2*7),(1*6+2*8)][(3*5+4*7),(3*6+4*8)]]
            # but I want [[((1*5)^(2*7)),((1*6)^(2*8))][((3*5)^(4*7)),((3*6)^(4*8))]]

这是带循环的解决方案

result = [[0,0,0,0],
          [0,0,0,0],
          [0,0,0,0],
          [0,0,0,0]]

# iterate through rows of X
for i in range(len(X)):
   # iterate through columns of Y
   for j in range(len(Y[0])):
      # iterate through rows of Y
      for k in range(len(Y)):
         result[i][j] = result[i][j] ^ (X[i][k] * Y[k][j])

如何在不使用循环的情况下实现这一目标?

1 个答案:

答案 0 :(得分:0)

xor_ab=np.bitwise_xor.reduce(a[...,None]*b,axis=1)

为了便于说明,请考虑一个矩形问题,以便于识别:

a=np.arange(12).reshape(4,3).astype(object)
b=np.arange(12).reshape(3,4).astype(object)

对象是为AES提供python int任意精度。

产品通过广播获得,

c=a[...,None]*b   # dims :  (4,3,1) * ((1),3,4) -> (4,3,4)  , c_ijk =a_ij*b_jk

然后通过以下方式获得点积:

dot_ab=c.sum(axis=1)  #  ->(4,4)
In [734]: (dot_ab==a.dot(b)).all()
Out[734]: True 

然后更改为等效的xor函数:

xor_ab=np.bitwise_xor.reduce(a[...,None]*b,axis=1)

作为替代方案,您可以使用numba(0.23)解释您的循环:

from numba import jit
@jit(nopython=True)
def xor(X,Y):
    result=np.zeros((4,4),np.uint64)
    for i in range(len(X)):
    # iterate through columns of Y
      for j in range(Y.shape[1]):
        # iterate through rows of Y
        for k in range(len(Y)):
            result[i,j] = result[i,j] ^ (X[i,k] * Y[k,j])
    return result

由于最佳内存使用率,效率显着提升。 但是对于a和b:

,限制为32位
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