乘法

2016-05-07 46 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)) ); 

,我需要更多的测试

有人有另一种解决方案?