当前位置: 首页 > 面试题库 >

如何从ECPublicKey查找匹配的曲线名称

姚钊
2023-03-14
问题内容

目前,我正在更新我的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根据曲线或publicKey详细信息查找曲线名称的更好方法。您对第一个解决方案有何感想,得到假命中的可能性有多大。


问题答案:

我认为我已经使用针对jre类型规范的EC5Util类找到了有效的解决方案。所有具有相同名称的双精度类实例都使它有些混乱,但是现在可以使用这些函数了。

public static final String deriveCurveName(org.bouncycastle.jce.spec.ECParameterSpec ecParameterSpec) throws GeneralSecurityException{
    for (@SuppressWarnings("rawtypes")
           Enumeration names = ECNamedCurveTable.getNames(); names.hasMoreElements();){
        final String name = (String)names.nextElement();

        final X9ECParameters params = ECNamedCurveTable.getByName(name);

        if (params.getN().equals(ecParameterSpec.getN())
            && params.getH().equals(ecParameterSpec.getH())
            && params.getCurve().equals(ecParameterSpec.getCurve())
            && params.getG().equals(ecParameterSpec.getG())){
            return name;
        }
    }

    throw new GeneralSecurityException("Could not find name for curve");
}

public static final String deriveCurveName(PublicKey publicKey) throws GeneralSecurityException{
    if(publicKey instanceof java.security.interfaces.ECPublicKey){
        final java.security.interfaces.ECPublicKey pk = (java.security.interfaces.ECPublicKey) publicKey;
        final ECParameterSpec params = pk.getParams();
        return deriveCurveName(EC5Util.convertSpec(params, false));
    } else if(publicKey instanceof org.bouncycastle.jce.interfaces.ECPublicKey){
        final org.bouncycastle.jce.interfaces.ECPublicKey pk = (org.bouncycastle.jce.interfaces.ECPublicKey) publicKey;
        return deriveCurveName(pk.getParameters());
    } else throw new IllegalArgumentException("Can only be used with instances of ECPublicKey (either jce or bc implementation)");
}

public static final String deriveCurveName(PrivateKey privateKey) throws GeneralSecurityException{
    if(privateKey instanceof java.security.interfaces.ECPrivateKey){
        final java.security.interfaces.ECPrivateKey pk = (java.security.interfaces.ECPrivateKey) privateKey;
        final ECParameterSpec params = pk.getParams();
        return deriveCurveName(EC5Util.convertSpec(params, false));
    } else if(privateKey instanceof org.bouncycastle.jce.interfaces.ECPrivateKey){
        final org.bouncycastle.jce.interfaces.ECPrivateKey pk = (org.bouncycastle.jce.interfaces.ECPrivateKey) privateKey;
        return deriveCurveName(pk.getParameters());
    } else throw new IllegalArgumentException("Can only be used with instances of ECPrivateKey (either jce or bc implementation)");
}


 类似资料:
  • 本文向大家介绍查找图的匹配数,包括了查找图的匹配数的使用技巧和注意事项,需要的朋友参考一下 问题陈述 下图的匹配数字是多少? 解 顶点数= 9 我们只能匹配8个顶点。 匹配号码为4。

  • 问题内容: 我有一堆目录 ,其中有些目录的名称中包含字母。我只想获取所有具有数字名称的目录,然后将它们移至另一个目录。 我尝试这样: 匹配的部分有效,但最终将所有内容移至… 问题答案: 我不确定我是否正确理解,但至少可以提供一些帮助。 使用find和xargs的组合来操作文件列表。 使用并引用替换符号可使您的脚本更加健壮。它可以处理存在不可打印字符的大多数情况。这基本上表示它使用char分隔符而不

  • 问题内容: 我知道我们在谈论流程时可以有“父母”和“孩子”。但是可以得到父母的名字吗? 我做了研究,但只找到了.Net的答案 但是您可能会考虑: 使用来自父线程的线程ID前缀新线程的名称 在您想要产生的方法上创建一个构造函数,该方法需要父对象的线程ID 编辑:我尝试设置名称: 问题答案: 我知道我们在谈论流程时可以有“父母”和“孩子”。但是可以获取父线程名称吗? 线程没有对父线程的引用,因此您无法

  • 问题内容: 我正在尝试使用Java通过ssl连接到我的一台服务器。我尝试了很多选择,这是我的最佳尝试: 我使用以下推荐脚本生成了jssecacerts:http : //blogs.oracle.com/andreas/resource/InstallCert.java, 其中包含以下命令:java InstallCert ssl.someUrl.de changeit 之后,我再次执行了命令:

  • 问题内容: 我正在尝试在给定私钥和已知曲线的情况下生成公钥。下面是我的代码: 但是,当我打电话给 我时:我得到了例外:(不是我的拼写错误) 我似乎在计算错误,但是我不确定错误在哪里。 谢谢您的帮助! 问题答案: 如果我未来的自己需要解决方案:

  • 我知道如何描述等厚度曲线(用Bezier或类似的模型)。 变厚度曲线有什么常见的模型吗? 我在想象一些类似的事情,就像在贝塞尔一样。例如,每个节点可以包含厚度值及其权重,因此渲染器可以沿曲线插值厚度。 在Bezier中,向量越长,比如说AB,那么沿着AB方向的曲线越长。在上面的图片上,我们有很长时间的追随者。 因此,我希望THIKNY与控制节点B和C同步,如果AB和CD长,那么ThinkNY应该跟