我尝试为椭圆曲线F2m(m = 163)的x坐标计算Tr(x)运算。为此,我使用了“ Bouncy Castle”和相应的类型。我的椭圆曲线的迹线等于0或1,我的代码如下:
public int CalculateTrace_Test(byte[] array)
{
int m = 163;
BigInteger two = new BigInteger("2", 10);
BigInteger x = new BigInteger(array);
BigInteger xi = x;
BigInteger temp = x;
for (int i = 1; i < m; i++)
{
var next = xi.ModPow(two.Pow(i), fx);
temp = temp.Xor(next);
}
return temp.IntValue;
}
fx是由不可约多项式f(x) = x^163+x^7+x^6+x^3 + 1
形成的整数。
所以我的问题是它不起作用,结果是我拥有所有东西,但没有1或0。有人可以告诉我实现跟踪时出了什么问题吗?
答案 0 :(得分:1)
您似乎没有在GF(2 m )中正确执行场算术。支持正确的字段算术的类位于软件包org.bouncycastle.math.ec
中。看一下ECFieldElement.F2m
和ECCurve.F2m
。另外,对于与SECT163约简多项式相对应的特定情况,类SecT163FieldElement
可能特别有用。
这里有一些直接从类org.bouncycastle.math.ec.tools.TraceOptimizer
复制的代码。代码假定有限域具有特征2。
private static int calculateTrace(ECFieldElement fe) {
int m = fe.getFieldSize();
ECFieldElement tr = fe;
for (int i = 1; i < m; ++i) {
fe = fe.square();
tr = tr.add(fe);
}
BigInteger b = tr.toBigInteger();
if (b.bitLength() > 1) {
throw new IllegalStateException();
}
return b.intValue();