主页 > imtoken安卓下载地址 > 如何生成比特币私钥

如何生成比特币私钥

imtoken安卓下载地址 2023-01-18 14:44:24

比特币私钥是每个比特币钱包都拥有的数字秘密。 这个 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

您会注意到,每次运行代码时比特币余额生成器,您都会得到不同的结果。

综上所述

根据实施的安全性和难易程度,有多种方法可以帮助您生成私钥。