主页 > imtoken转账怎么取消 > web3学习:key、address

web3学习:key、address

imtoken转账怎么取消 2023-05-05 07:43:21

>>> p =115792089237316195423570985008687907853269984665640564039457584007908834671663

>>> x =49790390825249384486033144355916864607616083520101638681403973749255924539515

>>> y =59574132161899900045862086493921015780032175291755807399284007721050341297360

>>> (x **3+7- y**2) % p

0升

椭圆曲线算术运算

很多椭圆曲线数学看起来很像我们在学校学到的整数运算。 具体来说,我们可以定义一个加法运算符,在曲线上添加数字或点。 一旦我们有了加法运算符,我们也可以定义一个点和一个整数的乘法,相当于重复加法。

许多椭圆曲线数学看起来和工作起来都非常像我们在学校学到的整数算法。 具体来说,我们可以定义一个加法运算符,它不是加数字,而是在曲线上加点。 一旦我们有了加法运算符,我们还可以定义一个点和一个整数的乘法,这样它就等同于重复加法。

加法定义为给定椭圆曲线上的两个点 P1 和 P2,以及椭圆曲线上的第三个点 P3 = P1 + P2。

在几何上,第三点 P3 是通过在 P1 和 P2 之间画一条直线来计算的。 这条线将在另一个地方与椭圆曲线相交。 将此点称为 P3' = (x, y)。 然后在 x 轴上反映得到 P3 = (x, –y)。

在椭圆曲线数学中,有一个点叫做“无穷远点”,大致相当于零的作用。 在计算机上,它有时表示为 x = y = 0(它不满足椭圆曲线方程,但它是可以检查的容易区分的情况)。 有几种特殊情况可以解释“无穷远点”的必要性。

如果 P1 和 P2 是同一点,则 P1 和 P2 之间的线应延伸到曲线上 P1 的切线。 切线刚好与曲线相交于一个新点。 您可以使用微积分技术来确定切线的斜率。 我们将兴趣限制在具有两个整数坐标的曲线上,这些技巧很奇怪!

在某些情况下(即,如果 P1 和 P2 具有相同的 x 值但不同的 y 值),切线将完全垂直,在这种情况下 P3 =“无限远点”。

如果 P1 是“无穷远点”,则 P1 + P2 = P2。 同样,如果 P2 是“无穷远点”,则 P1 + P2 = P1。 这显示了无穷大点如何扮演零在“正常”算术中扮演的角色。

+ 是结合的,(A + B) + C = A + (B + C)。 这意味着 A + B + C 没有括号,也没有歧义。

现在我们已经定义了加法,我们可以用扩展加法的标准方式定义乘法。 对于椭圆曲线上的一点P,如果k为整数,则k * P = P + P + P + ... + P(k次)。 请注意,在这种情况下,k 有时会被混淆地称为“指数”。

生成公钥

从一个随机生成的数字_k_的私钥开始,我们通过将它乘以曲线上称为_generator point_G_的预定点来生成曲线上其他地方的另一个点,这是对应的公钥_K。 生成点被指定为 +secp256k1+ 标准的一部分,对于 +secp256k1+ 的所有实现始终相同,并且从此曲线派生的所有密钥都使用相同的点 _G_:

\[\begin{equation} {K = k * G} \end{equation}\]

其中_k_为私钥,G_为生成点,_K_为生成的公钥有余额的以太坊私钥,即曲线上的一个点。 因为所有以太坊用户的生成点始终相同,所以将 _G_ 乘以 _G_ 的私钥将始终得到相同的公钥 _K。 k_和_K_的关系是固定的,但只能从_k_到_K_的一个方向计算。 这就是为什么可以在不泄露用户私钥 (k) 的情况下与任何人共享以太坊地址(来自 _K)的原因。

正如我们在 中描述的,k * G 的乘法相当于重复加法,G + G + G + ... + G,重复 k 次。 总之,为了从私钥_k_生成公钥_K_,我们将生成点_G_添加到自身_k_次。

提示

私钥可以转换为公钥,但公钥不能转换回私钥,因为数学只能以一种方式工作。

让我们应用此计算来查找我们提供的特定私钥的公钥:

私钥到公钥计算示例

K = f8f8a2f43c8376ccb0871305060d7b27b0554d2cc72bccf41b2705608452f315 * G

密码库可以帮助我们使用椭圆曲线乘法计算K值。 生成的公钥 _K_ 定义为点 K = (x,y):

从示例私钥计算的示例公钥

K = (x, y)

以太坊币有升值空间吗_有余额的以太坊私钥_以太坊有用吗

在哪里,

x = 6e145ccef1033dea239875dd00dfb4fee6e3348b84985c92f103444683bae07b

y = 83b5c38e5e2b0c8529d7fa3f64d46daa1ece2d9ac14cab9477d042c84c32ccd0

在以太坊中,您可以看到公钥表示为 66 个十六进制字符(33 字节)的十六进制序列。 这是从行业联盟标准高效密码组 (SECG) 提出的标准序列化格式中采用的,记录在[高效密码术标准 (SEC1)] 中。 该标准定义了四种可能的前缀,可用于识别椭圆曲线上的点:

字首

意义

长度(字节数前缀)

0x00

指向无穷大

1个

0x04

未压缩点

65

0x02

偶数 Y 的压缩点

33

0x03

奇数 Y 的压缩点

33

以太坊只使用未压缩的公钥,所以唯一相关的前缀是(十六进制)04。 依次连接公钥的 X 和 Y 坐标:

04 + X 坐标(32 字节/64 十六进制)+ Y 坐标(32 字节/64 十六进制)

因此,我们计算的公钥被序列化为:

046e145ccef1033dea239875dd00dfb4fee6e3348b84985c92f103444683bae07b83b5c38e5e2b0c8529d7fa3f64d46daa1ece2d9ac14cab9477d042c84c32ccd0

椭圆曲线库

secp256k1 椭圆曲线的几种实现用于加密货币相关项目:

打开SSL

OpenSSL 库提供了一套全面的加密原语,包括 secp256k1 的完整实现。 例如,要导出公钥,可以使用函数+EC_POINT_mul()+。

libsecp256k1

以太坊有用吗_以太坊币有升值空间吗_有余额的以太坊私钥

Bitcoin Core 的 libsecp256k1 是 secp256k1 椭圆曲线和其他加密原语的 C 实现。 Elliptic Curve Cryptography 的 libsecp256 是从头开始编写的,以取代比特币核心软件中的 OpenSSL,并且被认为在性能和安全性方面更胜一筹。

加密散列函数

整个以太坊都使用加密哈希函数。 事实上,散列函数在几乎所有的密码系统中都被广泛使用,密码学家 Bruce Schneier 指出这一事实,“单向散列函数不仅仅是加密算法,而是现代密码学的主要工具。

在本节中,我们将讨论哈希函数,了解它们的基本属性以及这些属性如何使它们在现代密码学的许多领域中如此有用。 我们在这里讨论哈希函数,因为它们是将以太坊公钥转换为地址的一部分。

简而言之,“哈希函数是一种可用于将任意大小的数据映射到固定大小的数据的函数。” 资料来源:维基百科。 哈希函数的输入称为原像_原像_或消息。 输出称为 hash_or_digest。 哈希函数的一个特殊子类别是密码哈希函数,它具有对密码学有用的特定属性。

加密散列函数是一种单向散列函数,它将任意大小的数据映射到固定大小的位串,这样如果输出已知有余额的以太坊私钥,则在计算上不可能重新创建输入。 确定输入的唯一方法是对所有可能的输入进行强力搜索,检查匹配的输出。

加密哈希函数有五个主要属性(来源:维基百科/加密哈希函数):

肯定

任何输入消息总是产生相同的散列摘要。

可验证性

计算消息的哈希是高效的(线性性能)。

无关的

对消息的微小更改(例如,单个位更改)会极大地改变散列输出,以至于它无法与原始消息的散列相关联。

不可逆性

从哈希计算消息是不可行的,相当于通过可能的消息进行蛮力搜索。

碰撞保护

计算产生相同散列输出的两个不同消息应该是不可行的。

碰撞保护对于防止以太坊中的数字签名伪造至关重要。

这些属性的组合使得加密哈希函数可用于范围广泛的安全应用程序,包括:

通过研究系统的各个层次,我们会发现它在以太坊中有很多应用。

以太坊的加密哈希函数 - Keccak-256

以太坊在很多地方使用_Keccak-256_加密哈希函数。 Keccak-256 被设计为 2007 年举行的 SHA-3 加密哈希函数竞赛的候选者。Keccak 是获胜算法,并于 2015 年标准化为 FIPS(联邦信息处理标准)202。

然而,在以太坊的发展过程中,NIST 的标准化工作正在完成。 标准流程完成后,NIST 调整了 Keccak 的一些参数,据称这提高了效率。 这与英雄举报人爱德华斯诺登泄露的文件相吻合,表明 NIST 可能受到 NSA 的不当影响,故意削弱 Dual_EC_DRBG 随机数生成器标准,有效地在标准随机数生成器中放置了一个后门。 这场辩论的结果是反对提议的更改,并严重延迟了 SHA-3 的标准化。 当时,以太坊基金会决定实施原始的 Keccak 算法。

警告

虽然您可能会在以太坊文档和代码中看到“SHA3”,但这些实例中的许多(如果不是全部)实际上指的是 Keccak-256,而不是最终确定的 FIPS-202 SHA-3 标准。 实现差异很小,与填充参数有关,但它们的重要性在于,在给定相同输入的情况下,Keccak-256 产生的哈希输出与 FIPS-202 SHA-3 不同。

由于以太坊 (Keccak-256) 和最终标准 (FIP-202 SHA-3) 中使用的哈希函数之间的差异造成的混淆,正在努力重构代码、操作码和名为 keccak256 的库中的所有 sha3 实例。 有关详细信息,请参阅以太坊/EIP#59

我使用的是哪个哈希函数?

如何判断您使用的软件库是 FIPS-202 SHA-3 还是 Keccak-256(如果两者都可能称为“SHA3”)?

以太坊币有升值空间吗_以太坊有用吗_有余额的以太坊私钥

一种简单的方法是使用_测试向量_,即给定输入的预期输出。 哈希函数最常见的测试是_空输入_。 如果您使用空字符串作为输入运行哈希函数,您应该会看到以下结果:

测试你使用的SHA3库是否是FIP-202 SHA-3的Keccak-256

Keccak256("") =

c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470

SHA3​​("") =

a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

因此无论调用什么函数,您都可以通过运行上面的简单测试来测试它是原始的 Keccak-256 还是最终的 NIST 标准 FIPS-202 SHA-3。 请记住,以太坊使用 Keccak-256,尽管它在代码中通常被称为 SHA-3。

接下来我们看一下Keccak-256在以太坊的第一个应用,就是从公钥生成以太坊地址。

以太坊地址

以太坊地址是使用单向哈希函数 (Keccak-256) 从公钥或合约派生的唯一标识符。

在我们之前的示例中,我们从私钥开始,并使用椭圆曲线乘法导出公钥:

私钥k:

k = f8f8a2f43c8376ccb0871305060d7b27b0554d2cc72bccf41b2705608452f315

公钥 K(X 和 Y 坐标串联并显示为十六进制):

K = 6e145ccef1033dea239875dd00dfb4fee6e3348b84985c92f103444683bae07b83b5c38e5e2b0c8529d7fa3f64d46daa1ece2d9ac14cab9477d042c84c32ccd0

警告

值得注意的是,在计算地址时,公钥没有格式化为前缀(十六进制)04。

我们使用 Keccak-256 来计算这个公钥的_hash_:

Keccak256(K) = 2a5bc342ed616b5ba5732269001d3f1ef827552ae1114027bd3ecf1f086ba0f9

然后我们只保留最后 20 个字节(big endian 中的最低有效字节),这是我们的以太坊地址:

001d3f1ef827552ae1114027bd3ecf1f086ba0f9

大多数时候,您会看到以“0x”为前缀的以太坊地址,表明它是十六进制编码的,如下所示:

0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9

以太坊地址格式

以太坊地址是十六进制数字,是从公钥的 Keccak-256 散列的最后 20 个字节派生的标识符。

与在所有客户端的用户界面中编码的比特币地址不同,比特币地址包含内置校验和以防止输入错误的地址,以太坊地址以原始十六进制形式呈现,没有任何校验和。

该决定背后的基本原理是,以太坊地址最终将隐藏在系统更高级别的抽象之后,例如名称服务,并且如有必要,应在更高层添加校验和。

回想起来,这种设计选择导致了几个问题,包括由于输入不正确的地址和输入验证错误而造成的资金损失。 以太坊名称服务的开发比最初预期的要慢,钱包开发人员采用 ICAP 等替代编码的速度非常缓慢。

以太坊币有升值空间吗_有余额的以太坊私钥_以太坊有用吗

Inter Exchange 客户端地址协议 (ICAP)

_可互换客户端地址协议 (ICAP)_ 是一种以太坊地址编码,与国际银行帐号 (IBAN) 编码部分兼容,为以太坊地址提供多功能、验证和可互操作的编码。 ICAP 地址可以对以太坊地址或通过以太坊名称注册中心注册的通用名称进行编码。

在 Ethereum Wiki::-Inter-exchange-Client-Address-Protocol 上阅读有关 ICAP 的信息

IBAN是识别银行账号的国际标准,主要用于电汇。 它在欧洲的单一欧元支付区 (SEPA) 及其他地区得到广泛采用。 IBAN 是一项集中且​​受到严格监管的服务。 ICAP 是以太坊地址的去中心化但兼容的实现。

IBAN 由 34 个字母数字字符(不区分大小写)组成,包括国家代码、校验和和银行账户标识符(国家特定)。

ICAP 通过引入代表“以太坊”的非标准国家代码“XE”使用相同的结构,后跟两个字符的校验和和 3 个可能的帐户标识符变体:

直接的

最多 30 个字母数字字符 big-endian base-36 整数,表示以太坊地址的最低有效位。 由于此编码小于 155 位,因此它仅适用于以一个或多个零字节开头的以太坊地址。 就字段长度和校验和而言,它具有与 IBAN 兼容的优势。 示例:XE60HAMICDXSV5QXVJA7TJW47Q9CHWKJD(33 个字符长)

碱基

与“直接”编码相同,只有 31 个字符长。 这使得对任何以太坊地址进行编码成为可能,但使其与 IBAN 字段验证不兼容。 示例:XE18CHDJBPLTBCJ03FE9O2NS0BPOJVQCU2P(35 个字符长)

间接的

编码通过名称注册提供商解析为以太坊地址的标识符。 使用 16 个字母数字字符,由_资产标识符_(例如 ETH)、名称服务(例如 XREG)和 9 个字符的名称(例如 KITTYCATS)组成,这是一个人类可读的名称。 示例:XE##ETHXREGKITTYCATS(20 个字符长),其中“##”应替换为两个计算出的校验和字符。

我们可以使用 helpeth 命令行工具来创建 ICAP 地址。 让我们使用我们的示例私钥(以 0x 为前缀并作为参数传递给 helpeth)进行尝试:

$ helpeth keyDetails -p 0xf8f8a2f43c8376ccb0871305060d7b27b0554d2cc72bccf41b2705608452f315

地址:0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9

ICAP: XE60 哈密 CDXS V5QX VJA7 TJW4 7Q9C HWKJ D

公钥:0x6e145ccef1033dea239875dd00dfb4fee6e3348b84985c92f103444683bae07b83b5c38e5e2b0c8529d7fa3f64d46daa1ece2d9ac14cab9477d042c84c32ccd0

helpeth 命令为我们构建了一个十六进制的以太坊地址和一个 ICAP 地址。 我们的示例密钥的 ICAP 地址是:

XE60HAMICDXSV5QXVJA7TJW47Q9CHWKJD

由于我们的示例以太坊地址恰好以零字节开头,因此可以使用 IBAN 格式的高效“直接”ICAP 编码方法对其进行编码。 因为它有 33 个字符长。

如果我们的地址不是从零开始的,那么它将被编码为“基本”,即 35 个字符长并且作为 IBAN 格式无效。

提示

任何以太坊地址以零字节开头的概率是 1/256。 要生成这样的类型,在我们找到与 IBAN ICAP 地址兼容的“直接”编码之前,平均需要使用 256 个不同的随机私钥进行 256 次尝试。

不幸的是,目前只有少数钱包支持 ICAP。

带大写校验和的十六进制编码 (EIP-55)

由于 ICAP 或名称服务的部署缓慢,提出了一个新标准,以太坊改进提案 55 (EIP-55)。 您可以在此处阅读详细信息:

通过修改十六进制地址的大小写,EIP-55 为以太坊地址提供向后兼容的校验和。 这个想法是以太坊地址不区分大小写,所有钱包都应该接受大写或小写的以太坊地址,在解释上没有任何区别。

通过修改地址中字母字符的大小写,我们可以传达可用于保护地址完整性免受键入或读取错误影响的校验和。 不支持 EIP-55 校验和的钱包会忽略地址包含混合大写字母的事实。 但是支持它的人可以验证它并以 99.986% 的准确率检测错误。

有余额的以太坊私钥_以太坊有用吗_以太坊币有升值空间吗

混合大小写编码很微妙,您一开始可能不会注意到它。 我们的示例地址是:

0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9

使用 EIP-55 混合大小写校验和,它变成:

0x001d3F1ef827552Ae1114027BD3ECF1f086bA0F9

您看得出来差别吗? 十六进制编码字母表中的一些字母 (AF) 字符现在是大写字母,而其他字母表是小写字母。 除非仔细观察,否则您甚至可能不会注意到其中的差异。

EIP-55 实施起来相当简单。 我们采用小写十六进制地址的 Keccak-256 哈希。 这个哈希充当地址的数字指纹,为我们提供了一个方便的校验和。 输入(地址)的任何小变化都可能导致哈希结果(校验和)发生大变化,从而使我们能够有效地检测错误。 我们地址的散列然后被编码成地址本身的大写字母。 让我们一步一步地分解它:

计算小写地址的哈希值,不带 0x 前缀::

Keccak256("001d3f1ef827552ae1114027bd3ecf1f086ba0f9")

23a69c1653e4ebbb619b0b2cb8a9bad49892a8b9695d9a19d8f673ca991deae1

如果散列的相应十六进制数字大于或等于 0x8,则将每个字母地址字符大写。 如果我们排列地址和散列,这更容易显示:

地址:001d3f1ef827552ae1114027bd3ecf1f086ba0f9

哈希值:23a69c1653e4ebbb619b0b2cb8a9bad49892a8b9...

我们的地址在第四个位置包含一个字母 d。 散列的第四个字符是 6,小于 +8+。 所以,我们保持 d 小写。 我们地址中的下一个字母字符是 f,它位于第六位。 十六进制散列的第六个字符是 c,它大于 +8。 所以我们在地址等中将 +F 大写。如您所见,我们仅使用哈希的前 20 个字节(40 个十六进制字符)作为校验和,因为我们只有 20 个字节(40 个十六进制字符)才能使其正确大写.

检查你自己生成的混合大写地址,看看你是否能分辨出哪些字符是大写的,以及它们在地址哈希中的对应字符:

地址:001d3F1ef827552Ae1114027BD3ECF1f086bA0F9

哈希值:23a69c1653e4ebbb619b0b2cb8a9bad49892a8b9...

检测 EIP-55 编码地址中的错误

现在,让我们看看 EIP-55 地址如何帮助我们发现错误。 假设我们已经打印出 ETHER-E 编码的以太坊地址:

0x001d3F1ef827552Ae1114027BD3ECF1f086bA0F9

现在,让我们在读取该地址时犯一个根本错误。 最后一个字符之前的字符是大写的“F”。 对于这个例子,假设我们误解了大写字母“E”。 我们在钱包中输入(错误的地址):

0x001d3F1ef827552Ae1114027BD3ECF1f086bA0E9

幸运的是,我们的钱包符合 EIP-55 标准! 它注意到混合的大写字母并试图验证地址。 它将其转换为小写,并计算校验和哈希:

Keccak256("001d3f1ef827552ae1114027bd3ecf1f086ba0e9")

5429b5d9460122fb4b11af9cb88b7bb76d8928862e0a57d46dd18dd8e08a6927

如您所见,即使地址只改变了一个字符(实际上,“e”和“f”仅相差 1 位),地址的哈希值也发生了根本性的变化。 这是散列函数的一个属性,使它们对校验和非常有用!

现在,让我们将这两个排列起来并检查案例:

001d3F1ef827552Ae1114027BD3ECF1f086bA0E9

5429b5d9460122fb4b11af9cb88b7bb76d892886...

都错了! 几个字母字符的大写错误。 请记住,大写是校验和的_正确_编码。

我们输入的地址的大小写与我们刚刚计算的校验和不匹配,这意味着地址发生了一些变化并引入了错误。