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坐标为仿射值。这是一个相对昂贵的操作,通常在较大计算的最后一步之前避免。
我有一个简单的 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坐标为仿射值。这是一个相对昂贵的操作,通常在较大计算的最后一步之前避免。