Умножение в GF(p)

Я занимаюсь разработкой программного обеспечения на 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 ответ

Я предположил, что здесь что-то не так:

 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))  );

на данный момент он работает правильно, мне нужно проверить это больше

у кого-то есть другое решение?

Другие вопросы по тегам