兄弟连区块链教程Fabric1.0源代码分析ECDSA椭圆曲线数字签名算法

简介:

  区块链教程Fabric1.0源代码分析ECDSA椭圆曲线数字签名算法,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。

Fabric 1.0源代码笔记 之 ECDSA(椭圆曲线数字签名算法)

1、椭圆曲线算法概述

1.1、无穷远点、无穷远直线、射影平面

  • 平行线相交于无穷远点;
  • 直线上有且只有一个无穷远点;
  • 一组相互平行的直线有公共的无穷远点;
  • 平面上任何相交的两直线,有不同的无穷远点;
  • 全部无穷远点沟通一条无穷远直线;
  • 平面上全部无穷远点和全部普通点构成射影平面。

1.2、射影平面点定义

对于普通平面上点(x, y),令x=X/Z,y=Y/Z,Z≠0,则投影为射影平面上的点为(X : Y : Z)。
如点(1,2)在射影平面的坐标为:(Z : 2Z : Z) Z≠0,即(1 : 2 : 1)或(2 : 4 : 2)均为(1, 2)在射影平面上的点。
Z=0时,(X : Y : 0)即为无穷远点,Z=0即为无穷远直线。

1.3、椭圆曲线方程

椭圆曲线的定义:
一条椭圆曲线是在射影平面上满足方程Y²Z+a1XYZ+a3YZ²=X³+a2X²Z+a4XZ²+a6Z³的所有点的集合,且曲线上的每个点都是非奇异(或光滑)的。
该方程为维尔斯特拉斯方程,是一个齐次方程。
所谓“非奇异”或“光滑”的,即满足方程的任意一点都存在切线。

椭圆曲线存在无穷远点(0, Y, 0),可以在平面坐标系中用椭圆曲线、加一个无穷远点来表示。
令x=X/Z,y=Y/Z,代入椭圆曲线方程,即椭圆曲线普通方程:y²+a1xy+a3y = x³+a2x²+a4x+a6。

1.4、椭圆曲线上的加法

任意取椭圆曲线上两点P、Q (若P、Q两点重合,则做P点的切线)做直线交于椭圆曲线的另一点R’,过R’做y轴的平行线交于R。我们规定P+Q=R。

根据这个法则,可以知道椭圆曲线无穷远点O∞与椭圆曲线上一点P的连线交于P’,过P’作y轴的平行线交于P,所以有 无穷远点 O∞+ P = P 。
这样,无穷远点 O∞的作用与普通加法中零的作用相当(0+2=2),我们把无穷远点 O∞ 称为 零元。同时我们把P’称为P的负元(简称,负P;记作,-P)。

根据这个法则,可以得到如下结论 :如果椭圆曲线上的三个点A、B、C,处于同一条直线上,那么他们的和等于零元,即A+B+C= O∞ 。
k个相同的点P相加,我们记作kP。如:P+P+P = 2P+P = 3P。

1.5、有限域椭圆曲线

椭圆曲线是连续的,并不适合用于加密;所以,我们必须把椭圆曲线变成离散的点,我们要把椭圆曲线定义在有限域上。

  • 我们给出一个有限域Fp
  • Fp中有p(p为质数)个元素0,1,2,…, p-2,p-1
  • Fp的加法是a+b≡c(mod p)
  • Fp的乘法是a×b≡c(mod p)
  • Fp的除法是a÷b≡c(mod p),即 a×b^(-1)≡c (mod p),b^(-1)也是一个0到p-1之间的整数,但满足b×b^(-1)≡1 (mod p)
  • Fp的单位元是1,零元是0

同时,并不是所有的椭圆曲线都适合加密。y²=x³+ax+b是一类可以用来加密的椭圆曲线,也是最为简单的一类。
下面我们就把y²=x³+ax+b这条曲线定义在Fp上:

选择两个满足下列条件的小于p(p为素数)的非负整数a、b,4a³+27b²≠0 (mod p) 。
则满足下列方程的所有点(x,y),再加上 无穷远点O∞ ,构成一条椭圆曲线。
y²=x³+ax+b (mod p) 其中 x,y属于0到p-1间的整数,并将这条椭圆曲线记为Ep(a,b)。

Fp上的椭圆曲线同样有加法,但已经不能给以几何意义的解释。

无穷远点 O∞是零元,有O∞+ O∞= O∞,O∞+P=P 
P(x,y)的负元是 (x,-y),有P+(-P)= O∞ 
P(x1,y1),Q(x2,y2)的和R(x3,y3) 有如下关系: 
  x3≡k2-x1-x2(mod p) 
  y3≡k(x1-x3)-y1(mod p) 
  其中若P=Q 则 k=(3x1²+a)/2y1  若P≠Q,则k=(y2-y1)/(x2-x1)

例 已知E23(1,1)上两点P(3,10),Q(9,7),求1)-P,2)P+Q,3) 2P。

1)  –P的值为(3,-10) 
2)  k=(7-10)/(9-3)=-1/2,2的乘法逆元为12 因为2*12≡1 (mod 23) 
    k≡-1*12 (mod 23) 故 k=11。 
    x=112-3-9=109≡17 (mod 23); 
    y=11[3-(-6)]-10=89≡20 (mod 23) 
    故P+Q的坐标为(17,20) 
3)  k=[3(3²)+1]/(2*10)=1/4≡6 (mod 23) 
    x=62-3-3=30≡20 (mod 23) 
    y=6(3-7)-10=-34≡12 (mod 23) 
    故2P的坐标为(7,12) 

如果椭圆曲线上一点P,存在最小的正整数n,使得数乘nP=O∞,则将n称为P的阶,若n不存在,我们说P是无限阶的。
事实上,在有限域上定义的椭圆曲线上所有的点的阶n都是存在的。

1.6、椭圆曲线上简单的加密/解密

考虑如下等式:
K=kG [其中 K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数]。
不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相对困难了。
这就是椭圆曲线加密算法采用的难题。
我们把点G称为基点(base point),k(k

2、椭圆曲线接口及实现

2.1、椭圆曲线接口定义

type Curve interface {
    Params() *CurveParams //返回曲线参数
    IsOnCurve(x, y *big.Int) bool //(x,y)是否在曲线上
    Add(x1, y1, x2, y2 *big.Int) (x, y *big.Int) //(x1,y1)和(x2,y2)求和
    Double(x1, y1 *big.Int) (x, y *big.Int) //2*(x,y)
    ScalarMult(x1, y1 *big.Int, k []byte) (x, y *big.Int) //返回k*(Bx,By)
    ScalarBaseMult(k []byte) (x, y *big.Int) //返回k*G,其中G为基点
}
//代码在crypto/elliptic/elliptic.go

2.2、CurveParams结构体定义及通用实现

CurveParams包括椭圆曲线的参数,并提供了一个通用椭圆曲线实现。代码如下:

type CurveParams struct {
    P       *big.Int //% p中的p
    N       *big.Int //基点的阶,如果椭圆曲线上一点P,存在最小的正整数n,使得数乘nP=O∞,则将n称为P的阶
    B       *big.Int //曲线方程中常数b,如y² = x³ - 3x + b
    Gx, Gy  *big.Int //基点G(x,y)
    BitSize int      //基础字段的大小
    Name    string   //椭圆曲线的名称
}
//代码在crypto/elliptic/elliptic.go

CurveParams涉及如下方法:

func (curve *CurveParams) Params() *CurveParams //返回曲线参数,即curve
func (curve *CurveParams) IsOnCurve(x, y *big.Int) bool //(x,y)是否在曲线上
func (curve *CurveParams) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) //(x1,y1)和(x2,y2)求和
func (curve *CurveParams) Double(x1, y1 *big.Int) (*big.Int, *big.Int) //2*(x,y)
func (curve *CurveParams) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) //返回k*(Bx,By)
func (curve *CurveParams) ScalarBaseMult(k []byte) (*big.Int, *big.Int) //返回k*G,其中G为基点
//代码在crypto/elliptic/elliptic.go

2.3、几种曲线

func P224() Curve //实现了P-224的曲线
func P256() Curve //实现了P-256的曲线
func P384() Curve //实现了P-384的曲线
func P521() Curve //实现了P-512的曲线
//代码在crypto/elliptic/elliptic.go

3、椭圆曲线数字签名算法

结构体定义:

type PublicKey struct { //公钥
    elliptic.Curve
    X, Y *big.Int
}
type PrivateKey struct { //私钥
    PublicKey
    D *big.Int
}
type ecdsaSignature struct { //椭圆曲线签名
    R, S *big.Int
}
//代码在crypto/ecdsa/ecdsa.go

涉及如下方法:

func (priv *PrivateKey) Public() crypto.PublicKey //获取公钥
func (priv *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ([]byte, error) //使用私钥对任意长度的hash值进行签名
func GenerateKey(c elliptic.Curve, rand io.Reader) (*PrivateKey, error) //生成一对公钥/私钥
func Sign(rand io.Reader, priv *PrivateKey, hash []byte) (r, s *big.Int, err error) //使用私钥对任意长度的hash值进行签名
func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool //使用公钥验证hash值和两个大整数r、s构成的签名
//代码在crypto/ecdsa/ecdsa.go

感谢关注兄弟连区块链教程分享!

相关文章
|
20天前
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
53 4
|
1月前
|
存储 监控 算法
员工行为监控软件中的 Go 语言哈希表算法:理论、实现与分析
当代企业管理体系中,员工行为监控软件已逐步成为维护企业信息安全、提升工作效能的关键工具。这类软件能够实时记录员工操作行为,为企业管理者提供数据驱动的决策依据。其核心支撑技术在于数据结构与算法的精妙运用。本文聚焦于 Go 语言中的哈希表算法,深入探究其在员工行为监控软件中的应用逻辑与实现机制。
61 14
|
2月前
|
自然语言处理 算法 安全
境内深度合成服务算法备案通过名单分析报告
本报告基于《境内深度合成服务算法备案通过名单》,分析了2023年6月至2025年3月公布的10批备案数据,涵盖属地分布、行业应用及产品形式等多个维度。报告显示,深度合成算法主要集中于经济发达地区,如北京、广东、上海等地,涉及教育、医疗、金融、娱乐等多行业。未来趋势显示技术将向多模态融合、行业定制化和安全合规方向发展。建议企业加强技术研发、拓展应用场景、关注政策动态,以在深度合成领域抢占先机。此分析旨在为企业提供参考,助力把握技术发展机遇。
境内深度合成服务算法备案通过名单分析报告
|
2月前
|
供应链 算法 搜索推荐
从公布的前十一批其他算法备案通过名单分析
2025年3月12日,国家网信办发布算法备案信息,深度合成算法通过395款,其他算法45款。前10次备案中,深度合成算法累计3234款,其他类别647款。个性化推送类占比49%,涵盖电商、资讯、视频推荐;检索过滤类占31.53%,用于搜索优化和内容安全;调度决策类占9.12%,集中在物流配送等;排序精选类占8.81%,生成合成类占1.55%。应用领域包括电商、社交媒体、物流、金融、医疗等,互联网科技企业主导,技术向垂直行业渗透,内容安全和多模态技术成新增长点。未来大模型检索和多模态生成或成重点。
从公布的前十一批其他算法备案通过名单分析
|
2月前
|
人工智能 自然语言处理 供应链
从第十批算法备案通过名单中分析算法的属地占比、行业及应用情况
2025年3月12日,国家网信办公布第十批深度合成算法通过名单,共395款。主要分布在广东、北京、上海、浙江等地,占比超80%,涵盖智能对话、图像生成、文本生成等多行业。典型应用包括医疗、教育、金融等领域,如觅健医疗内容生成算法、匠邦AI智能生成合成算法等。服务角色以面向用户为主,技术趋势为多模态融合与垂直领域专业化。
|
3月前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
53 3
|
2月前
|
人工智能 自然语言处理 算法
从第九批深度合成备案通过公示名单分析算法备案属地、行业及应用领域占比
2024年12月20日,中央网信办公布第九批深度合成算法名单。分析显示,教育、智能对话、医疗健康和图像生成为核心应用领域。文本生成占比最高(57.56%),涵盖智能客服、法律咨询等;图像/视频生成次之(27.32%),应用于广告设计、影视制作等。北京、广东、浙江等地技术集中度高,多模态融合成未来重点。垂直行业如医疗、教育、金融加速引入AI,提升效率与用户体验。
|
4月前
|
人工智能 算法 搜索推荐
算法备案全流程攻略:保姆级教程
在AI热潮下,算法成为互联网服务的核心驱动力,但也带来了大数据杀熟、算法歧视等问题。为规范行业发展,算法备案制度应运而生。该制度涵盖网站、APP等多种产品形式,要求企业在2个月内完成备案,依据《互联网信息服务算法推荐管理规定》等法规。未备案企业可能面临无法上线、罚款甚至刑罚的后果。备案流程包括注册、主体备案、信息填报及审核,确保算法合规运营。通过悬挂备案号、标识AI生成内容和定期自查,企业需持续维护算法安全与合规。
|
4月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
5月前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
91 6

热门文章

最新文章