其实域就是一个会师

一、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和维克托米尔er于1985年表达。它能够作为是椭圆曲线对原先按照离散对数问题(DLP)的密码系统的模仿,只是群元素由素域中的元素数换为有限域上的椭圆曲线上的点。椭圆曲线密码体制的安全性基于椭圆曲线离散对数问题(ECDLP)的难解性。椭圆曲线离散对数问题远难于离散对数问题,椭圆曲线密码系统的单位比特强度要远超出传统的离散对数系统。因而在利用较短的密钥的场地下,ECC可以高达于DL系统一样的安全级别。这带来的裨益就是总结参数更小,密钥更短,运算速度更快,签名也越来越短小。因而椭圆曲线密码尤其适用于处理能力、存储空间、带宽及功耗受限的场馆

一、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)米尔er于1985年表明。它可以当作是椭圆曲线对往日依据离散对数问题(DLP)的密码系统的依样画葫芦,只是群元素由素域中的元素数换为有限域上的椭圆曲线上的点。椭圆曲线密码体制的安全性基于椭圆曲线离散对数问题(ECDLP)的难解性。椭圆曲线离散对数问题远难于离散对数问题,椭圆曲线密码系统的单位比特强度要远高于传统的离散对数系统。由此在使用较短的密钥的图景下,ECC可以直达于DL系统一样的安全级别。这带来的益处就是测算参数更小,密钥更短,运算速度更快,签名也进一步短小。因而椭圆曲线密码尤其适用于处理能力、存储空间、带宽及功耗受限的场子

一、椭圆曲线的基本概念

简短的说椭圆曲线并不是椭圆,之所以称之为椭圆曲线是因为他俩是用两遍方程来表示,并且该方程与计量椭圆周长的方程相似。

   对密码学相比有意义的是依照素数域GF(p)和依据二进制域(GF(2^m))上的椭圆曲线。

   下面重点介绍基于GF(p)上的椭圆曲线:

                 y^2 º x^3 + a*x + b(modp)

 其中p是素数,a和b满足:4a^3 + 27b^2 (mod p) ¹ 0

 餍足上述方程的整数对(x, y), 就叫椭圆曲线上的点。

素数域

其实域就是一个聚集,在其上面举办加,减,乘,除运算而封闭。比如有理数集合,实数集合,复数集合,那个都是无限域,在密码学中从不什么样实际意义,所以考虑与整数有关的域,对密码学有实际意义。

研讨最多的就是素数域GF(p)。我的掌握就是一个素数p,在汇集[0…p-1]上定义一个模加,一个模乘,就组成了一个有限素数域,比如取p
= 5,定义如下模加, 模乘:

模加

+

0

1

2

3

4

0

0

1

2

3

4

1

1

2

3

4

0

2

2

3

4

0

1

3

3

4

0

1

2

4

4

0

1

2

3

模乘

+

0

1

2

3

4

0

0

0

0

0

0

1

0

1

2

3

4

2

0

2

4

1

3

3

0

3

1

4

2

4

0

4

3

2

1

下面以连续的椭圆曲线为例介绍一下椭圆曲线上

 的点的演算规则

  椭圆曲线上点的加法定义

    对于椭圆曲线上的擅自两点P(x1, y1),

      Q(x2, y2),R = (x3, y3), 其中R = P+Q

  具体讲述如下:

     X3 = K^2 – X1 – X2(modp)

     y3 = k(x1-x3) – y1 (modp)

  其中

  当P不等于Q时

     K = (y2 – y1)/(x2 – x1) (modp)

  当P等于Q时

    k = (3*x1^2 + a)/2*y1 (modp)

图片 1  图片 2

零元   

       对椭圆曲线上的妄动一点P(x1, y1), 有

      P + O = O + P = P

          如右图

负元

     -P = (x1, -y1)

     P – P = O

     O = -O

       其中O为无穷远点,一条与Y轴平行的直线

       只有一个无穷点O

纯量乘法

KP = P+P+P+…+P  K个P相加

图片 3

 

基于GF(p)上的椭圆曲线举例

P = 23, a = 1, b = 0

方程:y^2 = x^3 + x(mod23)

椭圆曲线上的点:

(0,0) (1,5) (1,18) (9,5) (9,18) (11,10) (11,13) (13,5)

(13,18) (15,3) (15,20) (16,8) (16,15) (17,10) (17,13) (18,10)

(18,13) (19,1) (19,22) (20,4) (20,19) (21,6) (21,17)

和无穷远点O构成椭圆曲线上的加法群

其点运算规则和地点讲到的连日椭圆曲线

上的运算规则是一律的

图片 4

二、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、假如等式成立,接受签约,否则签名无效。
 

二、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、假设等式成立,接受签约,否则签名无效。
 

二、椭圆曲线离散对数在密码中的应用

公钥密码算法总要基于一个数学难题,比如RSA的基于是给定五个数p,
q很容易相乘得到N, 而对n举行因式分解则相对忙绿的多。椭圆曲线密码体制(ECC)采用的数学难题则是求椭圆曲线加法群的离散对数问题,具体描述如下:

Q = kG

里头Q为椭圆曲线上的点, G为椭圆曲线上的侧重点,k 为小于n的平头,n为G的阶即,
nG = O

遵照上节涉嫌的纯量乘法知道k, G不难求出Q, 然则给定Q,
G求k就相对坚苦了,这就叫椭圆曲线加法群上的离散对数问题。

   上述整数k,就是ECC私钥, Q为公钥, 可以动用此密钥对展开加密,解密,签名,验证等国有钥运算。

  依据上节关系的纯量乘法知道k, G不难求出Q, 可是给定Q,
G求k就相对艰巨了,这就叫椭圆曲线加法群上的离散对数问题。

   上述整数k,就是ECC私钥, Q为公钥, 可以动用此密钥对拓展加密,解密,签名,验证等公共钥运算。

三、JDK中对于ECDSA的实现

特别注意的是:ECDSA签名算法,只是在JDK1.7事后才有落实,最普遍的意况是在微软的制品的装置的制品密钥的规划

三、JDK中对于ECDSA的实现

特别注意的是:ECDSA签名算法,只是在JDK1.7过后才有落实,最广泛的景色是在微软的产品的安装的出品密钥的计划

三、ECDSA简单介绍

下面简单介绍一下依照GF(p)的椭圆曲线数字签名算法(ECDSA)

准备数据: h(待签名Hash值),公钥Q,私钥d

签字过程:

1. 取舍一个任意数k;

2. 测算k = kmodn, 假如k =0再次来到第1步重新接纳;

3. 计算kG = (x1, y1);

4. 计算r = x1mondn;

5. 如果r = 0返回第2步;

6. 计算s = k^-1*(h+ dr )modn;

7. 如果s = 0, 返回第2步;

内部(r, s)为签署结果。

表达过程:

 1. 表明1=<r<=n-1, 若不树立重临false

 2. 讲明1=<s<=n-1, 若不树立再次回到false

 3. 计算c = s^-1modn

 4. 计算u1 = e’*c modn, u2 = r*c mon n

 5. 计算u1*G+u2*Q = (x1, y1), 如果(x1, y1)为O 返回false

 6. 计算v = x1modn;

 7. 如果r != v 返回false

 8. 返回true

1、KeyPairGenerator

KeyPairGenerator 类用于转移公钥和私钥对。密钥对生成器是使用 getInstance
工厂方法(重回一个给定类的实例的静态方法)构造的。
一定算法的密钥对生成器可以创设能够与此算法一起使用的公钥/私钥对。它还足以将一定于算法的参数与各类生成的密钥关联。
有两种生成密钥对的章程:与算法无关的章程和一定于算法的措施。
 

下边我们将依照指定ECDSA算法去变通秘钥KeyPairGenerator.getInstance(“EC”);

1、KeyPairGenerator

KeyPairGenerator 类用于转移公钥和私钥对。密钥对生成器是应用 getInstance
工厂方法(重回一个给定类的实例的静态方法)构造的。
一定算法的密钥对生成器可以创造可以与此算法一起使用的公钥/私钥对。它还足以将一定于算法的参数与每个生成的密钥关联。
有三种生成密钥对的模式:与算法无关的形式和一定于算法的方法。
 

下面大家将遵照指定ECDSA算法去变通秘钥KeyPairGenerator.getInstance(“EC”);

四、 ECC与RSA的比较

椭圆曲线加密技术(ECC)是起家在单向函数(椭圆曲线离散对数)得基础上,由于它比RAS使用得离散对数要复杂得多。而且该单向函数比RSA得要难。

如160位ECC与1024位RSA有同等的平安强度。而210位ECC则与2048bitRSA所有同等的白山强度

总计量小,处理速度快即便在RSA中能够通过挑选较小的公钥(可以小到3)的措施提升公钥处理速度,即加强加密和签署验证的速度,使其在加密和签约验证速度上与ECC有可比性,但在私钥的处理速度上(解密和签字),ECC远比RSA、DSA快得多。由此ECC总的速度比RSA、DSA要快得多。

储存空间占据小ECC的密钥尺寸和系统参数与RSA、DSA相相比较要小得多,意味着它所占的存贮空间要小

2、ECDSAPublicKey

ECDSA公用密钥的接口

2、ECDSAPublicKey

ECDSA公用密钥的接口

3、ECDSAPublicKey

 ECDSA 专用密钥的接口

3、ECDSAPublicKey

 ECDSA 专用密钥的接口

4、PKCS8EncodedKeySpec

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

4、PKCS8EncodedKeySpec

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

5、Signature

Signature
类用来为应用程序提供数字签名算法效能。数字签名用于确保数字数据的辨证和完整性。
 
在所有算法当中,数字签名可以是 NIST 标准的 ECDSA,它接纳 ECDSA 和
SHA-1。可以将应用 SHA-1 音信摘要算法的 ECDSA 算法指定为SHA1withECDSA。
 

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的落实步骤类似于我们事先学习的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标准

ECDSA的业内和正式草案有众多,其中已透过颁发部门认同的有:ANSI X9.62 ,FIPS
186-2,IEEE 1363-2000,ISO 14888-3。ECDSA也被密码标准化协会(SECG,那是一个从业密码标准通用性潜力啄磨的协会)加以规范。

 

主要的ECDSA标准

主要的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语法可以精晓地描述域参数,公钥和署名。
 

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问世。

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是如出一辙的。

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算法在比特币中用法。

4.ISO/IEC 14888-3

以此专业包含若干签约算法,其中ECDSA部分与ANSI X9.62一模一样。

假定我们有趣味可以研商下,ECDSA算法在比特币中用法。

相关文章