我需要验证包含多个值的消息的签名。我唯一的参数是签名,公钥和值本身。用于创建签名的算法是具有192位的椭圆曲线密码术。我已经尝试在网上找到代码示例,但我没有找到任何针对此案例的内容。
有没有人使用java验证此算法?您能否提供代码或示例链接?
感谢您的帮助!
答案 0 :(得分:5)
你的信息有点短......
有几种签名方案使用椭圆曲线,但最广泛的(到目前为止)是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字节的签名,左右)。 p>
@Ashkan建议,使用Bouncy Castle是一个好主意。但是,正如您所看到的,对您的情况有很多假设。如果您想彻底了解正在发生的事情,请购买ANSI X9.62:2005(ECDSA标准)的副本。请注意,数学内容非常繁重。
答案 1 :(得分:0)