乘法

2016-05-07 84 views
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(模式P) 但這例如A = 7,B = 2,P = 5,C必須是4,但我有49.

有人可以幫助我嗎?

更多的方法:

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

我想很簡單,就目前而言,但這個想法是讓非常大的數目的乘積像

回答

0

我已經假定[10]的字節數組什麼是錯在這裏:

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

,我需要更多的測試

有人有另一種解決方案?