Умножение в 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)) );
на данный момент он работает правильно, мне нужно проверить это больше
у кого-то есть другое решение?