【区块链】椭圆曲线数字签名算法(ECDSA)

2024-04-27 22:20

本文主要是介绍【区块链】椭圆曲线数字签名算法(ECDSA),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要参考:

一文读懂ECDSA算法如何保护数据
椭圆曲线数字签名算法

1. ECDSA算法简介

  ECDSAElliptic Curve Digital Signature Algorithm 的简称,主要用于对数据(比如一个文件)创建数字签名,以便于你在不破坏它的安全性的前提下对它的真实性进行验证。
  你不应该将 ECDSA 与用来对数据进行加密的 AES(高级加密标准)相混淆。ECDSA 不会对数据进行加密、或阻止别人看到或访问你的数据,它可以防止的是确保数据没有被篡改。
  ECDSA 原理非常简单,有一个数学方程,在图上画了一条曲线,然后你在这条曲线上面随机选取了一个点作为你的 原点 G。接着你产生了一个 随机数 k,作为你的 私钥,最后你用上面的 随机数 k原点 G 通过一些复杂的魔法数学方程得到该条曲线上面的第二个点,这是你的 公钥 P

  当你想要对一个文件进行签名的时候,签名本身由两部分组成,称为 r 和 s 。通过 私钥k(随机数) 和文件的 哈希 组成一个魔法数学方程,这将给出你的签名的 s 部分。取 公钥 P 的 x 轴即为签名的 r 部分。为了验证签名的正确性,你需要 公钥 P 和签名 s、r组成一个魔法数学方程,该方程计算会得到一个坐标点,如果该坐标点的 x 轴刚好为签名中的 r,那么即可认为改签名是有效的。

2.椭圆曲线密钥生成

  像 y 2 = x 3 + a x + b y^2 = x^3 +ax+b y2=x3+ax+b 这样的式子通常画出来是个椭圆曲线,如下图所示:

  画一条直线与椭圆曲线产生三个交点(P、Q、-R),我们称 P + Q = R,R 即为 -R 关于x轴的对称点(请注意这里的 + 实际指的是第三个交点的 x 轴对称点)。
  若以椭圆曲线的某一切点 G 做一直线,则直线与椭圆曲线的另一交点即为 -2G,其关于x轴对称点即为 2G 点,若 2G 点与 G 点连接即可得到 3G 点,以此类推,即可得到 kG 点。
  引入 G 点的好处是可以实现快速寻找,我们以 G 点做切线即可得到 2G 点,以 2G点为切线即可得到 4G 点,以此类推,这样的寻找过程,大大的减少了寻找次数。

  椭圆曲线还有一个特性就是,我们以 G 为起点经过 k 次寻找后,得到 kG 点这一顺序计算过程是比较简单的,但如果我们已知 G 点要得到 kG 点是经过多少次寻找得到的是比较困难的,我们只能对 k 一个一个尝试,当 k 比较大时,k 的寻找过程是及其困难的,因此,这一过程是ECDSA算法背后安全性的基础,而这一原则也被称为 单向陷门函数

比特币的椭圆曲线一般是采用以下函数:
y 2 = x 3 + 7 , a = 0 , b = 7 y^2 = x^3+7,a=0,b=7 y2=x3+7a=0,b=7
开始的节点 Generator(G) 坐标为:
G x = 0 x 79 B E 667 E F 9 D C B B A C 55 A 06295 C E 870 B 07029 B F C D B 2 D C E 28 D 959 F 2815 B 16 F 81798 Gx = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 Gx=0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
G y = 0 x 483 A D A 7726 A 3 C 4655 D A 4 F B F C 0 E 1108 A 8 F D 17 B 448 A 68554199 C 47 D 08 F F B 10 D 4 B 8 Gy = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8 Gy=0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
私钥 k 一般是选择比较大的随机数,通过开始节点 G 与私钥 k,我们即可得到公钥节点 P

3.椭圆曲线数字签名实现

  假设Alice要给Bob发送消息 M,Alice 根据 起始点 G 与选择的 随机数(私钥) k 可得到 公钥 P,然后用 私钥 k 与 要发送的消息M的哈希值 HASH(M) 相乘得到 s,然后将要发送的信息 M 与 s 一同发送给 Bob。Bob得到信息后,通过Alice的 公钥 PHash(M) 相乘得到 Y,然后将 s 与 G 相乘得到X,如果X=Y则改签名即为有效,具体过程如下图所示:
在这里插入图片描述
X=Y合理性证明:
X = H a s h ( M ) ∗ P = H a s h ( M ) ∗ k ∗ G = s ∗ G = Y X=Hash(M) * P=Hash(M)*k*G=s*G=Y X=Hash(M)P=Hash(M)kG=sG=Y
  虽然以上过程实现了数字签名,但是以上的签名过程是存在一定漏洞的,因为 Bob 得到的数据有 Alice 的公钥 P、s、以及起始坐标 G,根据 G 与 P 是推断不出私钥 k 的,但是 k 可由 s 计算得到 k = s / H a s h ( M ) k = s/Hash(M) k=s/Hash(M),因此,科学家为其又想了新的办法。

签名过程:

  • 随机产生一个随机数 e ,通过计算得到 e G = Q eG = Q eG=Q
  • 随机产生一个随机数 k 作为私钥,计算得到 k G = P kG = P kG=P P P P 即为公钥,然后记录下 P P P x x x 坐标记为 r r r
  • 利用 SHA1 计算要传递信息 M M M 的哈希值 z z z
  • 利用方程 s = ( z + e ∗ r ) / k s = (z+e*r)/k s=(z+er)/k 计算得到 s s s
  • 要传递的数据即为 原始数据MM的Hash值zrs

验证过程:

  计算 z ∗ G s + r ∗ Q s = P \frac{z*G}{s}+\frac{r*Q}{s} = P szG+srQ=P ,若左右相等,则即为有效签名。

签名验证过程:
在这里插入图片描述

验证以上公式有效性:
z ∗ G s + r ∗ Q s = z ∗ G + r ∗ Q s = z ∗ G + r ∗ e ∗ G s = ( z + r ∗ e ) ∗ G s = ( z + r ∗ e ) ∗ G ∗ k ( z + r ∗ e ) = k G = P \begin{aligned} \frac{z*G}{s}+\frac{r*Q}{s}&=\frac{z*G+r*Q}{s}\\&=\frac{z*G+r*e*G}{s}\\&=\frac{(z+r*e)*G}{s}\\&=\frac{(z+r*e)*G*k} {(z+r*e)}\\&=kG\\&=P\end{aligned} szG+srQ=szG+rQ=szG+reG=s(z+re)G=(z+re)(z+re)Gk=kG=P
由于两侧求得的都为坐标,比较 x 轴即可。

  以上签名过程中被外界所指的参数有 公钥P公钥Q起始点Grs,我们可以看到在上面可由 s 求出密钥 k 的漏洞在现在的签名中不存在了,因为 s = ( z + e ∗ r ) / k s = (z+e*r)/k s=(z+er)/k,其中有两个未知参数 e 与 k,所以此签名过程比上面的更加完备了。

  由于计算过程中所得数据要在规定的字节范围内,所以在实际代码中要进行取模运算。

4. 代码实现

  以下是使用 go 语言实现的ECDSA算法的签名与认证:
签名:

func (ecc *MyECC) Sign(msg []byte, secKey *big.Int) (*Signature, error) {// 随机产生随机数k作为私钥k,error := newRand()if error != nil {return nil, error}// 对要传递的消息msg进行hash运算得到zz_bytes := crypto.Keccak256(msg)z := new(big.Int).SetBytes(z_bytes)z.Mod(z, N)//计算得到私钥k的公钥P,并求出其x坐标作为rP := Multi(G,k)r := new(big.Int).Mod(P.X,N)// 计算要传递的参数ss := new(big.Int).Mul(r, secKey)s.Add(s, z)  s.Mul(s, Inv(k, N))  s.Mod(s, N)  // 传递s与rs_r := &Signature{s, r}return s_r, nil
}

验证:

func (ecc *MyECC) VerifySignature(msg []byte, signature *Signature, pubkey *Point) bool {// 获得s与rs, r := signature.s, signature.r// 获得传递信息msg的hash值zz_bytes := crypto.Keccak256(msg)z := new(big.Int).SetBytes(z_bytes)z.Mod(z, N)// 使用费马小定理求得1/ss_inv := Inv(s, N)// 取u = z/su := new(big.Int).Mul(z,s_inv)u.Mod(u, N)// 取v = r/sv := new(big.Int).Mul(r,s_inv)v.Mod(v, N)// 计算u*G与v*QuG := Multi(G,u)vQ := Multi(pubkey,v)// 计算u*G+v*Q得到R,并取出其x轴R := Add(uG,vP)Rx := new(big.Int).Mod(R.X,N)// 比较判断是否相同if Rx.Cmp(r)==0{return true}else{return false}}

这篇关于【区块链】椭圆曲线数字签名算法(ECDSA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941683

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。