【发布时间】:2011-09-18 18:16:16
【问题描述】:
在我的密码学项目中,我必须处理 GF(2^8) 算术运算。本质上,这个字段(GF(2^8) 的求和运算是正常的异或运算,乘积运算 a*b 是 (a*b) mod m(x)。您可以跳过这部分数学部分。
我的工作是在 GF(2^8) 中逆矩阵 4x4。这并不难,但是手动重新实现每个矩阵运算太繁琐了。我想在 numpy 中使用这个功能(逆矩阵),但我无法让 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] 执行基本的矩阵运算已经可以了。如果有人可以通过矩阵求逆来完成这项工作,我将非常感激。谢谢!
【问题讨论】:
标签: python cryptography numpy