使用Bouncy Castle获取椭圆曲线的X坐标

时间:2018-11-27 14:03:48

标签: java cryptography bouncycastle

我尝试为椭圆曲线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。有人可以告诉我实现跟踪时出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

您似乎没有在GF(2 m )中正确执行场算术。支持正确的字段算术的类位于软件包org.bouncycastle.math.ec中。看一下ECFieldElement.F2mECCurve.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();