在我的加密项目中,我必须处理GF(2 ^ 8)算术运算。本质上,此字段中的求和运算(GF(2 ^ 8)是正常的XOR运算,乘积运算a * b是(a * b)mod m(x)。你可以跳过这个数学部分。
我的工作是在GF(2 ^ 8)中反转矩阵4x4。这并不困难,但是手动重新实现每个矩阵操作太繁琐了。我想在numpy中使用这个功能(逆矩阵),但是我无法在矩阵的项目之间使用我的操作。比方说,我不希望使用'+'在两个项目之间进行添加,而是在每次使用'+'操作时都希望它执行XOR。
我创建了一个我的客户类型,调用GF28。代码可以在下面找到:
class GF28(float):
def __init__(self, value):
self.value = value
def __add__(self, b):
if isinstance(b, GF28):
return GF28(ops.add(self.value, b.value))
else:
return GF28(ops.add(self.value, b))
__rsub__ = __isub__ = __sub__ = __radd__ = __iadd__ = __add__
def __mul__(self, b):
if isinstance(b, GF28):
return GF28(ops.mul(self.value, b.value))
else:
return GF28(ops.mul(self.value, b))
__rmul__ = __imul__ = __mul__
def __div__(self, b):
return self.__mul__(self.inv(b))
__rdiv__ = __idiv__ = __div__
def inv(self):
return GF28(ops.inv(self.value))
def __float__(self):
return self
然后我使用以下方法创建这些GF28项目的矩阵:
a = array([[GF28(10), GF28(20), GF28(30)],
[GF28(12), GF28(21), GF28(4)],
[GF28(9), GF28(16), GF28(13)]])
似乎只使用float()强制转换功能,其余部分根本没有被触及。
请帮助我完成此操作覆盖工作。非常感谢。
[edit]执行基本矩阵操作已经可以。如果有人能用矩阵求逆来完成这项工作,我真的很感激。谢谢!
答案 0 :(得分:2)
声明a
属于dtype
object
:
a = np.array([(GF28(10), GF28(20), GF28(30)),
(GF28(12), GF28(21), GF28(4)),
(GF28(9), GF28(16), GF28(13))],dtype='object')
然后,数组中元素的类型为GF28
。例如:
type(a[0,0])
# <class '__main__.GF28'>