我尝试计算椭圆曲线 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。谁能告诉我跟踪的实现有什么问题吗?
最佳答案
看起来您没有正确地在 GF(2m) 中进行域运算。支持正确字段运算的类在包中 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();
关于java - 使用 Bouncy CaSTLe 获取椭圆曲线的 X 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53501466/