c# - 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 算术网站上进行验证。)
有什么建议么?
解决方案
简短回答:使用 ECPoint.Normalize 返回一个 ECPoint,其 (X, Y) 坐标可以与 PyCoin 进行比较。
详细信息:默认情况下(BouncyCastle 的)ECPoint
操作在投影坐标中执行;特别是通常称为“雅可比修正坐标”的东西。这是为了在执行一系列操作时提高性能,尤其是标量乘法。twoG
如果您使用提供的方法打印出 eg 的值ECPoint.ToString
,您将看到出现的额外坐标。
当您想将ECPoint
某个 (X, Y) 值与某个 (X, Y) 值进行比较时,您可以调用ECPoint.Normalize
,它返回一个新值,ECPoint
其中 Z 坐标为 1,X 和 Y 坐标为仿射值。这是一个相对昂贵的操作,通常在更大计算的最后一步之前避免。
推荐阅读
- python - 你如何抓取 Instagram 帖子?
- ansible - 当条件问题中的 group_names 变量
- javascript - 如何正确对齐按钮内的material-ui图标?
- typescript - 为所有可能的字母生成文字联合类型(“a” | “b” | ... | “z”)
- c# - WPF - 将 DataGrid 导出到 Excel,Microsoft.Office.Interop.Excel 替代 Office 2019
- r - 将 tibble 导出到 ODS 时出现问题
- python - Google_drive_api 图像 ID
- reactjs - 如何从 Ghost(内容 API)获取图像到 Next.js?
- ag-grid - Ag-grid 分组:仅为一列设置 groupRemoveSingleChildren
- mysql - MySQL - 使用外键插入一行