Bouncy Castle C#:如何定义曲线和点以便 test/play 使用 EC 点算法?

Bouncy Castle C#: How do I define a curve and points in order to test/play with EC point arithmetic?

我有一个简单的 C# EC 库,但它不见了,我在网上找不到它。它以前发布在 MSDN 上,但是 link 现在已经死了。

我正在尝试使用 Bouncy Castle Library 来完成类似的任务。我想创建一条曲线 (secp256k1),我希望能够进行点运算并查看原始点数据。

即:

G + 3 * G = 4 * G

p + q

4 * G - G = 3 * G

我需要包含哪些名称空间,如何定义/声明曲线,以及如何定义我的点? 我已成功(我相信...)在我的 C# 项目中包含了 Bouncy Castle .dll。

我对创建密钥或任何类似的东西不感兴趣。只是EC点算术。允许我执行这些相同操作的不同(简单)库会同样好或更好。

感谢您的帮助。

编辑: 我一直在努力,我的代码如下所示:

    private static ECDomainParameters GetCurveParameters(string name)
    {
        X9ECParameters ecP = ECNamedCurveTable.GetByName(name);

        if (ecP == null)
            throw new Exception("unknown curve name: " + name);

        return new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, ecP.GetSeed());
    }

    private void btnTest2_Click(object sender, EventArgs e)
    {
        ECDomainParameters ecSpec = GetCurveParameters("secp256k1");
        ECCurve mycurve = ecSpec.Curve;

        ECPoint G, g2, twoG, threeG;

        G = ecSpec.G;
        g2 = ecSpec.G;

        twoG = G.Add(g2);
        threeG = G.Multiply(new BigInteger("3"));
    }

现在,我可以 运行 代码了,我得到了值,但我没有得到正确的点。 G 是正确的,但所有其他人都不正确。 即:

2*G or G+G should =
c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5,
  1ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a

I am getting:
7d152c041ea8e1dc2191843d1fa9db55b68f88fef695e2c791d40444b365afc2,
  56915849f52cc8f76f5fd7e4bf60db4a43bf633e1b1383f85fe89164bfadcbdb

G * 3 也不正确。

(我所说的正确来自 PyCoin 应用程序,也可以在 this EC arithmetic website 进行验证。)

有什么建议吗?

简短回答:使用 ECPoint.Normalize 到 return 一个 ECPoint,其 (X, Y) 坐标可以与 PyCoin 进行比较。

详细信息:默认情况下(BouncyCastle 的)ECPoint 操作在投影坐标中执行;特别是通常所谓的“雅可比修正坐标”。这是为了在执行一系列操作时提高性能,尤其是标量乘法。如果您打印出例如的值twoG 使用提供的 ECPoint.ToString 方法,您将看到额外的坐标。

当您想将 ECPoint 与某些 (X, Y) 值进行比较时,您可以调用 ECPoint.Normalize,它 return 是一个新的 ECPoint,其中 Z坐标为1,X和Y坐标为仿射值。这是一个相对昂贵的操作,通常在较大计算的最后一步之前避免。