一、ECDSA概述

椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准。

它在1998年既已为ISO所接受,并且包含它的其他一些标准亦在ISO的考虑之中。与普通的离散对数问题(discrete logarithm problem DLP)和大数分解问题(integer factorization problem IFP)不同,椭圆曲线离散对数问题(elliptic curve discrete logarithm problem ECDLP)没有亚指数时间的解决方法。因此椭圆曲线密码的单位比特强度要高于其他公钥体制。

数字签名算法(DSA)在联邦信息处理标准FIPS中有详细论述,称为数字签名标准。它的安全性基于素域上的离散对数问题。椭圆曲线密码(ECC)由Neal Koblitz和Victor Miller于1985年发明。它可以看作是椭圆曲线对先前基于离散对数问题(DLP)的密码系统的模拟,只是群元素由素域中的元素数换为有限域上的椭圆曲线上的点。

椭圆曲线密码体制的安全性基于椭圆曲线离散对数问题(ECDLP)的难解性。椭圆曲线离散对数问题远难于离散对数问题,椭圆曲线密码系统的单位比特强度要远高于传统的离散对数系统。因此在使用较短的密钥的情况下,ECC可以达到于DL系统相同的安全级别。这带来的好处就是计算参数更小,密钥更短,运算速度更快,签名也更加短小。因此椭圆曲线密码尤其适用于处理能力、存储空间、带宽及功耗受限的场合。

二、ECDSA原理

ECDSA是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。

签名过程如下:

1、选择一条椭圆曲线Ep(a,b),和基点G;
2、选择私有密钥k(k<n,n为G的阶),利用基点G计算公开密钥K=kG;
3、产生一个随机整数r(r<n),计算点R=rG;
4、将原数据和点R的坐标值x,y作为参数,计算SHA1做为hash,即Hash=SHA1(原数据,x,y);
5、计算s≡r - Hash * k (mod n)
6、r和s做为签名值,如果r和s其中一个为0,重新从第3步开始执行

验证过程如下:

1、接受方在收到消息(m)和签名值(r,s)后,进行以下运算
2、计算:sG+H(m)P=(x1,y1), r1≡ x1 mod p。
3、验证等式:r1 ≡ r mod p。
4、如果等式成立,接受签名,否则签名无效。

三、JDK中对于ECDSA的实现

特别注意的是:ECDSA签名算法,只是在JDK1.7之后才有实现,最常见的场景是在微软的产品的安装的产品密钥的设计

1、KeyPairGenerator

KeyPairGenerator 类用于生成公钥和私钥对。密钥对生成器是使用 getInstance 工厂方法(返回一个给定类的实例的静态方法)构造的。

特定算法的密钥对生成器可以创建能够与此算法一起使用的公钥/私钥对。它还可以将特定于算法的参数与每个生成的密钥关联。

有两种生成密钥对的方式:与算法无关的方式和特定于算法的方式。

下面我们将按照指定ECDSA算法去生成秘钥KeyPairGenerator.getInstance(“EC”);

2、ECDSAPublicKey

ECDSA公用密钥的接口

3、ECDSAPublicKey

ECDSA 专用密钥的接口

4、PKCS8EncodedKeySpec

PKCS8EncodedKeySpec类继承EncodedKeySpec类,以编码格式来表示私钥。
PKCS8EncodedKeySpec类使用PKCS#8标准作为密钥规范管理的编码格式

5、Signature

Signature 类用来为应用程序提供数字签名算法功能。数字签名用于确保数字数据的验证和完整性。

在所有算法当中,数字签名可以是 NIST 标准的 ECDSA,它使用 ECDSA 和 SHA-1。可以将使用 SHA-1 消息摘要算法的 ECDSA 算法指定为SHA1withECDSA。

四、实现

其中ECDSA的实现步骤类似于我们之前学习的RSA数字签名算法。

实现步骤

第一步:初始化化秘钥组,生成ECDSA算法的公钥和私钥
第二步:执行私钥签名, 使用私钥签名,生成私钥签名
第三步:执行公钥签名,生成公钥签名
第四步:使用公钥验证私钥签名
备注:所谓的公钥与私钥匙成对出现。 遵从的原则就是“私钥签名、公钥验证”。

示例代码如下:

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;/*** 椭圆曲线签名算法* * 速度快 强度高 签名短* * 实现方 JDK1.7/BC*/
public class ECDSAUtil {private static String str = "hello";public static void main(String[] args) {jdkECDSA();}public static void jdkECDSA() {try {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");keyPairGenerator.initialize(256);KeyPair keyPair = keyPairGenerator.generateKeyPair();ECPublicKey ecPublicKey = (ECPublicKey) keyPair.getPublic();ECPrivateKey ecPrivateKey = (ECPrivateKey) keyPair.getPrivate();// 2.执行签名PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());KeyFactory keyFactory = KeyFactory.getInstance("EC");PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Signature signature = Signature.getInstance("SHA1withECDSA");signature.initSign(privateKey);signature.update(str.getBytes());byte[] sign = signature.sign();// 验证签名X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());keyFactory = KeyFactory.getInstance("EC");PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);signature = Signature.getInstance("SHA1withECDSA");signature.initVerify(publicKey);signature.update(str.getBytes());boolean bool = signature.verify(sign);System.out.println(bool);} catch (Exception e) {e.printStackTrace();}}
}

五、ECDSA标准

ECDSA的标准和标准草案有很多,其中已经过颁发部门批准的有:ANSI X9.62 ,FIPS 186-2,IEEE 1363-2000,ISO 14888-3。ECDSA也被密码标准化组织(SECG,这是一个从事密码标准通用性潜力研究的组织)加以标准化。

主要的ECDSA标准如下:

1.ANSI X9.62

该项目始于1995年,并于1999年正式作为ANSI标准颁布。ANSI X9.62具有高安全性和通用性。它的基域可以是Fp,也可以是F2m。F2m中的元素可以以多项式形式或正规基形式来表示。若用多项式形式,ANSI X9.62要求模多项式为不可约三项式,标准中提供了一些不可约三项式,另外还给出了一个不可约五项式。为了提高通用性,针对每一个域提供了一个模多项式。若使用正规基表示方法,ANSI X9.62规定使用高斯正规基。椭圆曲线最主要的安全因素是n,即基点阶,ANSI X9.62的n大于2160。椭圆曲线是使用随机方法选取的。ANSI X9.62规定使用以字节为单位的字符串形式来表示曲线上的点,ASN.1语法可以清楚地描述域参数,公钥和签名。

2.FIPS 186-2

1997年,NIST开始制定包括椭圆曲线和RSA签名算法的FIPS 186标准。1998年,NIST推出了FIPS186,它包括RSA与DSA数字签名方案,这个方案也称为FIPS 186-1。1999年NIST又面向美国G0vment推出了15种椭圆曲线。这些曲线都遵循ANSI X9.62和IEEE 1363-2000的形式。2000年,包含ANSI X9.62中说明的ECDSA,使用上述曲线的FIPS 186-2问世。

3、IEEE 1363-2000

该标准于2000年作为IEEE标准问世。IEEE 1363的覆盖面很广,包括公钥加密,密钥协商,基于IFP、DLP、ECDLP的数字签名。它与ANSI X9.62和FIPS 186完全不同,它没有最低安全性限制(比如不再对基点阶进行限制),用户可以有充分的自由。
因此IEEE 1363-2000并不是一个安全标准,也不具有良好的通用性,它的意义在于给各种应用提供参照。它的基域可以是,也可以是。 中的元素可以以多项式形式或正规基形式来表示。中元素表示形式是整数,中元素表示形式是字符串。这与ANSI X9. 62和FIPS 186是一致的。

4.ISO/IEC 14888-3

这个标准包含若干签名算法,其中ECDSA部分与ANSI X9.62一致。
如果大家有兴趣可以研究下,ECDSA算法在比特币中用法。

ECDSA数字签名算法相关推荐

  1. ECDSA数字签名算法(java实现ECDSA签名验签)

    一.ECDSA概述 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟.ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准.它在 ...

  2. mbedtls | 09 - 数字签名算法的配置与使用(RSA数字签名算法、ECDSA数字签名算法)

    mbedtls系列文章 mbedtls | 01 - 移植mbedtls库到STM32的两种方法 mbedtls | 02 - 伪随机数生成器(ctr_drbg)的配置与使用 mbedtls | 03 ...

  3. Java之数字签名算法

    目录 数字签名算法概述 数字签名算法--RSA DSA算法列表:MD.SHA两类 主要流程:​ 代码实现: 数字签名算法--DSA DSA算法列表: 主要流程: 代码实现: 数字签名算法--ECDSA ...

  4. 椭圆曲线数字签名算法(ECDSA)

    一. 椭圆曲线加密算法 简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法.相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全,RSA加密算法也是一种非对称加密算法,在 ...

  5. ecdsa JAVA 私钥推导公钥_ECDSA(椭圆曲线数字签名算法)

    ECDSA(Elliptic Curve Digital Signature Algorithm) 一.学习背景--数字签名 在现实工作和生活中,我们使用签名的方式表达对一份文件的认可,其他人可以识别 ...

  6. 数字签名算法ECDSA

    一 介绍 ECDSA:Elliptic Curv Digstal Signature Algorithm 椭圆曲线数字签名算法. 速度快.强度高.签名短 二 参数说明 三 代码实现 package c ...

  7. 算法2_非对称加密算法之ECDSA(椭圆曲线数字签名算法)

    ECDSA(椭圆曲线数字签名算法) AES(高级加密标准): =>对称加密 ​ 对业务数据进行加密,防止他人可以看见 ECDSA(椭圆曲线数字签名算法):=>非对称加密算法(公钥和私钥) ...

  8. 高级数字签名之椭圆曲线数字签名算法(ECDSA)

    @TOC 1. 算法简述 该算法是微软操作系统及办公软件的序列号验证算法. ECDSA(Elliptic Curve Digital Signature Algorithm, 椭圆曲线数字签名算法) ...

  9. 区块链应用:椭圆曲线数字签名算法ECDSA

    1 椭圆曲线密码学 椭圆曲线密码学(Elliptic Curve Cryptography,缩写ECC),是基于椭圆曲线数学理论实现的一种非对称加密算法.椭圆曲线在密码学中的使用是在1985年有Nea ...

最新文章

  1. 【官网搭建】在网站首页底部添加备案号链接至工信部首页及版权所有。
  2. 微软云服务再添新产品,这次来自两位华裔女科学家创办的AI公司
  3. IPC$连接常见问答
  4. 编写第一个HADOOP应用程序
  5. 201671010128 2017-10-08《Java程序设计》之Lambda与内部类
  6. 导航栏iframe公共样式_中秋节微信公众号推文样式素材推荐
  7. c语言微秒级延迟程序,C语言中生产随机数及计算运行时间(微秒级)
  8. 千亿级照片,毫秒间匹配最佳结果,微软开源 Bing 搜索背后的关键算法!
  9. HDU2079 选课时间【母函数】
  10. 机器学习实战 Tricks
  11. C# 字段、属性、成员变量
  12. 基于SSM的大学生兼职平台
  13. 【基础教程】基于matlab生成Word+PPT报告【含Matlab源码 971期】
  14. 谷歌大脑2017总结下篇:Jeff Dean梳理6大领域研究
  15. 雅诗兰黛公司宣布品牌集群领导层更新
  16. 学那么多东西有屁用,不如先建立自己的知识体系
  17. Mac小技巧—如何查看 Mac 的关机和重启历史
  18. Docker基础入门详解
  19. 2020腾讯视频实习生面试
  20. CloudCompare使用说明

热门文章

  1. ~4.1 剑指 Offer 05. 替换空格
  2. *5-1 CCF 2015-03-1 图像旋转
  3. 通过股票代码识别所属板块(20190730)
  4. Unity_触摸屏_实现360序列帧
  5. 网站服务器部署apk软件,供外网下载
  6. C++break语句用法
  7. 用友携YonSuite亮相云栖大会,全方位生态合作再提速
  8. Android头像上传--图片转base64,后台接收到的总是null问题
  9. 找出和为k的所有组合
  10. CTF 每日一题 Day44 rot