以太坊背后的密码学
现代密码学:
但以太坊协议中本身并没有任何加密信息,全部公开可以读取
非对称加密
公钥是对私钥使用椭圆曲线的乘法运算得到的
数学基础:
单向数学函数:一类易于从一个方向进行计算,但反向计算困难的函数
- 质因数分解问题
- 离散对数难题:基于椭圆曲线上的算数运算,模乘运算简单,但模除运算(反向运算困难)
哈希函数
在公钥到地址转换中使用
将任意长度的数据映射到固定长度数据的数学函数,具有单向性
我们可以通过测试判断使用的是哪一个哈希函数
密钥与地址
账户:分为外部账户与合约账户
数字签名:
私钥:
- 提供账户控制权
- 将一个很大的随机字符串放入256比特的哈希算法(Keccak-256/SHA256)中,便捷地产生一个256比特的数字,如果结果在有效范围中就有了一个合适的私钥,否则再次尝试,以十六进制表示
注意:使用密码学安全的伪随机数生成器
公钥:
- 用于识别身份
- 每个公钥都是椭圆曲线上的一个点,即一组x,y坐标,恰好满足椭圆曲线方程
- 公钥由两个数字组合在一起,这两个数字由私钥经过单向计算得来(反方向不易得解)
- 公钥通过对私钥使用椭圆曲线乘法运算得来,基本上该运算不可逆
地址:
以太坊地址是唯一的标识符,从公钥或者合约通过单向哈希函数Keccak-256计算而来,通过公钥哈希值保留后20位获得,加上0x前缀表示其采用十六进制表示方法。
以太坊地址中不存在校验信息,比特币地址中存在校验信息
一种校验方式EIP-55:大写校验
原因:ICAP与域名系统推进缓慢
简介:以太坊地址不区别大小写,对钱包而言,大小写都一样,使用大小写进行校验,而不支持此校验的钱包忽略即可
实现:
- 对全部小写地址进行哈希运算
- 取哈希值的前20为对应地址,如果对应哈希值>=8则改为大写
验证:
钱包
存储和管理用户密钥的系统,当然有些钱包也充当DAPP入口功能
有一个常见的误区认为钱包中包含以太币或者代币,实际上钱包只保存密钥,而以太币保存在区块链上
分类
非确定性(随机)钱包
正在被确定性钱包取代,管理备份使用很麻烦,重用密钥是保护隐私的好办法,这样易丢失
确定性钱包
基于密码种子的钱包,包含从一个种子密钥所派生的私钥。种子密钥是随机生成的数字与其他数据(索引号/链码)一起生成私钥
助记词
生成助记词
从随机源获取随机数,添加校验码,再把这个数字映射为一串英文单词
从助记词到种子密钥
使用密钥扩展算法将随机数衍生成512bit的种子
密钥扩展算法需要两个参数:助记词和salt
- 防止循环表格暴力破解
- 引入额外密码保护密码种子(默认mnemonic进行扩展运算/用户可选)
层级式确定性钱包
钱包中每一个密钥都由之前种子密钥派生
大多数HD钱包遵循BIP-32标准,这实际上已经成为确定性钱包的事实性行业标准
拓展公钥和私钥
扩展密钥:密钥本身+链码混合后产生子密钥
HD钱包特性,可以使用父公钥派生子公钥,也可以用自私钥派生子公钥。这样极大的提供了安全性,在web等服务器中部署拓展公钥派生功能完成每一笔交易,而拓展私钥则隔离保管,可以使用生成地址对应的私钥并通过签名交易来花费地址上的代币。
改进
问题:扩展公钥中带有链码,如果:子私钥泄露+链码–>所有子私钥、父私钥泄露
解决:增强派生–使用父私钥产生子链码
标识符与树状结构
BIP-44 HD钱包结构
参考来源:《精通ETH》第3、4章
|