密码学原理:
哈希:
加密货币(crypto-currency)
密码学中所用的哈希函数被称为cryptographic hash function
它有两个重要的性质:
1. collisiion resistance(哈希碰撞)
两个不同的输入 哈希函数结果却相同
哈希碰撞是不可避免的 因为输入空间远远大于输出空间
输入可以是任意文本或数字 空间是无限大的 有任意多种输入的可能
然而输出空间却只有种可能 因为哈希值就是一个256位的二进制数
所以就会必然出现两个输入映射到同一个输出的情况
实际中 靠蛮力 也称为brute-force去找到这样一个哈希碰撞是几乎不可能的
假定有一个文本m 那么这个文本的哈希值H(m)叫做m的digest 用来检测对这个文本的篡改
前面我们提到的哈希碰撞 通过英文也可以理解为哈希反抗 意思为这种情况是不想要发生 事实上也确实是几乎不可能发生的
我们几乎是找不到一个H() = H(m) 所以哈希值digest完全可以验证文本真伪
举例:
我要把一重要的文本信息放到了腾讯云服务器上 放之前我生成了一下文本的哈希值并记录在自己电脑上 等要取回文本信息文件的时候 如果再次计算要取回文本信息的哈希值 发现与我当初记录的哈希值一样 那么就可以判定文本在腾讯云服务器的时候没有被修改
注意⚠️:在这个世界上 目前还没有任何一个数学家或者密码学家能找到人为制造哈希256碰撞的方法 但是也同样无法用数学证明不可以人为制造 这一理论是基于感性的经验
哈希函数也有多种形式 曾经有一个著名的哈希函数叫MD5 这个哈希函数最初也认为是不可以被人为制造的 但是最终依然在2004年的时候被我国密码学专家王小云破解
2. hiding (隐藏属性)
给定一个x可以算出一个哈希值H(x) 但是H(x)不可以反推出x
我们也可以理解为这个H(x)没有泄露出任何关于输入的任何信息
当然我们也可以通过蛮力求解 但是hiding成立的前提是输入空间要足够的大 并且取值的范围相对分散
由此 两种性质在一起就形成了digital commitment(digital equivalent of a sealed envelope)
这里我们来解读一下这段英文
Question: sealed envelope是一个密封的信封 加入我里面放了预测明天股票的信息 为什么要密封起来呢?
因为如果预测被提前公开了就会影响到明日的股票涨跌 比如我作为一个权威的专家预测明天某只股票可能要涨 结果大家一跟风都买入直接涨停 干扰了所预测的事情 所以要密封起来 那么加上了digital代表的意思是我把这个信封预测的内容转换成哈希值 因为hiding的属性 结果公布前没人能反推出我的预测内容 然而等结果出来后我把内容公布并再次转换成哈希值 并与我预测前的哈希值作比较 因为第一个哈希碰撞的属性 如果哈希值相同 则证明了结果前后我公布的预则内容是一致的
但是为了让输入空间足够的大 我们会把信封的内容加入一个随机数nonce
Bitcoin
在比特币中 除了需要密码学中两个属性之外 还需要一个属性叫:
Puzzle Friendly
比特币用的哈希函数叫SHA-256
SHA-256(Secure Hash Algorithm-256)是256个bit 转换成十六进制就是除以4 结果就是64位
假如我们想要得到一个哈希值 让这64位中的前10位十六进制数都是0
那么puzzle friendly属性就说没有一种捷径可以缩小输入的范围 只能靠蛮力一个一个去试
这里我们开始说比特币的挖矿:
挖矿其实就是在找这么一个随机数nonce 这个随机数nonce和区块里的其他信息合在一起作为输入得到一个哈希值
H(block header)
target
bloack header 成为区块头 里面包含着nonce和一些其他信息 只有nonce是我们可以操作修改的 挖矿其实就是在不停的去试nonce和其他信息的组合 得到的哈希值落在小于target这个范围内
Question: 为什么是小于target呢? 如果说我们正在寻找前10位都是零的十六进制哈希值 那么这个target就是0000000000FFFFFFFFFF……
也就是说10个零加54个F就是target 只要小于等于它 就落在这个范围了(有计算机基础的朋友应该都很容易理解)
又因为puzzle friendly的属性说没有捷径可以走 所以这个寻找合适的随机数nonce才可以作为
proof of work(工作量证明)
你挖到矿了(找到了合适的随机数nonce) 一定是因为你做了大量的工作 因为没有捷径
一旦有一个人(矿工)找到了这么一个nonce 就是把他的成果广播到全网
其他人验证他是否正确只要把他的nonce拿过来和其他信息组合得出哈希值 看看这个哈希值是不是真的小于等于target就行
注意⚠️:nonce随机数全世界的矿工都在疯狂寻找尝试 但是和nonce组合的“其他信息” 每个人手一份都是一模一样的
总结:寻找nonce难如登天 但是验证却很简单 算一次哈希值就好了
这个性质叫做:
difficult to solve but easy to verify
比特币作为数字货币的核心思想是去中心化 意思就是说不需要类似银行系统的存在帮我们来监管记账
Question: 那有个问题怎么去开账户呢? 答案是每个用户自己决定开户 不需要任何人批准 开户的过程非常简单 就是创造一个公钥和私钥对组(public key, private key)
公钥和私钥来源于:
asymmetric encryption algorithm 非对称加密体系
解释非对称加密体系之前 我们先来理解一下对称加密体系:
假设说我有一些信息想在网络上传给我的好朋友小红 但是不希望任何一个人知道其中的内容 我就选择了用一个加密钥匙(encyption key)给其加密 同时把加密钥匙也一并在网上发给我的好朋友小红让他用同一个加密钥匙去解密 这就是一种对称
然而用一个加密钥匙依然是不安全的 别人也可以用这个钥匙去解密我发送的文件信息
所以这时候就引出了非对成加密体系
在非对称加密体系中 加密用的是公钥 而解密用的是私钥 比如还是我给朋友小红传机密文件 但这次我加密的时候使用小红的公钥去加密 公钥就像面向对象中的public权限 谁都可以访问 而小红在收到这个加密文件后可以用自己的私钥去解开 私钥就像是面向对象里的private 除了自己谁都不可以访问
注意⚠️:加密和解密用的是同一个人的公钥和私钥 而且是接收方的
比特币账户的产生 是在本地电脑上产生一个公钥和私钥 这个公钥就像是银行的账号 别人给你转账就只要知道你的公钥就可以转账了 私钥相当于你的账户密码 知道私钥就可以把账户上的钱转走
在比特币中 我们都知道交易的账单是公开的 那为什么还需要加密呢?接下来就引出了“签名”
签名:
Question: 当公开的账单中出现了一条我发起的交易记录 别人怎么知道这个交易真的是我发起的呢?会不会有人打算冒名顶替我来发的这条虚假的交易记录呢?
所以在我发起的这条交易记录中还需要我用私钥进行签名 其他人收到我广播出去的交易记录的时候就需要用我的公钥去验证这个签名 都是同一个人“我”的私钥和公钥
Question: 这里有一个问题 怎么保证每一人产生的公私钥都是独立的呢?
如果有人个每天啥都不干 就去不停的创建公私钥尝试 从而登陆别人的账户去偷钱 那么是否真的可行呢?
答案在理论上讲是完全可行的 但是以我们如今的计算机算力和256位的哈希函数 得到一模一样的公私钥的概率小于地球爆炸的概率 所以可以忽略不计
备注:
本篇文章主要以理论为主讲了比特币的两大模块——哈希和签名 在后续的文章中 会涉及具体的数据结构和算法实现。