【问题标题】:Verify signature using elliptic curve cryptography使用椭圆曲线密码验证签名
【发布时间】:2011-09-12 09:38:54
【问题描述】:

我需要验证包含多个值的消息的签名。我拥有的唯一参数是签名、公钥和值本身。用于创建签名的算法是 192 位的椭圆曲线密码术。我已经尝试在网上找到代码示例,但我没有找到任何适用于此案例的代码。

有没有人使用 java 验证这个算法的经验?能否提供代码或示例链接?

感谢您的帮助!

【问题讨论】:

    标签: java security digital-signature jce elliptic-curve


    【解决方案1】:

    你那里的信息有点少......

    有几种使用椭圆曲线的签名方案,但最普遍(到目前为止)是ECDSA。然后你必须担心以下几点:

    • 签名对位序列进行操作。每个数据位都必须正确。在这里,您有“值”,因此必须将这些值编码为一系列位(或字节)。要验证签名,您必须使用与生成签名相同的编码。

    • ECDSA 首先使用 cryptographic hash function 散列输入数据。同样,您必须使用与生成签名相同的那个。作为一个疯狂的猜测,我会说哈希函数可能是SHA-1

    • ECDSA 在elliptic curve 中运行。曲线 size 不足以定义曲线:有很多 192 位曲线。但是,由于定义自己的曲线很难,大多数人使用FIPS 186-3 中定义的 15 条曲线中的一条曲线。这 15 条曲线中的一条曲线具有“192 位大小”(称为“P-192”),因此签名很可能使用该曲线。

    • ECDSA 公钥是曲线点的编码。名义上,曲线点是一对整数(X, Y)(这些是点的“坐标”)。这些整数来自曲线所在的基域;对于 P-192 曲线,坐标是 192 位整数。这种公钥的“正常”编码是一个 49 字节的字符串:第一个字节是 0x02,然后是 X 的大端无符号编码(24 字节),然后是无符号Y 的编码(24 字节)。其他编码也是可能的。

    • ECDSA 签名正式包含两个整数值,通常称为 rs(也是 192 位整数)。同样,您拥有的签名可能是一个字节序列,它是两个整数的编码。有两种常见的编码,一种是两个值的原始大端无符号编码(因此是 48 字节签名),另一种使用 ASN.1(用于长度为 53 或 54 字节左右的签名)。

    正如@Ashkan 建议的那样,使用Bouncy Castle 是个好主意。但是,正如您所看到的,对于您的情况,有很多假设要做。如果您想彻底了解正在发生的事情,请购买一份ANSI X9.62:2005(ECDSA 标准)的副本。请注意,数学内容非常繁重。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 感谢您的回答。不幸的是,bouncycastle wiki 的链接不起作用,我总是收到服务器错误。
      • @Skiontke 是的,它目前对我也不起作用,这就是为什么我无法向您发送更详细的回复。它可能会暂时关闭...
      • @SKiontke javadocs here:bouncycastle.org/docs/docs1.6/index.html 检查以 EC 开头的类...
      猜你喜欢
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2021-05-07
      • 2015-05-09
      相关资源
      最近更新 更多