当前位置:首页 > 物联网 > 区块链
[导读] 比特币私钥是每个比特币钱包都有的一个数字秘密。这个256位数字可以用几种格式表示: 十六进制- 256位,十六进制是32字节,或0-9或a - f范围内的64个字符,Base64字符串,WIF键

比特币私钥是每个比特币钱包都有的一个数字秘密。这个256位数字可以用几种格式表示: 十六进制- 256位,十六进制是32字节,或0-9或a - f范围内的64个字符,Base64字符串,WIF键,或助记短语。
 

举例说明:

E9873D79C6D87DC0FB6A5778633389F4453213303DA61F20BD67FC233AA33262

第一个方法

生成32字节整数的最简单方法是使用您所知道的语言中的RNG库。以下是Python中的一些示例:

bits = random.getrandbits(256)

# 30848827712021293731208415302456569301499384654877289245795786476741155372082

bits_hex = hex(bits)

# 0x4433d156e8c53bf5b50af07aa95a29436f29a94e0ccc5d58df8e57bdc8583c32

private_key = bits_hex[2:]

# 4433d156e8c53bf5b50af07aa95a29436f29a94e0ccc5d58df8e57bdc8583c32

然而,普通的RNG库并不是生成密钥的最安全的选择。由于生成的字符串基于一个种子(seed),所以种子表示当前时间。如果你知道时间,可以对它进行几次暴力攻击。

密码学上强大的RNG

除了标准的RNG方法之外,编程语言还为特定的加密任务提供RNG。由于RNG是由操作系统直接产生的,因此该方法具有较高的安全性。

这使得RNG的繁殖更加困难,因为你无法确定产生的时间或种子。甚至他不需要种子,因为它是由程序本身创建的。

在Python中,您可以在secret模块中实现加密强RNG。

bits = secrets.randbits(256)

#46518555179467323509970270980993648640987722172281263586388328188640792550961

bits_hex = hex(bits)

# 0x66d891b5ed7f51e5044be6a7ebe4e2eae32b960f5aa0883f7cc0ce4fd6921e31

private_key = bits_hex[2:]

# 66d891b5ed7f51e5044be6a7ebe4e2eae32b960f5aa0883f7cc0ce4fd6921e31

专门的网站

有几个网站可以为您随机生成这些数字。Random.org是一个为各种目的随机生成数字的网站。另一个受欢迎的网站isbitaddress.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):

for i in range(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

self.pool_pointer += 1

if self.pool_pointer 》= self.POOL_SIZE:

self.pool_pointer = 0

在这里,我们插入一个时间戳,然后输入字符串的每个字符。

def seed_input(self, str_input):

TIme_int = int(time.time())

self.__seed_int(time_int)

for char in str_input:

char_code = ord(char)

self.__seed_byte(char_code)

生成私钥

为了用我们的池生成一个32字节的数字,我们必须使用一个共享对象,它被运行在一个脚本中的任何代码所使用。

为了节省每次生成键时的熵,我们将记住在此停止的状态,并为下一次生成键设置状态。

现在我们只需要确保我们的键在范围(1,CURVE_ORDER)内,这是ECDSA私钥所必需的。曲线的阶数是secp256k1曲线的阶数。

我们将把密钥转换为十六进制,并删除“0x”部分。

def generate_key(self):

big_int = self.__generate_big_int()

big_int = big_int % (self.CURVE_ORDER — 1) # key 《 curve order

big_int = big_int + 1 # key 》 0

key = hex(big_int)[2:]

return key

def __generate_big_int(self):

if self.prng_state is None:

seed = int.from_bytes(self.pool, byteorder=’big’, signed=False)

random.seed(seed)

self.prng_state = random.getstate()

random.setstate(self.prng_state)

big_int = random.getrandbits(self.KEY_BYTES * 8)

self.prng_state = random.getstate()

return big_int

为了使用该库,您可以使用以下代码生成私钥:

kg = KeyGenerator()

kg.seed_input

kg.generate_key()

# 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2

您将注意到,每次运行代码时,您都会得到不同的结果。

结论

根据安全性和实现的容易程度不同,有许多方法可以帮助您生成私钥。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭