以私钥为(wei)原料生成私钥的过程
取决于伪随机数发(fa)生器(PRNG)和足够的熵(shang)。私钥最重要的是从1到(dao)22?在-1范围内(nei)随机选择的整数(shu)。这个范围内的任何数字都(dou)可以用作私钥。
现在我们已经初(chu)步学习了私钥背后的数学(xue)知识,可以自己生成一个有效(xiao)的私钥(译者注:出于教育目的,可以按照作者的思路,但不建议自(zi)己生成。)。让我(wo)们把私钥生成过程想象成一个长度(du)为78位的水平数(shu)字密码锁(可能的(de)组合数正好等于22?-1),那么我们把这个密码(ma)锁分成3行,每行26位。你可以把(ba)PRNG函数想象成随机(ji)排列数字并创建数字组(zu)合的东西:起初,每(mei)一位都是0,然后在每一位上(shang)随机选择一个特定的数字(zi)。假设我们用PRNG函数生成乱(luan)序数,得到如下三行(xing)数:
(1)0440694132102621719184878;
(2)43014596507006094171646853;
(3)06780198554267270848908554;
-十六进制数据表示(shi)法旨在减少表示数字所需的位数。但是(shi),计算机只能用二进制来处理数据-
如果我们同意需要(yao)用32个字节来表示我们在[1,22?-1],那么在十六进制形式中,我(wo)们需要64个数字来表示私(si)钥。现在我们可以把原来的私钥[X][X]4406941321102621719184878430145965070060941716468530678019854267270848908554[X][X]转换成十六进(jin)制形式:[X][X]66e 6769652 e6a 6 A 706572657 A 667777看到这些字母,我们很容易判断出这个(ge)数是十六进制的。
从私钥到(dao)公钥
现在,我们可以(yi)把这个十六进制私钥告诉我们的计算(suan)机了。我们可以(yi)使用JavaScript之类的编程语言很容易地(di)导入这个十六进制的私钥,这样它(ta)就可以用于后续的乘法运算。在接下(xia)来的代码中,将之前获得的十六进制数(shu)作为私钥导入(“sk”是secret_key的缩写,是密码学中(zhong)的标准记法)。这个十六进制(zhi)数以16为基础。
-通过使用BigNumber库,我们可以确(que)保在转换过程中不会丢失任何小数。这些数通常用指数表示(例如4.40694132102622E76),如果直(zhi)接解析成十六进(jin)制,就会失去精度。如果不使用BigNumber库,我们得到(dao)的十六进制私钥就会(hui)变成
616 e 6769652 e 6 c 000000000000000000000-
导入私钥(yao)后,下一步就是(shi)创建公钥。您可能还记得,我们在第一篇文章(zhang)中提到过,在获取以太(tai)坊地址之前,我们需要通(tong)过私钥生成公钥(yao)。根据以太坊黄皮书,公钥生成过程遵循标准的ECDSA公钥生成算法,其中我们(men)将私钥乘以生成(cheng)点得到一个坐标,坐标的x值和y值拼在一起就是公钥。我(wo)们的公钥(密码学中记为“pk”)可以用来生成我们的(de)以太坊地址。[X] [X] [X] [X]-X和Y是椭圆曲(qu)线上的点乘以我们的私钥(yao)(sk)得到的(de)。虽然在任何区(qu)块链中私钥都可以作(zuo)为一个地址的唯(wei)一生成器,但是(shi)邰方特别使用椭(tuo)圆曲线secp256k1来生成(cheng)公钥;所以私钥的签名(ming)操作也和这条曲线上述(shu)文章内容就是——
终于到了最后一步。有了公钥,我们就进行黄皮书中的最(zui)后一个操作:
给定一个私钥,以太坊地址A就是ECDSA公钥对应的Keccak哈(ha)希值最右边的160位。
正如你所看到的,仅仅一个数(shu)字(虽然很长)就可以生成一(yi)个以太坊地址来存储各种资产:从(cong)代表虚拟的猫、磁带、袜子、门票的(de)NFT,到具有(you)增值潜力的密码资产等。你的以太坊地(di)址是公开的,和你的家庭地址一样,但(dan)是只能用钥匙打开。如果你不想自己(ji)处理所有这些过程,你可以在Portis上注册一个帐户。Portis会自动为你创建一个私钥(yao)(这个私钥只有你(ni)自己知道,因为它采用了端到端的加密(mi)架构)和对应的以太坊地址(zhi),供你在100多个dApp中使用。
以太坊地址生(sheng)成流程如下:
1。生成256位随机(ji)数作为私钥。
2。将私钥转换成secp256k1未压缩格(ge)式的公钥,即512位公钥。
3。使用哈希算法Keccak256计算公钥的哈希值,并将其(qi)转换为十六进制字(zi)符串。
4。取十六进(jin)制字符串的最后40个字母,并在(zai)开头添加0x作为地址。以太坊地址生成示例
私钥生成公钥
以太坊使用的椭圆曲线算法是(shi)secp256k1,由私钥(yao)生成。
使用bx(bx)工具生成公(gong)钥
Mac用户可以使用布鲁(lu)尔安装bx(bx)工具:
$ brew安装bx以一个f2b 77 E3 a 4b 501206292912 c 94b 204540 a 44404386 b 10 c 615786 a 7个EFA 065d 20作为私钥,然后使(shi)用bx(bx)工具将私钥转(zhuan)化为第256k条的非(fei)压缩格式公钥:
$ bx欧共体对公众1a 4b 501206292912 c 94 b 204540 ad 44404386 b10c 615786 a 7 EFA 065 d20-u04 DFA 13518 ff 96549743 F3 a 01439 DD 34 ff 9969 C7 a 3f 0430 bbf 88657344252953 c 9884 af 784 EB 67使用secp 256 k1 py包生成公钥使用点(dian)走吧安装:$ pip安装秒256 k1
之后将私钥(yao)转化为公钥:导入sec 256 k1 private _ key=' 1f2b 77 e3a 4b 501206292912 c 94b 204540 ad 44404386 b110c 615786 a 7 EFA 065d 20 ' private _ key=字节fromhex(private _ key)私钥=sec 256 k1 . private _ key privatkey。pubkey。序列化(compressed=false).hex()' 04 DFA 13518 ff 96549743 F3 a 01439 DD 86 BC 34 ff 9969 C7 a3 f 0430 bbf 886573452953 c 9884 af 787 B2 cadd 45 f92 dff 2 b81 e 21 cfdf 98873 e 492 e 5 FDC 07 e 9 EB 67 ca 74d
计算(suan)公钥哈希值要使用keccak256战斗机(ji)哈希算法,可以使用(yong)加密模式(加密模式)工具,使用点走吧(ba)进行安装:$ pip安装pycrypt方法(fa)
公钥开头去(qu)除04年,将剩余部分转化(hua)为字节串并使用keccak256战斗机算法进行哈(ha)希:来自加密。散列导入keccak _ hash=keccak。new(digest _ bits=256)public _ key=' 04 DFA 13518 ff 96549743 F3 a 01439 DD 86 BC 34 ff 9969 C7 a3 f 0430 bbf 886573452953 c 9884 af 787 B2 cadd 45 f92 dff 2 b81 e 21 cfdf 98873 e 492 e 5 FDC 07 e 9 EB 67 ca 74 de[2> public_key = bytes.fromhex(public_key)>>> keccak_hash.update(public_key)>>> keccak_hash.hexdigest()'39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'
得到地址(zhi)取哈希值十六进制(zhi)字符串后 40 个字母,开头加(jia)上 0x 生成最终的(de)以太坊地址:>>> '0x'2022尚力(li)财经小编 + '39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'[-40:]'0xabcd68033a72978c1084e2d44d1fa06ddc4a2d57'
以太坊地址生成(cheng) Python3 实现使用 Python3 实(shi)现以太坊地址生成:import secp256k1from Crypto.Hash import keccakdef get_eth_addr(private_key_str=None): if private_key_str is None: private_key = secp256k1.PrivateKey() private_key_str = private_key.serialize() else: private_key_bytes = 2022尚力财经(jing)小编 bytes.fromhex(private_key_str) private_key = secp256k1.PrivateKey(private_key_bytes) public_key_bytes = private_key.pubkey.serialize(compressed=False) public_key_str = public_key_bytes.hex() keccak_hash = keccak.new(digest_bits=256) keccak_hash.update(public_key_bytes[1:]) h = keccak_hash.hexdigest() address = '0x' + h[-40:] return { "private_key": private_key_str, "public_key": public_key_str, "address": address }
参考资料以太(tai)坊在线地址生成工具:可以作(zuo)为以太坊靓号地址生成(cheng)工具,代码开源:https://github.com/bokub/vanity-eth。https://pycryptodome.readthedocs.io/en/latest/src/hash/keccak.html:Keccak python 工具。https://github.com/ctz/keccak:Python2 环境(jing)下使用的 Keccak,此为源代码,需要自(zi)己 clone 在本地使用。https://github.com/ludbb/secp256k1-py:secp256k1 的 Python 库。以上就是以太坊(fang)地址是怎么来的 以太坊(fang)地址生成过程的(de)详细内容,更多关于以太(tai)坊地址知识分享的资料请关注尚(shang)力财经其它相关文章(zhang)!