对用户定义类型项的矩阵执行Numpy操作

时间:2011-09-18 09:42:48

标签: python cryptography numpy

在我的加密项目中,我必须处理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]执行基本矩阵操作已经可以。如果有人能用矩阵求逆来完成这项工作,我真的很感激。谢谢!

1 个答案:

答案 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'>