我正在开发JavaCard中的软件,以增加ECC的点。问题是我需要一些基运算,所以现在我需要乘法和反转,我已经有了加法和减法。
我正在尝试开发montgomery乘法,但它是针对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= 3C必须是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);
}我现在尽量简单,但我的想法是做非常大的数字的乘法,比如字节的arrays10
发布于 2016-05-07 18:27:26
我假设这里出了点问题:
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)) );现在它工作正常,我需要对它进行更多的测试
有人有别的解决方案吗?
https://stackoverflow.com/questions/37087077
复制相似问题