java - 使用椭圆曲线加密验证签名

标签 java security digital-signature jce elliptic-curve

我需要验证包含多个值的消息的签名。我拥有的唯一参数是签名、公钥和值本身。用于创建签名的算法是 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 签名形式上由两个整数值组成,通常称为 rs(也是 192 位整数)。同样,您拥有的签名可能是一个字节序列,它是两个整数的编码。有两种常见的编码,一种是两个值的原始大端无符号编码(因此是 48 字节的签名),另一种使用 ASN.1(对于长度为 53 或 54 字节左右的签名)。

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

关于java - 使用椭圆曲线加密验证签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7385882/

相关文章:

java - 在java中创建条形码图像?

android - ObjectOutputStream:这安全吗?

java - 在 Android 上验证数字签名

java - 检查 PDFBox v2.x.x 签名后 PDF 表单是否发生更改

JAVA服务提供者SAML2请求-禁用数字签名

java - <s :form> to decide in the action class 中的两个按钮

java - 如何选择使用哪个 JDBC 驱动程序?

JPA 事务中的 java.lang.UnsupportedOperationException

asp.net - SSO 的实现有哪些潜在的安全问题?

security - 允许用户稍后添加密码的身份验证系统?