IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> libsecp256k1比特币密码算法开源库(十一) -> 正文阅读

[区块链]libsecp256k1比特币密码算法开源库(十一)

2021SC@SDUSC
本篇博客讨论一下椭圆曲线算法部分的代码实现。
为了可以更好地解释,我在本篇博客中先讲述椭圆曲线数字签名算法的一些基础(这些内容在前面的博客中提到过,但是并不具体)。为了让读者可以一次直接看懂这篇博客,我再次写一部分理论知识,如果已经了解这部分内容的读者,可以略过。

目录

1、ECDSA理论知识(可略过,在前面的博客中断断续续提到过一些)

椭圆曲线数字签名算法(ECDSA)是比特币用来确保资金只能由合法所有者使用的加密算法。它取决于所使用的曲线顺序和哈希函数。对于比特币,它们分别是Secp256k1和SHA256。

与ECDSA相关的几个概念:
私钥:一个秘密号码,只有生成它的人知道。私钥本质上是一个随机生成的数字。在比特币中,拥有区块链上资金对应的私钥的人可以使用这些资金。在比特币中,私钥是单个无符号256位整数(32字节)。

公钥:与私钥相对应但不需要保密的数字。可以从私钥计算公钥,但不能从私钥计算公钥。公钥可用于确定签名是否真实(换句话说,使用正确的密钥生成),而无需泄露私钥。在比特币中,公钥可以是压缩的,也可以是未压缩的。压缩公钥是33个字节,由前缀0x02或0x03和一个称为x的256位整数组成。较旧的未压缩密钥为65字节,由常量前缀(0x04)组成,后跟两个称为x和y的256位整数(2*32字节)。压缩密钥的前缀允许从x值派生y值。

签名:证明进行了签名操作的数字。签名是由待签名内容的散列加上私钥在数学上生成的。签名本身是两个数字,称为r和s。对于公钥,可以对签名使用数学算法来确定它最初是由哈希和私钥生成的,而不需要知道私钥。结果签名的长度可以是73、72或71字节(近似概率分别为25%、50%和25%——尽管大小可能更小,概率呈指数下降)

ECDSA签名和验证算法使用几个基本变量,这些变量用于获取签名和从签名获取消息的反向过程。
r和s:这些数字唯一地代表签名。
z:我们要签名的消息的散列。通常,我们需要使用消息散列的最左边的N位,其中N是所用散列函数的长度,但是,此规则不适用于比特币签名,因为所用散列函数的长度SHA256等于secp256k1曲线(256)的位长度,因此无需截断。
k:一种加密安全的随机数,用作计算r和s值的时值。
dA和QA:分别是私钥号和公钥点,用于签名和验证消息。钱包在给出钱包中包含的地址时,可以获得这些信息的副本。

签名算法从dA和z计算签名对r和s。
获得曲线的组阶n。对于Secp256k1,这是FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141。
生成一个介于1和n-1之间的加密安全随机数k。
重要提示:在签名后不要重用k,因为如果攻击者知道签名消息中使用的共享nonce k,则存在漏洞可使攻击者从签名消息中派生私钥。
计算(x,y)=kG,其中G是secp256k1曲线的生成点,即04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DC28D9 59F2815B 16F81798 483AD77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8的未压缩形式,但也可以使用压缩形式。
计算r=x模n。如果r=0,则生成另一个随机k并重新开始。
计算s=k-1(z+r
dA)模n。如果s=0,则生成另一个随机k并重新开始。

验证算法
验证算法确保签名对r和s、QA和z都是一致的。
确认r和s都在1和n-1之间。
计算u1=zs-1<mod n和u2=rs-1 mod n。
计算(x,y)=u1G+u2QA并确保它不等于无穷远处的点。无穷远处的点是一个特殊点,当您添加两个结果不在曲线上的点时,会产生该点,例如两个具有相同X值但Y值反转的点。
如果r=x mod n,则签名有效。否则,或者如果任何检查失败,则签名无效。

2、代码分析

1、首先定义了椭圆曲线算法中用到的hash算法的函数,包括调用hash包中的初始化等函数,最后成功返回1。
在这里插入图片描述2、libsecp256k1使用的椭圆曲线算法核心部分,生成公钥等,具体实现过程参考libsecp256k1比特币密码算法开源库(一)
在这里插入图片描述

3、计算点的散列
在这里插入图片描述4、在构建完成后,需要对hash进行测试,失败返回0.
在这里插入图片描述5、将x和y另存为未压缩公钥
在这里插入图片描述下面是编写的API部分
仅统计错误的设置上下文。
在这里插入图片描述检查是否检测到所有空值。
在这里插入图片描述检测结束后,执行清除操作。
在这里插入图片描述
以下是椭圆曲线基点的生成在这里插入图片描述当基点为生成器时,检查pubkey创建。
在这里插入图片描述使用ECDH函数和自定义哈希函数进行计算。
在这里插入图片描述“显式”计算,检查公钥序列化。
在这里插入图片描述
比较结果是否正确在这里插入图片描述标量错误测试
在这里插入图片描述
创建随机点。
在这里插入图片描述
试着用坏值乘以它。
在这里插入图片描述哈希函数失败导致ecdh失败。
在这里插入图片描述运行测试
在这里插入图片描述另外一些核心代码分析将在下一篇博客中介绍。

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:38:31  更:2021-11-12 19:39:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:36:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码