当前位置: 首页 > 知识库问答 >
问题:

验证ECDSA P-256签名

丰智
2023-03-14

最近,我一直在尝试构建一个Java库来解释和验证NZ Covid传递。在签名验证之前(这个过程中稍微重要的一部分),我已经让代码变得更好或更坏。完整的代码可以在这里找到,但是仍然很粗糙。

验证器本身在这里可用,有一个配套测试。新冠通行证的技术规范在这里。至少有一个相关部分。

在与另一个开发人员合作后,我想我已经确定了解释提供的公钥。下面的代码(删除了调试输出)。公钥详细信息来自这里

private PublicKey extractPublicKey(PublicKeysDetails publicKeyDetails) throws NoSuchAlgorithmException, InvalidParameterSpecException, InvalidKeySpecException {
    byte[] xBytes = Base64.getDecoder().decode(publicKeyDetails.x().replace('-', '+').replace('_', '/'));
    byte[] yBytes = Base64.getDecoder().decode(publicKeyDetails.y().replace('-', '+').replace('_', '/'));
    BigInteger x = new BigInteger(xBytes);
    BigInteger y = new BigInteger(yBytes);

    ECPoint ecPoint = new ECPoint(x, y);
    ECGenParameterSpec parameterSpec = new ECGenParameterSpec("secp256r1");//publicKeyDetails.crv() Should always come from the endpoint as "P-256", java wants to know exactly secp256r1, or NIST P-256
    AlgorithmParameters parameters = AlgorithmParameters.getInstance("EC");//publicKeyDetails.kty() Should always come from the endpoint as "EC"
    parameters.init(parameterSpec);
    ECParameterSpec ecParameters = parameters.getParameterSpec(ECParameterSpec.class);
    ECPublicKeySpec pubSpec = new ECPublicKeySpec(ecPoint, ecParameters);

    KeyFactory kf = KeyFactory.getInstance("EC");
    return kf.generatePublic(pubSpec);
}

该错误可能存在于该文件的其他地方,但我现在对它可能是什么感到非常困惑。

请帮我堆满你我唯一的希望?

共有1个答案

曾嘉福
2023-03-14

几天来,我的问题特别出在将字节处理成大整数上。

    BigInteger x = new BigInteger(xBytes);
    BigInteger y = new BigInteger(yBytes);

本该如此

    BigInteger x = new BigInteger(1, xBytes);
    BigInteger y = new BigInteger(1, yBytes);

这说明该数字应该是正数。

 类似资料:
  • 问题内容: 我正在尝试以编程方式验证jar文件是否未被明显篡改。我有2个要防止的用例。1)修改现有类2)在罐子中添加新类 我使用jarsigner签名了罐子。当我用jarsigner验证以上两种情况之一时,它的工作方式就与我期望的一样。 当我尝试使用如何以编程方式验证用jarsigner签名的jar 或如何通过自签名的jar验证签名中的示例以编程方式进行操作时 ?但是,我没有任何SecurityE

  • 我正在恩智浦J3D081卡上编写Java卡3.0.2应用程序。我让它使用ALG_ECDSA_SHA_256对签名进行签名和验证。我的测试应用程序已经把钥匙写到卡上了。如果我对32字节的数据进行签名并将签名传回卡,验证码将成功地验证签名。如果我用私钥在Bouncy Castle中签名32个字节,并传递到卡上的验证,它就成功地验证了签名。bouncy castle验证代码成功验证从bouncy cas

  • 我有字节数组格式的公钥。在我的数据库里。像这样 在此处输入图像描述 总是suc=false。我确信bytetoverify的值与方法符号中的输入值相同。 我不知道我用这种方式生成公钥是问题还是符号有问题。在符号方法中,我使用sh1和pkcs1,但在验证中,我只找到sh1。 每个人都能帮我吗?

  • 我试图实现PDFS的签名验证。这是一个很大的主题,所以我一步一步地进行,首先,我试图在我自己签名的PDF中实际返回一个正值,使用当前Acrobat的所有默认值--对于摘要,应该是SHA256和PKCS7分离签名。因此,我破解了openssl,通过读取PDF中给出的字节范围并调用函数,我得到了一个哈希值来进行比较。因此,现在我需要读取证书数据等,并使用函数。这个看起来就是我想要的: 如文档中所示。除

  • Commits 验证 首先导入签名者的 GPG 公钥,然后执行以下任意命令来获得 Good signature 消息: ❯ git show HEAD --show-signature ❯ git log --show-signature ❯ git verify-commit HEAD

  • Tags 验证 首先导入签名者的 GPG 公钥,然后执行以下任意命令来获得 Good signature 消息: ❯ git tag -v 1.0.0 ❯ git cat-file -p 1.0.0 ❯ git verify-tag 1.0.0