开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 3635|回复: 41
收起左侧

[易语言纯源码] 以太坊消息签名,Openssl+secp256k1。

[复制链接]
结帖率:59% (16/27)
发表于 2023-5-18 19:42:52 | 显示全部楼层 |阅读模式   山东省烟台市
分享源码
界面截图: -
是否带模块: 纯源码
备注说明: -
本帖最后由 powugzs 于 2023-5-18 20:17 编辑

以太坊签名采用了Keccak256取哈希值,以及secp256k1 椭圆曲线加密。
签名过程基本上是这样的:你有一个消息(在这种情况下,通常是一个交易),你使用你的私钥和这个消息来生成一个签名。然后,其他人可以使用你的公钥来验证这个签名。如果验证成功,那么他们可以确信这个消息是由持有相应私钥的人发送的,而且消息在传输过程中没有被篡改。这就是以太坊的签名算法如何工作的。

一、Keccak256
由于目前windows自带的api没有sha3的算法,无奈只能使用openssl去实现sha3-256算法了(sha3-256其实就是keccak256),但是openssl的sha3-256与以太坊所使用的sha3-256是有区别的,以太坊使用的是原始的 Keccak-256 算法,而不是 NIST定义的 SHA-3-256。openssl实现的是NIST定义的sha3算法。
到这里时是非常想放弃使用openssl的,但是看了大佬的文章,发现使用openssl是可以计算原始的keccak256哈希的,具体内容去看【利用openssl中的sha3生成以太坊账户地址_openssl keccak256_hnlylyb的博客-CSDN博客】。由于帖子内是定义了一个结构体,我测试了易语言得数据类型是无法达到目的得,所以采用指针去修改内存去实现。

  
子程序名返回值类型公开备 注
keccak256字节集 
参数名类 型参考可空数组备 注
data字节集
变量名类 型静态数组备 注
md整数型 
ctx整数型 
size整数型 
result字节集 
tmp整数型 
size = 取字节集长度 (data)
md = EVP_sha3_256 ()
ctx = EVP_MD_CTX_new ()
EVP_DigestInit (ctx, md)
tmp = 指针到整数 (ctx + 12)
写到内存 ({ 1 }, tmp + 380, 1)  ' 因为openssl的sha3算法是新标准,所以要给他还原为旧标准
EVP_DigestUpdate (ctx, data, size)
result = 取空白字节集 (32)
EVP_DigestFinal (ctx, result, size)
返回 (result)


二、secp256k1 椭圆曲线
说完了keccak256,接下来就是secp256k1曲线了,椭圆曲线ECDSA在openssl里面是有实现的,于是我兴致勃勃的开始了使用openssl去写签名部分。首先,openssl去写ECDSA的时候它的K值是随机的,以至于我们每次的签名值都不同,其实我一开始到这里的时候是想过放弃openssl的【经过测试,只要能拿到R,S,V值就可以做到恢复公钥的操作了】,所以无伤大雅

但是以太坊除了R,S值以外还多出来了一个V校验值,具体就是椭圆曲线计算时选择的点是R还是R’来决定V值是0还是1【以太坊又做了V=V+27处理】,可惜的是openssl并没有提供V值的获取函数,并且选择R时也是内部去做处理的。

我真的是非常非常的无语的,已经测试了很多种方式也没有办法去计算出来V值,无非也就是用openssl去写一个恢复公钥去判断V值是1还是2吗,由于技术不太到位没能实现这一部分。


再次无奈,去下载了btc的secp256k1的cpp源码,去编译了dll地址贴在后面,到了这里的时候就十分之流畅了,它内置了k值得计算【插一句嘴,上面提到了k值,这个k值其实就是一个随机数】,但是现在市面上的大部分钱包都采用了【RFC 6979标准】,这里请自行百du我也没有去了解,总之大概就是使用私钥以及消息内容,去计算了这么一个k值,所以只要保证私钥以及消息不变得情况下,计算出来得签名即R,S,V值都是固定不变得。

最终这个签名算法在使用了openssl以及libsecp256k1后才写了出来,经过测试签名结果与小狐狸、web3.py结果一致。

【重点:由于libsecp256k1.dll涉及私钥,所以请大家自行编译libsecp256k1】
【重点:由于libsecp256k1.dll涉及私钥,所以请大家自行编译libsecp256k1】
【重点:由于libsecp256k1.dll涉及私钥,所以请大家自行编译libsecp256k1】
openssl【https://www.openssl.org/
libsecp256k1【https://github.com/bitcoin-core/secp256k1

ETH.rar

1.96 MB, 下载次数: 94, 下载积分: 精币 -2 枚

评分

参与人数 3好评 +1 精币 +5 收起 理由
wa690602724 + 1 感谢分享,很给力!~
光影魔术 + 1 + 1 开源精神必须支持~
商亨人和 + 3 YYDS~!

查看全部评分


签到天数: 25 天

发表于 2024-5-12 22:40:46 | 显示全部楼层   河南省郑州市
good6666666666
回复 支持 反对

使用道具 举报

签到天数: 25 天

发表于 2024-4-17 12:46:13 | 显示全部楼层   河南省郑州市

good6666666666
回复 支持 反对

使用道具 举报

结帖率:44% (8/18)

签到天数: 8 天

发表于 2023-7-6 20:58:51 | 显示全部楼层   广东省汕尾市
powugzs 发表于 2023-7-6 20:31
你发你的我加你

Cnz02031227这个这个
回复 支持 反对

使用道具 举报

结帖率:59% (16/27)

签到天数: 15 天

 楼主| 发表于 2023-7-6 20:31:03 | 显示全部楼层   山东省济南市
yu531602726 发表于 2023-7-6 13:56
也是区块链平台这个sign加密的

你发你的我加你
回复 支持 1 反对 0

使用道具 举报

结帖率:44% (8/18)

签到天数: 8 天

发表于 2023-7-6 13:56:19 | 显示全部楼层   广东省汕尾市

也是区块链平台这个sign加密的
回复 支持 反对

使用道具 举报

结帖率:59% (16/27)

签到天数: 15 天

 楼主| 发表于 2023-7-5 23:41:07 | 显示全部楼层   山东省济南市
yu531602726 发表于 2023-7-5 18:39
能留个vx联系方式嘛,有偿请教

搞啥东西。
回复 支持 反对

使用道具 举报

结帖率:44% (8/18)

签到天数: 8 天

发表于 2023-7-5 18:39:49 | 显示全部楼层   广东省汕尾市
能留个vx联系方式嘛,有偿请教
回复 支持 反对

使用道具 举报

发表于 2023-5-26 12:01:58 | 显示全部楼层   陕西省西安市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:50% (2/4)

签到天数: 4 天

发表于 2023-5-20 02:44:23 | 显示全部楼层   广西壮族自治区来宾市
虽然不知道是啥 但是开源精神必须支持
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表