【发布时间】:2011-09-12 09:38:54
【问题描述】:
我需要验证包含多个值的消息的签名。我拥有的唯一参数是签名、公钥和值本身。用于创建签名的算法是 192 位的椭圆曲线密码术。我已经尝试在网上找到代码示例,但我没有找到任何适用于此案例的代码。
有没有人使用 java 验证这个算法的经验?能否提供代码或示例链接?
感谢您的帮助!
【问题讨论】:
标签: java security digital-signature jce elliptic-curve
我需要验证包含多个值的消息的签名。我拥有的唯一参数是签名、公钥和值本身。用于创建签名的算法是 192 位的椭圆曲线密码术。我已经尝试在网上找到代码示例,但我没有找到任何适用于此案例的代码。
有没有人使用 java 验证这个算法的经验?能否提供代码或示例链接?
感谢您的帮助!
【问题讨论】:
标签: java security digital-signature jce elliptic-curve
你那里的信息有点少......
有几种使用椭圆曲线的签名方案,但最普遍(到目前为止)是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 签名正式包含两个整数值,通常称为 r 和 s(也是 192 位整数)。同样,您拥有的签名可能是一个字节序列,它是两个整数的编码。有两种常见的编码,一种是两个值的原始大端无符号编码(因此是 48 字节签名),另一种使用 ASN.1(用于长度为 53 或 54 字节左右的签名)。
正如@Ashkan 建议的那样,使用Bouncy Castle 是个好主意。但是,正如您所看到的,对于您的情况,有很多假设要做。如果您想彻底了解正在发生的事情,请购买一份ANSI X9.62:2005(ECDSA 标准)的副本。请注意,数学内容非常繁重。
【讨论】:
【讨论】: