您的位置:首页 > 新技术 >

块状链干货:关于钱包的基本密码

2020-06-28 10:32:00 来源:电子说

通过区块链,人类历史上第一次“私有财产神圣不可侵犯”得到了彻底和纯粹的技术保障。

但是,底层技术“加密”是如何工作和保护数字资产安全的呢?不管你是情人还是投资者,你都应该知道背后的原则,以免误解、开玩笑或损失资产。因为我们总是听到一些无聊的故事(帮我找到我的密码!私钥已发送到该组!),都是因为对钱包的性质缺乏了解。

本文仅讨论与钱包原型相关的密码学,不包括密钥库、助记词、转移交易等。

如何生成钱包

这是以太网黄皮书中对钱包(私钥、公钥、地址)的描述,只有两行。主要说明私钥通过椭圆曲线签名算法导出公钥,然后通过Keccak单向散列函数导出地址。

分解为三个步骤:

1.创建随机私钥(64位十六进制字符/256位/32字节)

2.从私钥导出公钥(128位十六进制字符/512位/64字节)

3.从公钥导出地址(40个十六进制字符/160位/20字节)

这是我从以太网中剥离的JavaScript代码。黄皮书中关于公式的具体实现只有6行代码。

这是一件美妙的事情。两行文本和六行代码承载着数十亿的资产,但是越简单,就越神秘。以上六行代码已经涵盖了密码学中的大多数技术,比如随机数生成器、非对称加密、单向散列函数等等。下面,我将为大家剖析这6行代码,并逐一介绍它们背后的密码学知识。

随机数

随机数用于生成私钥。如果可以预测或复制随机数,私钥将立即无效。因此,确保随机数具有以下三个特征非常重要:

随机性:没有统计偏差,序列完全混乱

不可预测性:你无法猜测过去系列的下一个数字

不可复制性:除非保留该系列,否则不能复制同一系列

软件本身不能生成不可复制的随机数,因为运行软件的计算机本身只有有限的内部状态。因此,通过确定性编码,当周期足够长时,将出现相同的随机数。因此,为了生成具有不可复制性的随机数,有必要从不确定的物理现象中获取信息,如环境温度、环境噪声、鼠标移动、键盘输入间隔等。

在Linux内核中维护一个熵池,以收集来自设备驱动程序和其他来源的环境噪声。熵是描述系统混乱和无序程度的物理量。系统的熵越大,系统的有序性就越差,也就是说,不确定性就越大。

因此,在选择随机数方法生成私钥时,我们需要选择满足密码强度的随机数方法,如节点中的crypto.randomBytes。当您调用crypto.randomBytes(32)方法时,它将等待熵池收集足够的信息,然后返回一个64位的随机数,即私钥。

此外,在以太网中获得随机数并不容易,因为矿工需要获得相同的结果,并在核实后提交给区块链。然而,如果EVM有随机操作码,矿工将产生不一致的随机数,无法达成共识。

目前,社会各界也提出了相应的方案。《雾》的作者亚历克斯范德桑德尔建议使用块哈希来生成随机数。然而,因为矿工有能力操纵块数据,如果他们有能力并且愿意放弃五个块的奖励,他们可以在理论上间接地影响随机数,所以他们不是完全安全和可靠的。

为了解决矿工可能作恶的问题,国内社会提出了随机道:一个以以太网项目RNG为代表的道,构建一个人人都能参与的道,通过经济激励,所有参与者共同决定一个随机数。在RANDAO的基础上,维塔利克布特林还提出了RANDAO方案。如果你感兴趣,你可以看看。

不对称加密

在对称密码中,因为加密和解密密钥是相同的,所以必须将密钥分发给接收者进行解密。然而,在发送密钥的过程中,窃听者可以窃取密钥进行解密,但不发送密钥,接收者不能解密,密钥必须发送但不能发送。这个问题叫做密钥分配问题。通常采用预先共享密钥、密钥分发中心和Diffie-Hellman密钥交换等方案来解决这个问题。然而,在非对称加密方案出现之前,没有必要将解密密钥分配给接收者,密钥分配问题得到了很好的解决。

在非对称加密中,密钥分为加密密钥和解密密钥,通常称为公钥和私钥。公钥和私钥之间存在一对一的对应关系,由公钥加密的密文只能通过使用与公钥配对的私钥来解密。

这似乎有点复杂。让我们让密码学的男女主角爱丽丝和鲍勃以一种流行的方式进行分类:

发送者:鲍勃,接收者:爱丽丝,窃听者:夏娃

1.爱丽丝生成一个密钥对(私钥和公钥),私钥由爱丽丝自己妥善保管

2.爱丽丝把她的公共钥匙送给鲍勃,即使夏娃偷了它。

3.鲍勃使用爱丽丝的公钥加密信息,并将其发送给爱丽丝

4.密文可能被夏娃窃取,但他不能用公钥解密

5.爱丽丝用她的私钥解密密文

当我们调用secp256k1.publicKeyCreate来获取公钥时,我们实际上使用了非对称加密中的椭圆曲线算法。公钥可以通过该算法从私钥导出,这是一个不可逆的过程:k=k * g。给定常数点g,使用已知私钥K不难找到公钥K,但相反,使用已知公钥K很难找到私钥K.这是椭圆曲线算法中的离散对数问题,这就是为什么您可以与其他人共享地址(或公钥),但不能泄露您的私钥。

const PublicKey=secp 256 k1 . PublicKeyCreate(私有密钥,false)。切片(1)

//PublicKey . ToString(' hex '):1e 3f 1532 e 3285 b 02。 45d91a36a8d78cb6bef8

为了生动地展示椭圆曲线算法是如何从私钥中导出公钥的,我们将使用一个简单的整数作为私钥K,并找到公钥K=k * G,也就是说,G被加K倍(数学原理是一致的)。在椭圆曲线中,点的添加相当于从该点画一条切线,找到与曲线相交的另一点,然后将其映射到X轴。下图显示了从曲线获得g、2G、4G和8G的几何运算。

单向散列函数

单向散列函数有一个输入和一个输出,其中输入称为消息,输出称为散列值。哈希值也称为消息摘要或指纹。单向哈希函数可以根据消息的内容计算哈希值,哈希值可以用来检查消息的完整性。

单向散列函数具有以下四个特征:

1.根据任意长度的消息,计算固定长度的哈希值

2.哈希值可以快速计算

3.单向的

4.消息的不同哈希值是不同的

当我们调用CreateKeccakash(“Keccak 256 256”)方法时,Keccak使用海绵函数对公钥和初始内部状态进行异或运算,获得一个32字节的哈希值,然后取接下来的20个字节,并将其转换为40位十六进制字符,即地址。

在以太网中有许多地方应用单向散列函数,例如:

1.矿工需要不断计算特定数据的哈希值。当哈希值满足难度要求时,矿工可以广播该块并获得奖励。

2.根据默克尔根哈希的值是否一致,判断块中的事务是否被篡改

作为题外话,有一段时间,我对单向散列函数或散列函数中“散列”的含义很好奇。后来,经过调查,发现“哈希”最初在古法语中是“斧头”的意思,后来扩展到“chop”,这是单向哈希函数的生动比喻,它将消息切碎并混合成固定长度的哈希值。后来,它通过赫伯特赫勒曼的《Digital Computer System Principles》成为一个广为流传的术语。

栏目导读

无人车“入春”,批量上路仍需“爬坡”

  防控疫情的需求激发之下,代替人类送药、送餐送菜、消毒巡逻的无人车成了疫情期间的特殊尖兵。疫情过后,无人车配送是否...

2020-03-23 17:12

5G、AI、大数据的发展,对智慧城市会有什么影响

市场分调研机构Omdia的最新数据分析显示,全球智能城市人工智能(AI)软件市场将从6 738亿美元(2019年),在2025年将增长到4...

2020-04-07 17:55

机器人制造过程中的传感器技术之磁光效应传感器

现代电测技术日趋成熟,由于具有精度高、便于微机相连实现自动实时处理等优点,已经广泛应用在电气量和非电气量的测量中。

2020-04-07 17:56

微软不需要快速拥抱VR

微软经常在游戏领域开辟路径,扮演开拓者的角色,这一点体现在很多方面,包括微软的尖端技术(DX12终极版 DX光追),硬件(X...

2020-04-07 17:57

波音Starliner载人航天器再次展开测试

去年 12 月,波音为美国宇航局发射了未载人的 Starliner 航天器。然而由于技术问题,任务并没有按计划进行。作为 NASA ...

2020-04-07 17:58