0

我正在用 JavaCard 开发软件以添加 ECC 中的点。问题是我需要一些基本操作,所以目前,我需要乘法和求逆,我已经有了加法和减法。

我试图开发蒙哥马利乘法,但它适用于 GF(2^m) (我认为)。

所以我的例子是:

public static void multiplicationGF_p2(){
        byte A = (byte) 7;
        byte p = (byte) 5;
        byte B = (byte) 2;
        byte C = (byte) 0;
        byte n = (byte)8;
        byte i =  (byte)(n - 1);
        for(; i >= 0; i--){
            C = (byte)(((C & 0xFF) + (C & 0xFF) ) + ((A & 0xff) << getBytePos(B,i)));
            if((C & 0xFF) >= (byte)(p & 0xFF)){
                C = (byte) ((C & 0xFF)-(p & 0xFF));
            }
            if((C & 0xFF) >= (byte)(p & 0xFF)){
                C = (byte) ((C & 0xFF)-(p & 0xFF));
            }
        }
    }

例如 A = 2, B =3, p= 3 C 必须是 0, C = A. B (mode p) 但是这个例子 A = 7, B=2, p=5 , C 必须是 4,但我有49.

有人可以帮我吗?

更多方法:

public static byte getBytePos(byte b, byte pos){
        return (byte)(((b & 0xff) >> pos) & 1);
}

目前我试图简单,但想法是乘以非常大的数字,如字节数组[10]

4

1 回答 1

0

我认为这里出了点问题:

 C = (byte)(((C & 0xFF) + (C & 0xFF) ) + ((A & 0xff) << getBytePos(B,i)));

我创建了一种乘以字节数的方法,而不仅仅是使用shift to the right <<

所以:

public static byte bmult(byte x, byte y){ 
        byte total = (byte)0;
        byte i;
        byte n = (byte)8; // multiplication for 8 bits or 1 byte
        for(i = n ; i >= 0 ; i--)
        {
            total <<= 1;
            if( (((y & 0xff) & (1 << i)) >> i) != (byte)0 )
            {
                total = (byte)(total + x);
            }
        }

        return total;
    }

所以我在我原来的方法中添加了它,(在标记的行中):

C = (byte)(((C & 0xFF) + (C & 0xFF) ) + bmult(A, getBytePos(B,i))  );

现在它工作正常,我需要更多地测试它

有人有另一种解决方案吗?

于 2016-05-07T10:27:26.057 回答