首页 > 解决方案 > Bouncy Castle C#:如何定义曲线和点以测试/玩 EC 点算术?

问题描述

我有一个简单的 C# EC 库,但它已经消失了,我在网上找不到它。它以前发布在 MSDN 上,但现在链接已失效。

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

IE:

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 是正确的,但所有其他的都不正确。IE:

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

I am getting:
7d152c041ea8e1dc2191843d1fa9db55b68f88fef695e2c791d40444b365afc2,
  56915849f52cc8f76f5fd7e4bf60db4a43bf633e1b1383f85fe89164bfadcbdb

G * 3 也不正确。

(我所说的正确来自 PyCoin 应用程序,也可以在这个 EC 算术网站上进行验证。)

有什么建议么?

标签: c#bouncycastleelliptic-curve

解决方案


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

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

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


推荐阅读