我正在使用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]字节
答案 0 :(得分:0)
我认为这里出了点问题:
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)) );
现在它正常工作,我需要更多地测试
有人有另一种解决方案吗?