关于区块链密码学
什么是密码学
以下是密码学在维基百科中的解释:
密码学(英语:Cryptography)可分为古典密码学和现代密码学。在西方语文中,密码学一词源于希腊语kryptós“隐藏的”,和gráphein“书写”。古典密码学主要关注信息的保密书写和传递,以及与其相对应的破译方法。而现代密码学不只关注信息保密问题,还同时涉及信息完整性验证(消息验证码)、信息发布的不可抵赖性(数字签名)、以及在分布式计算中产生的来源于内部和外部的攻击的所有信息安全问题。古典密码学与现代密码学的重要区别在于,古典密码学的编码和破译通常依赖于设计者和敌手的创造力与技巧,作为一种实用性艺术存在,并没有对于密码学原件的清晰定义。而现代密码学则起源于20世纪末出现的大量相关理论,这些理论使得现代密码学成为了一种可以系统而严格地学习的科学。
直到现代以前,密码学几乎专指加密算法:将普通信息(明文)转换成难以理解的数据(密文)的过程;解密算法则是其相反的过程:由密文转换回明文;加解密包含了这两种算法,一般加密即同时指称加密与解密的技术。
加解密的具体运作由两部分决定:一个是算法,另一个是密钥。密钥是一个用于加解密算法的秘密参数,通常只有通信者拥有。历史上,密钥通常未经认证或完整性测试而被直接使用在加解密上。
加密算法
- 对称密码算法
是指加密和解密使用相同的密钥,典型的有DES、RC5、IDEA(分组加密),RC4(序列加密);
- 非对称密码算法
又称为公钥加密算法,是指加密和解密使用不同的密钥(公开的公钥用于加密,私有的私钥用于解密)。比如A发送,B接收,A想确保消息只有B看到,需要B生成一对公私钥,并拿到B的公钥。于是A用这个公钥加密消息,B收到密文后用自己的与之匹配的私钥解密即可。反过来也可以用私钥加密公钥解密。也就是说对于给定的公钥有且只有与之匹配的私钥可以解密,对于给定的私钥,有且只有与之匹配的公钥可以解密。典型的算法有RSA,DSA,DH,ECC;
- 散列算法
散列变换是指把文件内容通过某种公开的算法,变成固定长度的值(散列值),这个过程可以使用密钥也可以不使用。这种散列变换是不可逆的,也就是说不能从散列值变成原文。因此,散列变换通常用于验证原文是否被篡改。典型的算法有:MD5,SHA,Base64,CRC等。
散列算法
散列算法(英语:Hash function)又称散列函数、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。
打个比方,我们每一个人都是一个大大的数据,包括我们一生中的各种数据,记忆、生日、家庭、人生经历、外表、DNA健康数据等。我们把这些数据最后都浓缩成一小串数字来表示一个人,基本上这串数字就像指纹一样的唯一的,每一个人都不可能重复。当然我这里说的是基本上,也有可能存在两个指纹一样的人,但是按道理来说我们需要的是唯一。也就是说哈希函数的抗碰撞性,越好的哈希函数越不可能从两个不同的输入得到两个相同的输出。
还有一个就是原像不可逆性,也就是说你不可能通过这一小串数据反向得到我的所有数据。比如你有了我的指纹,但是你不可能通过我的指纹知道我的生辰八字,我的DNA数据等。
区块链中的密码学
维基百科:
区块链(英语:blockchain或block chain)是借由密码学串接并保护内容的串连交易记录(又称区块)。每一个区块包含了前一个区块的加密散列、相应时间戳记以及交易数据(通常用默克尔树算法计算的散列值表示),这样的设计使得区块内容具有难以窜改的特性。用区块链所串接的分布式账本能让两方有效纪录交易,且可永久查验此交易。
简单来说区块链就是有一个个区块组件,每个区块由两个哈希值和一个存储空间组成,每个区块只和它的前一个区块连接。而这里的连接正式通过哈希值所关联的,其中一个哈希值是上一个区块的,一个哈希值是自己的。这个哈希值代表的就是一种身份,也就是我们上文所说的唯一标识“指纹”。
区块链中所运用到的密码学包含以下几种:
- 支撑比特币底层交易系统的哈希树(Merkle tree)
- 用于保护区块链中消息摘要真实性的非对称加密算法:椭圆曲线算法(ECC)
哈希树(Merkle tree)
在密码学及计算机科学中,哈希树(hash tree)是一种树形数据结构,每个叶节点均以数据块的哈希作为标签,而除了叶节点以外的节点则以其子节点标签的加密哈希作为标签 。哈希树能够高效、安全地验证大型数据结构的内容,是哈希链的推广形式。
哈希树的概念由瑞夫·墨克于 1979 年申请专利,故亦称墨克树(Merkle tree)。
Merkle树一般用来进行完整性验证处理。在处理完整性验证的应用场景中,Merkle树会大大减少数据的传输量及计算的复杂度。
哈希树的理论基础是基于质数分辨定理,简单地说就是:n个不同的质数可以“分辨”的连续整数的个数和他们的乘积相等。“分辨”就是指这些连续的整数不可能有完全相同的余数序列。
关于哈希树的整个验证过程,查找在查找——图文翔解HashTree(哈希树)一文中有比较清楚的解释。
我们在blockchain中可以看到最近生成的区块,点开其中起一个,可以看到它的区块头中有一个叫做Merkle Root
,也就是墨克树里的根节点墨克根。这个墨克根就是根据这次区块里所有的交易根据哈希树生成的。
椭圆曲线算法
在比特币中,用户生成一个随机整数 k (256位二进制数)作为其账户私钥,而用对应的公钥 K(K=kG) 的哈希值作为其账户的比特币地址。
用户需要使用其账户比特币地址上的货币时,只需要提供一个用其私钥对地址金额等信息计算出的签名和对应的公钥。其他比特币用户就可以在只知道该用户公钥的情况,验证该签名是否有效,从而判断该用户是否真正拥有该地址上的货币。
攻击者因为无法通过其公钥或比特币地址来推算出私钥,也就无法伪造出一个有效的签名来盗用其账户上的货币。