以私钥(yao)为原料生成私钥(yao)的过程
取决于伪随机数发生器(PRNG)和足够的熵。私钥最重要的是(shi)从1到22?在-1范(fan)围内随机选择的整数。这(zhe)个范围内的任何数字(zi)都可以用作私钥。
现在我们已经初步学习了私(si)钥背后的数学知识,可以自(zi)己生成一个有效的私钥(译者注:出(chu)于教育目的,可以按照作(zuo)者的思路,但不建议自己(ji)生成。)。让我们把私钥生成过程想(xiang)象成一个长度为78位的(de)水平数字密码锁(可能(neng)的组合数正好等于22?-1),那(na)么我们把这个密码锁分成3行,每行26位。你可(ke)以把PRNG函数想象成(cheng)随机排列数字并(bing)创建数字组合的东西:起初,每一位都是0,然后在每一位上(shang)随机选择一个特定(ding)的数字。假设我们用PRNG函(han)数生成乱序数,得到如(ru)下三行数:
(1)0440694132102621719184878;
(2)43014596507006094171646853;
(3)06780198554267270848908554;
-十六进制数据表(biao)示法旨在减少表示数字所需的(de)位数。但是,计算机(ji)只能用二进制来处理数据-
如果我们同意需要(yao)用32个字节来表示我们在[1,22?-1],那么在十六(liu)进制形式中,我们需要64个数字来表(biao)示私钥。现在我们可以把原来的私钥[X][X]4406941321102621719184878430145965070060941716468530678019854267270848908554[X][X]转换成十六进制形式:[X][X]66e 6769652 e6a 6 A 706572657 A 667777看到这些字母(mu),我们很容易判断出这个数(shu)是十六进制的。
从私钥到公钥
现在,我们可以把这个十六进(jin)制私钥告诉我们的(de)计算机了。我们可以使用(yong)JavaScript之类的编程语言很容(rong)易地导入这个十(shi)六进制的私钥,这样它就可以用于后续(xu)的乘法运算。在接下来(lai)的代码中,将之前获得的十六进(jin)制数作为私钥导入(“sk”是secret_key的缩(suo)写,是密码学中的标准记(ji)法)。这个十六进制数以16为基础。
-通过使用BigNumber库,我们可以确保在转换过程中不会丢失任(ren)何小数。这些数(shu)通常用指数表示(例如4.40694132102622E76),如果直接解析成十六进制,就会失去精度。如果不使用BigNumber库,我(wo)们得到的十六进(jin)制私钥就会变成
616 e 6769652 e 6 c 000000000000000000000-
导入私钥后,下一(yi)步就是创建公钥。您可能还记得,我们(men)在第一篇文章中提到过(guo),在获取以太坊(fang)地址之前,我们需要通过私钥生成公钥(yao)。根据以太坊黄皮书,公(gong)钥生成过程遵循标准的ECDSA公钥生成算(suan)法,其中我们将私钥乘以生成点得到(dao)一个坐标,坐标的x值和y值(zhi)拼在一起就是公钥(yao)。我们的公钥(密(mi)码学中记为“pk”)可以用来生成我们的(de)以太坊地址。[X] [X] [X] [X]-X和Y是椭圆曲线上的(de)点乘以我们的私钥(sk)得到(dao)的。虽然在任何(he)区块链中私钥都可以(yi)作为一个地址的唯一生成器,但(dan)是邰方特别使用椭圆曲线secp256k1来生成公钥;所以私钥的(de)签名操作也和这条曲线(xian)上述文章内容就是——
终于到了最(zui)后一步。有了公(gong)钥,我们就进行黄(huang)皮书中的最后一(yi)个操作:
给定一个私(si)钥,以太坊地址A就是ECDSA公钥对应的Keccak哈希值(zhi)最右边的160位。
正如你所看(kan)到的,仅仅一个数字(虽然(ran)很长)就可以生(sheng)成一个以太坊地址来存储各(ge)种资产:从代表虚拟的猫、磁带、袜子、门票的NFT,到具(ju)有增值潜力的密码资产等。你的以(yi)太坊地址是公开(kai)的,和你的家庭地址(zhi)一样,但是只能用钥匙打开。如(ru)果你不想自己处理所有这(zhe)些过程,你可以在Portis上注册一个帐户。Portis会自动为你创建一个私钥(这个私钥(yao)只有你自己知道,因为它采用了端到端的加密架构)和对(dui)应的以太坊地址,供你在100多个dApp中使用。
以太坊地址生成流(liu)程如下:
1。生成256位随机数作为私(si)钥。
2。将私钥转换(huan)成secp256k1未压缩格(ge)式的公钥,即512位公(gong)钥。
3。使用哈希算法Keccak256计算公钥的哈希值,并将其转换为十(shi)六进制字符串。
4。取十六进制字(zi)符串的最后40个字母,并在开头添加(jia)0x作为地址。以太坊地址(zhi)生成示例
私钥生成(cheng)公钥
以太坊使用的(de)椭圆曲线算法是secp256k1,由私钥生成。
使用bx(bx)工具生(sheng)成公钥
Mac用(yong)户可以使用布鲁尔安装(zhuang)bx(bx)工具:
$ brew安装bx以一个f2b 77 E3 a 4b 501206292912 c 94b 204540 a 44404386 b 10 c 615786 a 7个EFA 065d 20作为私钥,然后使用bx(bx)工具将私钥转化为第256k条的非压缩格式公钥:
$ 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包生成公(gong)钥使用点走吧安装:$ pip安装秒256 k1
之后将私钥转化为(wei)公钥:导(dao)入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
计算公钥哈希值(zhi)要使用keccak256战斗机哈(ha)希算法,可以使用加密模(mo)式(加密模式)工具(ju),使用点走吧进行安装:$ pip安装pycrypt方法
公钥开头(tou)去除04年,将剩余部(bu)分转化为字节串并(bing)使用keccak256战斗机算(suan)法进行哈希:来自加(jia)密。散列导入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'
得到地址取哈希值十六(liu)进制字符串后 40 个字母,开头(tou)加上 0x 生成(cheng)最终的以太坊地址:>>> '0x'2022尚力财(cai)经小编 + '39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'[-40:]'0xabcd68033a72978c1084e2d44d1fa06ddc4a2d57'
以太坊地址(zhi)生成 Python3 实现使用 Python3 实现以太坊地址生成(cheng):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尚力财经小编 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 }
参考资料以(yi)太坊在线地址生成工具(ju):可以作为以太坊靓号地址生成工具(ju),代码开源:https://github.com/bokub/vanity-eth。https://pycryptodome.readthedocs.io/en/latest/src/hash/keccak.html:Keccak python 工具。https://github.com/ctz/keccak:Python2 环境下使用的 Keccak,此为源代码,需要自己 clone 在本地使用(yong)。https://github.com/ludbb/secp256k1-py:secp256k1 的 Python 库。以上就是(shi)以太坊地址是怎么来的 以太坊地(di)址生成过程的详细内(nei)容,更多关于以太坊地址知(zhi)识分享的资料请关(guan)注尚力财经其它相关文章!