【发布时间】:2018-09-28 11:02:24
【问题描述】:
目前我正在更新我的 x.509 证书库以支持 ECC。大多数实现的构建器都采用 publicKey 并从密钥中派生算法等。在 RSA 中这很简单,您检查密钥的算法并验证位长。然而,对于 ECC,密钥基于曲线,曲线名称(当然)需要在证书中指定(作为 OID)。
我现在正在处理的问题是找到一种从 java.security.interfaces.ECPublicKey 或 org.bouncycastle.jce.interfaces.ECPublicKey 到曲线名称的方法。 (两种实现方式完全不同……)
我能想到的一种方法是获取密钥的 ECPoint 并验证它是否在给定曲线上。这样我可以测试所有支持的曲线,但是这在运行时感觉很麻烦,并且如果有重叠 2 条或更多曲线的点可能容易出错。
另一种方法是获取 ECCurve(bc 实现)或 EllipticCurve(jre 实现)并将曲线细节与支持的实现进行比较。这还涉及遍历每条已知曲线。
是否有人知道仅使用 jre(8/9) 和 bc 根据曲线或公钥详细信息查找曲线名称的更好方法。以及您对第一个解决方案的感受是什么,得到错误点击的可能性有多大。
【问题讨论】:
-
您是否有特定的标准命名约定,例如“secpxyz”?毕竟,名称只是一小组参数的方便标签。
-
最后我需要转换为代表 x.509 证书曲线的特定 OID。我有一个基于他们的名字的表格(我可以支持的那些),其格式确实是“secpxyz”和“brainpoolxyz”等等。这些名称似乎非常标准化,并且也出现在 ECNamedCurveTable 和 jre an bc 中的其他类中。
-
第一种方法应该足够了,一条曲线上的随机点几乎不可能变成另一条曲线上的随机点,至少对于密码学中使用的曲线是这样。在从 BigIntegers 到曲线参数的映射中查找曲线顺序可能会更有效。
-
充气城堡有一些包含编码曲线的类。您可以从公钥中检索参数并通过循环进行比较。也许您可以发布编码的公钥?如果您只需要这样做一次:打印出曲线参数,然后使用 google 搜索其中一个参数,例如阶数或(甚至更好)素数。
-
@MaartenBodewes 谢谢这确实是我最终最终做的。来自 jce 和 bc 的所有双精度类之间的转换引起了一些麻烦,因为两种实现都使用不同的参数名称和类型。 BC 的 EC5Util 类提供了一个解决方案。我已将解决方案放在下面的答案中。现在我必须运行一个完整的 UnitTest 来查看所有曲线和名称是否正确。
标签: java cryptography elliptic-curve