专栏名称: 以太坊爱好者
以太坊爱好者
目录
相关文章推荐
大江网  ·  比特币涨至10.72万美元,机构预测今年底前 ... ·  16 小时前  
白话区块链  ·  Circle股价飙升,2025将成加密IPO丰收年 ·  4 天前  
请辩  ·  课题分离,你真的懂吗? ·  4 天前  
51好读  ›  专栏  ›  以太坊爱好者

干货 | 关于钱包的基础密码学 (1)

以太坊爱好者  · 公众号  · 区块链  · 2017-09-30 20:58

正文

请到「今天看啥」查看全文


  • 不可预测性:不能从过去的数列推测下一个出现的数

  • 不可重现性:除非将数列保存下来,否则不能重现相同的数列

  • 软件本身是无法生成具有不可重现性的随机数,因为运行软件的计算机本身仅具备有限的内部状态。所以通过确定性的代码,在周期足够长的情况下,必然会出现相同的随机数。因此要生成具备不可重现性的随机数,需要从不确定的物理现象中获取信息,比如周围温度、环境噪音、鼠标移动,键盘输入间隔等。

    在 Linux 内核中维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。

    所以在选择生成私钥的随机数方法时,需要选择满足密码学强度的随机数方法,比如 Node 中的 crypto.randomBytes 。当你调用 crypto.randomBytes(32) 方法时,它会等待熵池搜集足够的信息后,返回 64 位的随机数,即私钥。

    const privateKey = crypto.randomBytes(32)// privateKey.toString('hex'): ea4692a11d962b249f8f0439d642a9013a1a08807649311d3672886d72d1fe51

    另外,在以太坊中想要获得随机数是一件不容易的事情,因为矿工需要得到同样的结果,并经过验证提交到区块链上。但如果 EVM 存在 random opcode,矿工会生成不一致随机数,无法达成共识。

    目前社区也提出相应的方案,Mist 的作者 Alex van de Sande 提出使用 blockhashes 生成随机数,但由于矿工拥有操纵区块数据的能力,如果有能力且愿意放弃 5 个区块的奖励,理论上可以间接影响随机数,所以不是完全足够安全可靠。

    为了解决矿工有可能作恶的问题,国内社区提出 RANDAO: A DAO working as RNG of Ethereum 项目,构建一个人人可以参与的 DAO,通过经济激励,由所有参与者共同决定一个随机数。在 RANDAO 的基础上,Vitalik Buterin 也提出 RANDAO++ 方案,感兴趣可以看看。

    非对称加密

    在对称密码中,由于加密和解密的密钥相同,所以必须向接收者配送密钥用于解密。但发送密钥过程中,窃听者可以窃取密钥解密,不发送密钥吧,接收者无法解密,密钥必须发送,但又不能发送,这问题称为密钥配送问题。一般采取事先共享密钥、密钥分配中心、Diffie-Hellman 密钥交换等方案来解决,但直到非对称加密方案的出现,无需向接收者配送解密密钥,密钥配送问题才完美解决。

    在非对称加密中,将密钥分为加密密钥和解密密钥,也就是我们常说的公钥和私钥。公钥和私钥一一对应,由公钥加密的密文,必须使用公钥配对的私钥才可以解密。

    看似有点复杂,我们祭出密码学的男女主角 Alice 和 Bob,来通俗地梳理一下:
    发送者: Bob,接收者:Alice,窃听者:Eve
    1. Alice 生成密钥对(私钥和公钥),私钥由 Alice 自身妥善保管
    2. Alice 将自己的公钥发送给 Bob,即使被 Eve 窃取也没关系
    3. Bob 使用 Alice 的公钥对消息加密,发送给 Alice
    4. 密文可能被 Eve 窃取,但他无法使用公钥解密
    5. Alice 使用自己的私钥解密密文







    请到「今天看啥」查看全文