1

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

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

感谢您的帮助!

4

2 回答 2

5

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

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

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

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

  • ECDSA 以椭圆曲线运行。曲线大小不足以定义曲线:有很多 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 标准)的副本。请注意,数学内容非常繁重。

于 2011-09-13T11:06:37.143 回答
0

您可能可以使用Bouncy Castle库。

http://www.bouncycastle.org/wiki/display/JA1/Using+Elliptic+Curve

于 2011-09-12T10:21:19.913 回答