2016-05-07 12 views
0

Ich entwickle Software in JavaCard zu Additionspunkten in ECC. das Problem ist, ich brauche einige Basisoperationen, so für den Moment, ich brauche Multiplikation und Inversion, ich habe bereits Addition und Subtraktion.Multiplikation in GF (p)

Ich habe versucht, Montgomery Multiplikation zu entwickeln, aber es ist für GF (2^m) (glaube ich).

so Mein Beispiel ist:

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

beispielsweise A = 2, B = 3, p = 3 sein muß, C 0, C = A. B (mode p) dies aber Beispiel A = 7, B = 2, p = 5, C muss 4 sein, aber ich habe 49.

kann mir jemand dabei helfen?

mehr Methoden:

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

Ich versuche, einfach zu sein, für den Moment, aber die Idee ist die Multiplikation von sehr großer Zahl wie Arrays macht [10] von Bytes

Antwort

0

ich angenommen habe, dass etwas falsch war hier:

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

ich eine Methode erstellt haben Byte-Zahlen zu multiplizieren, nicht nur mit shift to the right <<

So

:

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

so ist, dann habe ich es in meiner ursprünglichen Methode hinzugefügt, (in der Zeile markiert):

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

jetzt ist es richtig funktioniert, muss ich es testen mehr

hat jemand eine andere Lösung?