比特币私钥公钥地址生成

比特币私钥公钥地址生成算法

原理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实现


#!coding:utf8#author:yqq
#date:2019/3/4 0004 14:35
#description:  比特币地址生成算法import hashlib
import ecdsa
import os#2019-05-15  添加私钥限制范围
g_b58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'#g_nMaxPrivKey = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140 - 0x423423843  #私钥最大值 (差值是自定义的)
#g_nMinPrivKey = 0x0000000000000000000000000000000000000000000000000000000000000001 + 0x324389329  #私钥最小值 (增值是自定义的)#2019-11-12 根据官方定义修改  有限域
# http://www.secg.org/sec2-v2.pdf#page=9&zoom=100,0,249
# 关于 有限域的定义 请参考
# 0xEFFFFFC2F = 2**32 - 2**9 - 2**8 - 2**7 - 2**6 - 2**4 - 1
g_nFactor = 0xEFFFFFC2F + 0x23492397 #增值自定义
g_nMaxPrivKey = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140 - g_nFactor #私钥最大值 (差值是自定义的)
g_nMinPrivKey = 0x0000000000000000000000000000000000000000000000000000000000000001 + g_nFactor #私钥最小值 (增值是自定义的)def Base58encode(n):'''base58编码:param n: 需要编码的数:return: 编码后的'''result = ''while n > 0:result = g_b58[n % 58] + resultn /= 58return resultdef Base256decode(s):'''base256编码:param s::return:'''result = 0for c in s:result = result * 256 + ord(c)return resultdef CountLeadingChars(s, ch):'''计算一个字符串开头的字符的次数比如:  CountLeadingChars('000001234', '0')  结果是5:param s:字符串:param ch:字符:return:次数'''count = 0for c in s:if c == ch:count += 1else:breakreturn countdef Base58CheckEncode(version, payload):''':param version: 版本前缀  , 用于区分主网 和 测试网络:param payload::return:'''s = chr(version) + payloadchecksum = hashlib.sha256(hashlib.sha256(s).digest()).digest()[0:4]  #两次sha256, 区前4字节作为校验和result = s + checksumleadingZeros = CountLeadingChars(result, '\0')return '1' * leadingZeros + Base58encode(Base256decode(result))def PrivKeyToPubKey(privKey):'''私钥-->公钥:param privKey: 共65个字节:  0x04   +  x的坐标  +   y的坐标:return:'''sk = ecdsa.SigningKey.from_string(privKey.decode('hex'), curve=ecdsa.SECP256k1)# vk = sk.verifying_keyreturn ('\04' + sk.verifying_key.to_string()).encode('hex')def PrivKeyToPubKeyCompress(privKey):'''私钥-->公钥  压缩格式公钥:param privKey:  ( 如果是奇数,前缀是 03; 如果是偶数, 前缀是 02)   +  x轴坐标:return:'''sk = ecdsa.SigningKey.from_string(privKey.decode('hex'), curve=ecdsa.SECP256k1)# vk = sk.verifying_keytry:# print(sk.verifying_key.to_string().encode('hex'))point_x = sk.verifying_key.to_string().encode('hex')[     : 32*2] #获取点的 x 轴坐标point_y = sk.verifying_key.to_string().encode('hex')[32*2 :     ]  #获取点的 y 轴坐标# print("point_x:", point_x)if (long(point_y, 16) & 1) == 1:  # 如果是奇数,前缀是 03; 如果是偶数, 前缀是 02prefix = '03'else:prefix = '02'return prefix + point_xexcept:raise("array overindex")pass#https://en.bitcoin.it/wiki/List_of_address_prefixes
def PubKeyToAddr(privKey, isTestnet = False):'''公钥-->地址:param privKey:私钥:param isTestnet:是否是测试网络:return:地址'''ripemd160 = hashlib.new('ripemd160')ripemd160.update(hashlib.sha256(privKey.decode('hex')).digest())if isTestnet:return Base58CheckEncode(0x6F, ripemd160.digest())  #0x6F  p2pkh  testnet# return base58CheckEncode(0x05, ripemd160.digest())  #05  p2sh mainnetreturn Base58CheckEncode(0x00, ripemd160.digest())  #00  p2pkh  mainnetdef PrivKeyToWIF(privKey, isTestnet = False):'''将私钥转为 WIF格式 , 用于比特币钱包导入:param privKey: 私钥(16进制字符串):return: WIF格式的私钥'''if isTestnet:# return Base58CheckEncode(0xEF, privKey.decode('hex') + '\01') #0xEF 测试网络          fix bug: 2019-04-03 yqq 01是多余的, 只有是压缩的格式的时候,才需要加return Base58CheckEncode(0xEF, privKey.decode('hex') ) #0xEF 测试网络# return Base58CheckEncode(0x80, privKey.decode('hex') + '\01') #0x80 主网return Base58CheckEncode(0x80, privKey.decode('hex') ) #0x80 主网def PrivKeyToWIFCompress(privKey, isTestnet = False):'''压缩格式将私钥转为 WIF格式 , 用于比特币钱包导入:param privKey: 私钥(16进制字符串):return: WIF格式的私钥'''if isTestnet:return Base58CheckEncode(0xEF, privKey.decode('hex') + '\01') #0xEF 测试网络return Base58CheckEncode(0x80, privKey.decode('hex') + '\01') #0x80 主网def GenPrivKey():'''生成私钥, 使用 os.urandom (底层使用了操作系统的随机函数接口, 取决于CPU的性能,各种的硬件的数据指标):return:私钥(16进制编码)'''#2019-05-15 添加私钥范围限制while True:privKey = os.urandom(32).encode('hex')    #生成 256位 私钥if  g_nMinPrivKey < int(privKey, 16) <   g_nMaxPrivKey:return privKeydef GenAddr(isTestnet=False):'''此函数用于C++调用,:param isTestnet: 是否是测试网络:return:  (私钥, 公钥, 地址)'''privKey = GenPrivKey()# print("privkey : " + privKey)privKeyWIF =  PrivKeyToWIF(privKey, isTestnet)# print("privkey WIF:" + PrivKeyToWIF(privKey, isTestnet))pubKey = PrivKeyToPubKey(privKey)# print("pubkey : " + pubKey)addr = PubKeyToAddr(pubKey, isTestnet)# print("addr : " + addr)return str(privKeyWIF), str(pubKey), str(addr)def GenAddrCompress(isTestnet=False):'''此函数用于C++调用,:param isTestnet: 是否是测试网络:param isCompress: 是否压缩:return:  (私钥, 公钥, 地址)'''privKey = GenPrivKey()# print("privkey : " + privKey)privKeyWIF =  PrivKeyToWIFCompress(privKey, isTestnet)# print("privkey WIF:" + PrivKeyToWIF(privKey, isTestnet))pubKey = PrivKeyToPubKeyCompress(privKey)# print("pubkey : " + pubKey)addr = PubKeyToAddr(pubKey, isTestnet)# print("addr : " + addr)return str(privKeyWIF), str(pubKey), str(addr)def GenMultiAddr(nAddrCount = 1, isTestnet=True):'''生成多个地址:param nAddrCount::param isTestnet::return:'''# return [("1111", "2222", "3333"), ("4444", "55555", "66666")]# return [1, 2, 3, 4]# return ["1111", "2222", "3333", "4444"]lstRet = []for i in range(nAddrCount):lstRet.append(GenAddrCompress(isTestnet))return lstRet#
def good():isTestnet = True# private_key = GenPrivKey()private_key = '95b51ad564bd26811aeafc06ebe64643d2a50f82aa4901e714ba4be635ed9a57'print("privkey : " + private_key)print("privkey WIF:" + PrivKeyToWIF(private_key, isTestnet))pubKey = PrivKeyToPubKey(private_key)print("pubkey : " + pubKey)addr = PubKeyToAddr( pubKey , isTestnet)print("addr : " + addr)print("-----------------------------")print("privkey WIF compress:" + PrivKeyToWIFCompress(private_key, isTestnet))pubKey = PrivKeyToPubKeyCompress(private_key)print("pubkey  compress : " + pubKey)addr = PubKeyToAddr( pubKey , isTestnet)print("addr  compress: " + addr)
#
#
# def main():
#     good()
#     for i in range(1):
#         print(GenAddr(True))# if __name__ == '__main__':
#
#     main()

关于地址压缩

参考链接: https://bitcoin.stackexchange.com/questions/3059/what-is-a-compressed-bitcoin-key

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/26292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux Radix tree简介

文章目录 前言一、Radix tree简介二、Operations2.1 Lookup2.2 Insertion2.3 Deletion 三、Linux内核API3.1 初始化3.2 radix_tree_insert/delete3.3 radix_tree_preload3.4 radix_tree_lookup3.5 radix_tree_tag_set3.6 radix_tree_tagged 四、address_space4.1 简介4.2 相应数…

使用Arrays.asList 报错Nullpointerexception 需要提前对参数进行判空

//为什么这样的时候会报空指针异常**Arrays.asList 这里这个方法中的参数为空**String[] checkedResourceNos1 dto.getCheckedResourceNos();List<String> checkedResourceNos null; //需要在这里**判断是否为空**&#xff0c;**不为空才能**调**用Arrays.asList转化为…

IC验证中有符号浮点数的运算(避坑)

如上图&#xff0c;仅第一种表达才能计算出正确的结果-180&#xff0c;另外两种方式存在缺少符号和溢出的错误&#xff0c;计算出的均是180&#xff0c;其中reg[31:0] theta_q31 h8000_0000。 如果 theta_q31 h8000_0000到h7fff_ffff之间的数时&#xff0c;上述第一种表达仅能…

暗色系B端界面有什么好处、应用场景、缺点、该如何设计。

B端管理系统界面蓝色系和浅色系的非常多&#xff0c;暗色系一般不作为首选&#xff0c;这背后是什么原因呢&#xff0c;如果真的要设计暗色系界面&#xff0c;该如何办呢&#xff0c;本文就解决这些问题。 一、暗色系B端界面相对于浅色系有什么好处 1. 减少眩光和视觉疲劳&am…

国学诗词app开发,学古贯今,句句珠玑

“鹅鹅鹅&#xff0c;曲项向天歌。”这是很多人学会的第一首诗&#xff0c;国学诗词作为中华传统文化的重要组成部分&#xff0c;不仅在历史中占据重要地位&#xff0c;也是儿童学前启蒙的不二选择。对于家长来说&#xff0c;他们更喜欢在学前教孩子一些经典国学和古诗词&#…

高考后的抉择:计算机相关专业的未来发展与前景探讨

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

使用C#快速搭建一个在windows运行的exe应用

文章目录 一、前言1.1 编写语言需要工具1.2 选择自己需要的组件进行安装 二、新建项目1.1 新建一个 .NET4.x 的项目1.2 添加一个小案例1.3 对界面进行美化1.3.1、配置Form属性1.3.2、配置Button按钮 1.4 查看组将的相关代码 三、后记 一、前言 这是一个比较旧的内容&#xff0…

【android】json

设置第potition个数据项的view的属性 成功显示数据项&#xff0c;熟悉recycleview三个方法 新建页面&#xff0c;定义适配器&#xff0c;指定使用MyViewHolder类对象保存每个数据胡view组件 padding-内部边距 bold-加粗 新建类&#xff0c;描述新闻内容 定义组件 public i…

模拟信号转RS-485/232,数据采集A/D转换模块 YL21

特点&#xff1a; ● 模拟信号采集&#xff0c;隔离转换 RS-485/232输出 ● 采用12位AD转换器&#xff0c;测量精度优于0.1% ● 通过RS-485/232接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围&#xff1a;8 ~ 32VDC ● 可靠性高&…

网络安全 - ARP 欺骗原理+实验

APR 欺骗 什么是 APR 为什么要用 APR A P R \color{cyan}{APR} APR&#xff08;Address Resolution Protocol&#xff09;即地址解析协议&#xff0c;负责将某个 IP 地址解析成对应的 MAC 地址。 在网络通信过程中会使用到这两种地址&#xff0c;逻辑 IP 地址和物理 MAC 地址&…

如何保证数据库和缓存的一致性

背景&#xff1a;为了提高查询效率&#xff0c;一般会用redis作为缓存。客户端查询数据时&#xff0c;如果能直接命中缓存&#xff0c;就不用再去查数据库&#xff0c;从而减轻数据库的压力&#xff0c;而且redis是基于内存的数据库&#xff0c;读取速度比数据库要快很多。 更新…

android studio过滤日志

荣耀手机的日志有很多乱七八糟的输出 在logcat设置过滤 filter name:过滤名称随意 log tag不知道是什么 log message设置过滤的内容或者设置显示的内容 需要过滤的内容&#xff1a; ^(?!.*(gralloc4|InputMethodManager|tagSocket|dataspace)).*$以|分割要过滤的内容 要显…

计算机网络(2) 网络层:IP服务模型

一.Internet Protocol在TCP/IP四层模型中的作用 第三层网络层负责数据包从哪里来到哪里去的问题。传输层的数据段提交给网络层后&#xff0c;网络层负责添加IP段&#xff0c;包含数据包源地址与目的地址。将添加IP段的数据包交由数据链路层添加链路头形成最终在各节点传输中所需…

Maven:一个下载jar依赖失败的问题解决方案

内部的一个jar包已经上传到了私服上&#xff0c;在私服管理端也能看到该jar包的完整信息&#xff0c;但是springboot项目引入该jar包发现死活下载不下来&#xff0c;报错如图&#xff1a; 从该错误信息中可以看到&#xff0c;找不到服务名是xxl-job这个的&#xff0c;我们要找的…

如何将 API 管理从 Postman 转移到 Apifox

上一篇推文讲到用 Swagger 管理的 API 怎么迁移到 Apifox&#xff0c;有许多同学反馈说能不能介绍一下 Postman 的迁移以及迁移过程中需要注意的事项。那么今天&#xff0c;它来了&#xff01; 从 Postman 迁移到 Apifox 的方法有两种&#xff1a; 导出 Postman 集合 &#x…

详细介绍如何解决vcomp140.dll丢失的步骤,分享几种vcomp140.dll修复方法

当这个vcomp140.dll文件丢失时&#xff0c;可能会导致相关程序运行出错甚至无法运行。很多用户可能会遇到vcomp140.dll丢失的问题&#xff0c;但是这并不是不可解决的困难。接下来就和大家分享几种解决vcomp140.dll丢失的方法&#xff0c;给大家详细的关于如何解决vcomp140.dll…

MySQL-连接查询

049-内连接之等值连接 案例&#xff1a;查询每个员工所在的部门名称&#xff0c;要求显示员工名、部门名。 select e.ename, d.dname from emp e inner join dept d on e.deptnod.deptno;注意&#xff1a;inner可以省略 select e.ename, d.dname from emp e join dept d on…

你的医书是假的!批评《DDD诊所——聚合过大综合症》(合集)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 &#xff08;《你的医书是假的&#xff01;》原文写于2023年8月&#xff0c;以系列文章方式发表&#xff0c;现合并成一篇文章&#xff09; 一、说在前面 这两天在“ Thoughtworks洞见…

mask2former利用不确定性采样点选择提高模型性能

在机器学习和深度学习的训练过程中&#xff0c;不确定性高的点通常代表模型在这些点上的预测不够可靠或有较高的误差。因此&#xff0c;关注这些不确定性高的点&#xff0c;通过计算这些点的损失并进行梯度更新&#xff0c;可以有效地提高模型的整体性能。确定性高的点预测结果…

【python】tkinter GUI开发: 多行文本Text,单选框Radiobutton,复选框Checkbutton,画布canvas的应用实战详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…