我需要验证包含多个值的消息的签名。我拥有的唯一参数是签名、公钥和值本身。用于创建签名的算法是 192 位的椭圆曲线密码学。我已经尝试在网上找到代码示例,但没有找到适合这种情况的任何内容。
有没有人用过这个算法用java验证?您能否提供代码或示例链接?
感谢您的帮助!
最佳答案
你那里的信息有点不足......
有几种使用椭圆曲线的签名方案,但(到目前为止)使用最广泛的是 ECDSA .那么您必须担心以下几点:
签名对位序列进行操作。每个数据位都必须正确。在这里,您有“值”,因此必须将这些值编码为一系列位(或字节)。要验证签名,您必须使用与用于生成签名的编码相同的编码。
ECDSA 首先使用 cryptographic hash function 对输入数据进行哈希处理.同样,您必须使用与用于生成签名的相同的签名。作为一个疯狂的猜测,我会说哈希函数可能是 SHA-1 .
ECDSA 在 elliptic curve 中运行.曲线大小 不足以定义曲线:有许多 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 字节左右的签名)。
使用 Bouncy Castle ,正如@Ashkan 所建议的那样,是个好主意。但是,如您所见,有很多关于您的情况的假设。如果您想彻底了解正在发生的事情,请购买一份 ANSI X9.62:2005 (ECDSA 标准)。请注意,数学内容非常沉重。
关于java - 使用椭圆曲线加密验证签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7385882/