主页 > imtoken安卓下载地址 > 如何生成比特币私钥
如何生成比特币私钥
比特币私钥是每个比特币钱包都拥有的数字秘密。 这个 256 位的数字可以用几种格式表示:Hex - 256 位,Hex 是 32 个字节,或 0-9 或 a - f 范围内的 64 个字符,Base64 字符串,WIF 密钥或助记词。
例如:
E9873D79C6D87DC0FB6A5778633389F4453213303DA61F20BD67FC233AA33262
第一种方法
生成 32 字节整数的最简单方法是使用您知道的语言的 RNG 库。 以下是 Python 中的一些示例:
位 = random.getrandbits(256)
# 30848827712021293731208415302456569301499384654877289245795786476741155372082
bits_hex = hex(位)
# 0x4433d156e8c53bf5b50af07aa95a29436f29a94e0ccc5d58df8e57bdc8583c32
private_key = bits_hex[2:]
#4433d156e8c53bf5b50af07aa95a29436f29a94e0ccc5d58df8e57bdc8583c32
然而,普通的 RNG 库并不是密钥生成的最安全选择。 由于生成的字符串基于种子,因此种子代表当前时间。 如果你知道时间,你可以暴力破解几次。
加密强度高的 RNG
除了标准的 RNG 方法外,编程语言还为特定的密码学任务提供了 RNG。 由于RNG是由操作系统直接生成的,因此该方法安全性高。
这使得 RNG 的繁殖变得更加困难,因为您无法确定何时或什么种子产生。 甚至他也不需要种子,因为它是由程序本身创建的。
在 Python 中,您可以在 secret 模块中实现加密强度高的 RNG。
位 = secrets.randbits(256)
#46518555179467323509970270980993648640987722172281263586388328188640792550961
bits_hex = hex(位)
# 0x66d891b5ed7f51e5044be6a7ebe4e2eae32b960f5aa0883f7cc0ce4fd6921e31
private_key = bits_hex[2:]
#66d891b5ed7f51e5044be6a7ebe4e2eae32b960f5aa0883f7cc0ce4fd6921e31
专用网站
有几个网站会为您随机生成这些数字。 Random.org 是一个为各种目的随机生成数字的网站。 另一个受欢迎的网站是 bitaddress.org 是专门为生成比特币私钥而设计的。
由于您无法知道 random.org 是否保存或记录了生成的任何数字,因此这不是一个安全的选择。
但是,Bitaddress.org 是一个开源网站,这意味着您可以检查其代码以查看其功能,还可以下载并在您的计算机上以离线模式运行它。
该程序使用鼠标或按键移动来生成熵(热力学函数)。 这使得复制您的结果变得非常不可能。
然后,以压缩的 WIF 格式提供私钥,但我们会让算法返回一个十六进制字符串,稍后在生成公钥时将需要它。
Bitaddress 首先初始化字节数组,试图从计算机中获取尽可能多的熵。 它用用户输入填充一个数组,然后生成一个私钥。 该服务使用一个 256 字节的数组来存储熵。 这个数组是用循环填充的,所以当第一次填充数组时,指针被重置为零,然后再次填充数组。
从窗口启动阵列后。 它写入一个时间戳以生成额外的 4 个字节的熵。 它收集屏幕尺寸、时区、浏览器插件信息、区域等数据以添加另外 6 个字节。
然后在初始化之后,程序反复等待用户输入以重写初始字节。 随着光标移动,光标的位置被写入。 当按钮被按下时,被按下的按钮的字符代码由程序写入。
使用 RNG 算法生成 32 字节私钥的累积熵称为 ARC4。
DIY版
您还可以创建自己的 Bitaddress 版本。 我们不收集有关用户计算机和位置的数据。 熵只会由文本生成,因为通过 Python 脚本初始化光标的位置相当困难。
字节数组将使用加密 RNG 进行初始化,然后填充时间戳,然后填充用户生成的字符串。
填满第二个种子库后,库将允许您创建密钥。
初始化连接池
我们从加密的 RNG 中插入几个字节和一个时间戳。 __seed_int 和 __seed_byte 是两种有助于将熵插入池数组的方法。 我们还将在示例中使用 secrets 模块。
def __init_pool(自我):
对于范围内的我(self.POOL_SIZE):
random_byte = secrets.randbits(8)
self.__seed_byte(random_byte)
TIme_int = int(TIme.TIme())
self.__seed_int(TIme_int)
def __seed_int(self, n):
self.__seed_byte(n)
self.__seed_byte(n >> 8)
self.__seed_byte(n >> 16)
self.__seed_byte(n >> 24)
def __seed_byte(self, n):
self.pool[self.pool_pointer] ^= n & 255
自己。 pool_pointer += 1
如果 self.pool_pointer >= self.POOL_SIZE:
自己。 pool_pointer = 0
在这里比特币余额生成器,我们插入一个时间戳,后跟字符串的每个字符。
def seed_input(self, str_input):
time_int = int(时间.时间())
self.__seed_int(time_int)
对于 str_input 中的字符:
字符代码 = ord(字符)
self.__seed_byte(char_code)
生成私钥
为了用我们的池生成一个 32 字节的数字,我们必须使用一个共享对象,脚本中运行的任何代码都可以使用它。
为了在每次生成密钥时保存熵,我们将记住我们在此处停止的状态并为下一次密钥生成设置状态。
现在我们只需要确保我们的密钥在 (1, CURVE_ORDER) 范围内,这是 ECDSA 私钥所必需的。 曲线的顺序是secp256k1曲线的顺序。
我们会将密钥转换为十六进制并删除“0x”部分。
def generate_key(自我):
big_int = self.__generate_big_int()
big_int = big_int % (self.CURVE_ORDER — 1) # key "曲线顺序
big_int = big_int + 1 # key 》0
键 = 十六进制 (big_int)[2:]
返回键
def __generate_big_int(自我):
如果 self.prng_state 为无:
seed = int.from_bytes(self.pool, byteorder='big', signed=False)
随机种子(种子)
self.prng_state = random.getstate()
随机设置状态(self.prng_state)
big_int = random.getrandbits(self.KEY_BYTES * 8)
self.prng_state = random.getstate()
返回 big_int
为了使用该库,您可以使用以下代码生成私钥:
kg = 密钥生成器()
kg.seed_input
kg.generate_key()
#60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2
您会注意到,每次运行代码时比特币余额生成器,您都会得到不同的结果。
综上所述
根据实施的安全性和难易程度,有多种方法可以帮助您生成私钥。