以太坊密码学

  • aisiji
  • 更新于 2024-05-13 16:09
  • 阅读 4543

本文介绍在以太坊密码学是如何工作的?什么是公钥和私钥,以及如何使用它们

本文介绍在以太坊密码学是如何工作的?什么是公钥和私钥,以及如何使用它们

1_17zR0QwK0X0uT_DvvTFG3g

From: immediateedgeapp.org

密钥和地址

以太坊有两种不同类型的账户:外部账户(EOAs)和合约。以太币的所有权是通过私钥,以太坊地址,和数字签名建立的。私钥是每个用户与以太坊交互的中心。事实上,账户地址直接来源于私钥:它唯一确定了一个以太坊地址,也叫账户。

私钥

私钥只是一个随机选择的数字。私钥的所有权和控制权是用户控制相应以太坊地址所有资产的根本,此外,用户还可以访问授权该地址的合约。私钥用于在交易中进行签名,以证明所有权。

必须确保私钥,如果将它透露给第三方就等于交出了以太币和合约的控制权。并且,必须要备份,以免意外丢失。如果私钥遗失,是无法恢复的,它所保护的资产也就永远丢失了。

从随机数生成私钥

生成密钥的第一步,也是最重要的一步,就是找到一个安全的熵或者随机数的源。创建以太坊私钥涉及到要从$ 1-2^{256}$中选择数字。以太坊软件使用底层操作系统的随机数生成器生成256位随机数。

私钥可以是任何非零的数字,可以大到只略小于$ 2^{256}$的非常大的数——一个非常大的78位的数,大约$ 1.158×10^{77}$。

“$ 2^{256}$——以太坊私钥空间的大小——是一个非常大的数字,十进制大约为$ 10^{77}$”——Andreas Antonopoulo,《Mastering Ethereum: Building Smart Contracts and DApps》的作者

注意,私钥生成是离线的;它与以太坊网络没有任何通信,也不需要。

不要自己编写代码来生成随机数或者用你的编程语言随机生成一个简单的随机数。

公钥

以太坊公钥是椭圆曲线上的一个点,一个满足椭圆曲线等式的(x,y)坐标。

它由两个从私钥生成的数字组成,并且只能单向生成,这意味着,如果你有一个私钥,就可以计算出公钥,但是你不能从公钥计算出私钥。

公钥是私钥通过椭圆曲线乘法得来,是不可逆的:$K = k × G$,这里的$k$是私钥,$G$是常数点(生成点),$K$是公钥。

椭圆曲线乘法(×)与普通的乘法不同。它是一种单向函数:一个方向很容易计算出结果(乘法),而反方向则是不可能的(除法)。

椭圆曲线密码学

椭圆曲线密码学是非对称的,基于离散算法问题的公钥密码学,这种离散算法问题由椭圆曲线上的点的加法和乘法来表示。

以太坊使用与比特币相同的椭圆曲线,secp256k1——Andreas Antonopoulo,《Mastering Ethereum: Building Smart Contracts and DApps》的作者

0_n5t8Gfv2NejIvwAq -椭圆曲线-

以太坊使用一个特定的椭圆曲线和一组数学常数,标准定义为secp256k1secp256k1曲线由函数定义,该函数会产生一条椭圆曲线:

$y^2 = ( x^3 + 7) over ( \mathbb F p)$ or: $y^2 \lvert p \rvert = (x^3 +7) \lvert p \rvert$

mod p(素数)表明这条曲线在素数阶p的有限域上,p = 2²⁵⁶–2³²–2⁹–2⁸–2⁷–2⁶–2⁴–1,这是一个非常大的素数。

以太坊地址格式

以太坊地址是一个十六进制数,用公钥的 Keccak-256 哈希的后20字节表示。

生成公钥

我们可以用helpeth命令行工具来创建ICAP地址,用npm安装:

npm install -g helpeth

如果没有npm,你可能就得按照这里的说明来安装。

helpeth keyGenerate

输出:

Address: 0xe16c1623c1aa7d919cd2241d8b36d9e79c1be2a2
Address (checksum): 0xe16C1623c1AA7D919cd2241d8b36d9E79C1Be2A2
ICAP: XE56 QBY1 TCEL SB4U 7BTR QQRC IOUY 8UNS DK2
Public key: 0xaa931f5ee58735270821b3722866d8882d1948909532cf8ac2b3ef144ae8043363d1d3728b49f10c7cd78c38289c8012477473879f3b53169f2a677b7fbed0c7
Private key: 0x227dbb8586117d55284e26620bc76534dfbd2394be34cf4a09cb775d593b6f2b

现在我们将用给定的私钥来推出公钥,如下:

helpeth keyDetails \
  -p 0x227dbb8586117d55284e26620bc76534dfbd2394be34cf4a09cb775d593b6f2b

输出:

Address: 0xe16c1623c1aa7d919cd2241d8b36d9e79c1be2a2
Address (checksum): 0xe16C1623c1AA7D919cd2241d8b36d9E79C1Be2A2
ICAP: XE56 QBY1 TCEL SB4U 7BTR QQRC IOUY 8UNS DK2
Public key: 0xaa931f5ee58735270821b3722866d8882d1948909532cf8ac2b3ef144ae8043363d1d3728b49f10c7cd78c38289c8012477473879f3b53169f2a677b7fbed0c7

“互换客户端地址协议 (ICAP) 是一种以太坊地址编码,部分兼容国际银行帐号 (IBAN) 编码,为以太坊地址提供灵活、校验和且可互操作的编码。ICAP 地址可以对以太坊地址或在以太坊名称注册表中注册的通用名称进行编码。” — Andreas Antonopoulo,《Mastering Ethereum: Building Smart Contracts and DApps》的作者

原文:https://betterprogramming.pub/understanding-ethereum-cryptography-3ef7429eddce

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
aisiji
aisiji
江湖只有他的大名,没有他的介绍。