ECDSA算法原理及python实现

一、基本知识

1.1 概述

椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟,其安全性基于椭圆曲线离散对数问题。椭圆曲线离散对数问题远远难于离散对数问题,因此椭圆曲线密码系统的单位比特强度要远高于传统的离散对数系统。在使用较短的密钥的情况下,ECC便可达到于DL系统相同安全级别,拥有计算参数小、密钥短、运算速度快等优势。

1.2 椭圆曲线上的计算

密码学中,常用以下形式的椭圆曲线:E:y2=x3+ax+b(modp)E: y^2= x^3+ax+b(mod\ p)E:y2=x3+ax+b(mod p) 同时要求4a3+27b2≠04a^3+27b^2 ≠04a3+27b2​=0。其中p为一个大素数,a、b、x和y均在有限域GF(p)GF(p)GF(p)中,即从{0,1,⋅⋅⋅,p−1}\{0,1,···,p-1\}{0,1,⋅⋅⋅,p−1}中取值。该曲线常用Ep(a,b)E_{p}(a,b)Ep​(a,b)表示。若该曲线上只有有限个离散点,设为N个,则椭圆曲线的阶为N。N越大,椭圆曲线安全性越高。椭圆曲线的阶可通过schoof算法计算求得。
椭圆曲线E:y2=x3−x+1E: y^2= x^3-x +1E:y2=x3−x+1图形如下:


加法规则

椭圆曲线Ep(a,b)E_{p}(a,b)Ep​(a,b)在如下定义的加法规则构成Abel群(交换群)。

  • O+O=OΟ + Ο = ΟO+O=O
  • ∀P=(x,y)∈Ep(a,b)∀P=(x,y)∈E_{p}(a,b)∀P=(x,y)∈Ep​(a,b),有P+O=O+P=PP +Ο =Ο + P = PP+O=O+P=P
  • ∀P=(x,y)∈Ep(a,b)∀P=(x,y)∈E_{p}(a,b)∀P=(x,y)∈Ep​(a,b),有P+(−P)=OP + (-P) =ΟP+(−P)=O,PPP的逆为−P=(x,−y)-P = (x,-y)−P=(x,−y)
  • ∀P=(x1,y1),Q=(x2,y2)∈Ep(a,b)∀P=(x_{1},y_{1}),Q=(x_{2},y_{2})∈E_{p}(a,b)∀P=(x1​,y1​),Q=(x2​,y2​)∈Ep​(a,b),则 P+Q=R=(x3,y3)∈Ep(a,b)P + Q = R = (x_{3},y_{3})∈E_{p}(a,b)P+Q=R=(x3​,y3​)∈Ep​(a,b),其中x3=λ2−x1−x2,y3=λ(x1−x3)−y1x_3=λ^2-x_1-x_2 ,y_3=λ(x_1-x_3 )-y_1x3​=λ2−x1​−x2​,y3​=λ(x1​−x3​)−y1​。

  • 相同点相加计算R点

    • 不同点相加计算R点
乘法规则
  • ∀k∈Z,∀P∈Ep(a,b)∀k∈Z,∀P∈E_p (a,b)∀k∈Z,∀P∈Ep​(a,b),有kP=P+⋅⋅⋅+P(k个P相加)kP=P+···+P(k个P相加)kP=P+⋅⋅⋅+P(k个P相加);
  • ∀s,t∈Z,∀P∈Ep(a,b)∀s,t∈Z, ∀P∈E_p (a,b)∀s,t∈Z,∀P∈Ep​(a,b),有(s+t)P=sP+tP,s(tP)=(st)P(s+t)P=sP+tP,s(tP)=(st)P(s+t)P=sP+tP,s(tP)=(st)P

除了无限远的点OΟO外,椭圆曲线EEE任何可以生成所有点的点都可视为EEE的生成元,但并非EEE上所有点都可为生成元。
如何选取生成元

  • 首先分解椭圆曲线阶n=r×pn = r × pn=r×p,p需要足够大。
  • 令k=n/pk= n/pk=n/p,随机选取 X∈Ep(a,b)X∈E_p (a,b)X∈Ep​(a,b),计算G=k⋅XG = k ·XG=k⋅X
  • 若G≠OG ≠ ΟG​=O,则GGG可为生成元否则重新选择XXX再次计算。

二、算法细节

2.1 公私钥产生算法(KeyGenKeyGenKeyGen):

  • 选择一条椭圆曲线Ep(a,b)E_{p}(a,b)Ep​(a,b) 和基点GGG;
  • 选择私钥dAd_{A}dA​(dA<nd_{A}<ndA​<n,nnn为该GGG的阶),利用基点GGG计算公钥QA=dA⋅GQ_{A}=d_{A} · GQA​=dA​⋅G;

2.2 签名生成算法(SignSignSign)

  • 选择一个随机整数k(k<n)k(k<n)k(k<n),计算点P=k⋅G=(x1,y1)P=k·G=(x_{1},y_{1})P=k⋅G=(x1​,y1​);
  • 令r=x1r=x_{1}r=x1​;
  • 计算z=hash(m)z=hash(m)z=hash(m),哈希函数可选择SHA−2SHA-2SHA−2;
  • 计算s=k−1(z+rdA)(modn)s=k^{-1} (z+rd_A ) (mod \ n)s=k−1(z+rdA​)(mod n);
  • 得到签名(r,s),如果r或s其中任意一方为0则重新选择随机数k再次计算

2.3 签名验证算法(Verify):

  • 计算z=hash(m)z=hash(m)z=hash(m);
  • 计算u1=zs−1modn,u2=rs−1modnu_1= zs^{-1} mod n,u_2= rs^{-1} mod\ nu1​=zs−1modn,u2​=rs−1mod n;
  • 计算点(x1,y1)=u1⋅G+u2⋅QA(x_1,y_1 )= u_1 ·G+ u_2·Q_A(x1​,y1​)=u1​⋅G+u2​⋅QA​;
  • 验证等式:r≡x1modnr ≡ x_1 mod\ nr≡x1​mod n;
  • 如果等式成立输出1,否则输出0。

三、python实现

  • 库安装:pip install ecdsa
  • 代码实现仓库

密码学——ECDSA签名算法相关推荐

  1. java 签名 ecdsa_Java实现ECDSA签名算法

    ECDSA签名算法 package com.albedo.security; /** * DSA 加解密实现 */ public class ECDSAUtils extends Base { //字 ...

  2. java ecdsa_Java实现ECDSA签名算法

    ECDSA签名算法 package com.albedo.security; /** * DSA 加解密实现 */ public class ECDSAUtils extends Base { //字 ...

  3. 密码学——Schnorr签名算法

    一.基本知识 1.1 概述 Schnorr签名算法最初是由德国密码学家ClausSchnorr于2008年提出的,在密码学中,它是一种数字签名方案,以其简单高效著称,其安全性基于某些离散对数问题的难处 ...

  4. ECDSA数字签名算法

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

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

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

  6. 密码学和加密数字货币的简介

    所有货币都需要一些方法来控制供应,并强制执行各种安全属性以防止作弊.在法定货币方面,像中央银行这样的组织控制货币供应量,并对实体货币增加防伪功能.这些安全功能提高了对攻击者的防范能力,但是他们不可能不 ...

  7. 密码学–数字签名Digital Signature五种分类

    密码学–数字签名Digital Signature五种分类 基于数字签名用途的分类 基于数学难题的分类 基于密码体制的分类 基于数字签名安全性的分类 基于签名用户的个数分类 A. 基于数字签名用途的分 ...

  8. Web3.0 · 基础层技术 · SCQA模型趣谈密码学

    [小木箱成长营]密码学系列教程: Web3.0 · 基础层技术 ·密码学在移动端应用与实践 一.序言 Hello,我是小木箱,欢迎来到小木箱成长营密码学系列教程,今天将分享 Web3.0 · 基础层技 ...

  9. CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲

    前言 密码学为数据的处理.存储和通信过程提供附加的安全级别.近年来,数学家和计算机科学家开发了一系列日益复杂的算法,这些算法被设计用于确保机密性.完整性.身份认证和不可否认性.在密码学家花费大量时间开 ...

最新文章

  1. get 和 post
  2. 【转】常见浏览器兼容性问题与解决方案css篇
  3. UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)
  4. c语言如何控制上位机界面大小,电机上位机控制及界面设计参考.doc
  5. vue基础18(vue-cli脚手架项目中组件的使用)
  6. CACTI实现飞信报警
  7. GDAL对空间数据的管理
  8. jquery中常见的标题内容之间的切换
  9. android sqlite SQLiteDatabase
  10. mybatis学习第一次使用
  11. linux将pdf转为png,将多页PDF转换为PNG并返回(Linux)
  12. 新冠疫情分析(疫情数据爬取+数据分析+网页排版展示)
  13. 两台计算机直接相连教程,两台电脑怎么连接一起_如何让两台电脑相连-win7之家...
  14. ASP.NET Core WebApi返回结果统一包装实践
  15. SDI科普--- SD-SDI/HD-SDI/3G-SDI/12G-SDI
  16. paperJS中使用lab,lch等颜色
  17. 巧妙利用DZ自有功能实现豆丁网在线文档功能
  18. matlab标定不是棋盘格,matlab 标定提取棋盘格角点调整参数
  19. Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云
  20. 洛谷 [P1638 逛画展] (尺取法)

热门文章

  1. 基于iBeacon的智慧旅游解决方案
  2. x86服务器(HP/DELL/IBM)测试分析(上)
  3. C语言编写扫雷游戏【W5+字详细教学版,包教包会】
  4. pdf.js 实现阅读pdf文件
  5. 数值分析复化梯形公式matlab,数值分析复化梯形公式,复化Simpson公式MATLAB程序
  6. 帝国cms 数据恢复mysql_帝国cms系统数据库恢复详细教程(图文)
  7. [python]抓取啄木鸟社区《活学活用wxPython》内容与图片
  8. 家用路由器选购指南基于2019年5月(一)
  9. Python之文件和数据格式化学习笔记
  10. Python读写mat文件