004:密码学算法简介|《ETH原理与智能合约开发》笔记
待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此简书文集记录我的学习笔记。
课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。
第一课分为四部分:
- 以太坊简介
- 课程框架
- 密码学算法简介
- 实验平台搭建
这篇文章是第三部分的学习笔记:密码学算法简介。
在以太坊中主要使用了两种密码学的算法,单向散列函数和椭圆曲线加密算法。
1、单向散列函数
Hash函数(单向散列)是密码学的一个重要分支,它是一种将任意长度的输入变换为固定长度的输出且不可逆的单项密码体制,Hash函数在数字签名和消息完整性检测等方面有着广泛的应用。
1.1 单向散列函数简介
单向散列函数的特点:
- 任意长度的输入数据,输出值是固定长度,相当于输入数据的指纹。
- 每一个特定的输入数据都对应到一个“唯一”的输出值。这一点,可以联想人的指纹。
- 从输出值(散列值)无法反推出输入值。
- 在给定时间和给定计算资源的条件下,以目前的技术水平,无法找到有同一个数据“指纹”的两条不同的数据。
- 输入数据改变 1 bit(位),输出结果也会产生巨大变化。
常见的Hash函数有MD5、SHA1、SHA256。其中,MD5、SHA1都已被破解,有安全隐患。SHA256目前是安全的。
1.2 Keccak256
由于MD5、SHA系列的Hash函数遭受到了碰撞攻击,NIST(National Institute of Standards and Technology)在2005年10月31日到11月1日和2006年8月24日至25日举办了两次Hash函数研讨会,评估了Hash函数当前的使用状况,征求了公众对Hash函数的新规则。经过讨论之后,在2007年11月,NIST决定通过公开竞赛,以高级加密标准AES的开发过程为范例开发新的Hash函数。经过一系列竞赛,NIST在2012年评选出最终算法并产生了新的Hash标准。Keccak算法由于其较强的安全性和软硬件实现性能,最终被选为新一代的标准Hash算法,并被命名为SHA-3。
以太坊采用的是Keccak256,也就是 SHA-3 的前身。
- SHA256 属于MD4 家族,使用同一结构的压缩函数引擎,所以,攻击MD5和SHA1的方法可以被扩展,用来攻击SHA256。虽然目前还没有爆出SHA256 被攻击成功的案例,但如果下一代单向散列函数还基于同一原理,系统风险会大大增加。
- Keccak 属于完全不同的框架(海绵函数引擎),可以分散被成功攻击的风险。Keccak256软件实现速度较慢, 但是对于硬件实现非常友好,基于硬件的算法实现数据处理速度很快。
- NIST接受原始的Keccak256设计后,更改了Padding的格式, 以太坊坚持使用了原始的方案,因为这一更改存在争议,导致了正式的SHA3实现和原始的Keccak不兼容。
2、椭圆曲线加密算法
2.1 secp256 k1 数字签名算法
数字签名算法一般的框架是由非对称密钥算法结合单向散列函数算法构成的一个综合解决方案。
以太坊重用了比特币所采用的非对称密钥算法。也就是重用了secp256k1 这条曲线,再结合了Keccak256单向散列函数算法。
用户需要保有一对密钥:公钥/私钥。私钥是最重要的,公钥对所有人公开,同时也是生成地址 /账户的根据。
一个以太坊外部账号是由公钥做Keccak256运算,取其后20位而得出。其中,Keccak256运算得到的值为32位。公式如下:
EOA_Address=Keccak256(K_pub), LSB 20 bytes
数字签名的特性:不可篡改,不可抵赖。
2.2 数字签名的例子
数字签名的例子Alice给Bob转账。
- Alice 发起一个交易
- 对交易做Kecca256生成其散列值
- Alice拿自己的私钥对散列值签名
- 将交易和签名一起发给Bob
- Bob也对交易做Kecca256生成其散列值
- Bob再拿Alice的签名和Alice的公钥通过验证算法来检查交易,通过或失败。
2.3 secp256 k1 的庐山真面目
(这部分先略去,在评论区放一个知乎上搜到的问答贴,作为延伸阅读)