GF中的乘法(p)

时间:2016-05-07 09:59:27

标签: java binary javacard montgomery-multiplication

我正在使用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(模式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]字节

1 个答案:

答案 0 :(得分: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))  );

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

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