摘要:BTC属于加密货币,其中必然涉及到密码学的知识,而比特币比较开放,交易记录,交易金额甚至是底层源代码都是对外开放,那么加密使用在何处?这里就来谈一谈······
1:哈希
哈希函数是密码学的一个重要分支,它是将任意长度的输入变换为固定长度输出的不可逆的单向密码体制,在消息完整性检测(消息认证)和数字签名等方面有广泛的应用。Hash函数也称散列函数,是一种单向密码体制,即它是一个从明文到密文的不可映射的过程,即只有加密过程,没有解密过程
1.1:哈希函数的三个重要性质
collision resistance:如果x!=y,那么H(X)!=H(Y),对于一个给定的x很难找到y使得H(X)=H(Y)
hiding:已知H(X)无法反推出X,类似于X被隐藏起来了
puzzle friendly:对H(X)的范围是无法预测的
1.2:哈希函数介绍
哈希碰撞:对于给定的X和Y,且X!=Y,有可能会得到Hash(X)=Hash(Y),这种情况则称为哈希碰撞。而collision resistance的性质保证如果有Hash(X)!=Hash(Y),则必然有X!=Y(但是这是理想状态,如果学过数据结构的同学应该知道常用的碰到哈希碰撞的解决办法有开放地址法等等)。在实际使用的过程中,哈希碰撞总是难以避免,但是我们只需要尽可能保证在X!=Y的前提下,使得Hash(X)!=Hash(Y),就可以认为其是collision resistance
collision resistance的意义:如果我们掌握了一条重要信息X,希望别人知道我有X,但是不希望别人知道X的具体信息,就可以通过告诉别人X的哈希值。由于collision resistance性质的保证,别人没有X,也就没有对应的Hash(X),因此别人也就知道你确实有X这一条信息。
hiding:我们认为,给定X和Hash(),可以很容易得到Hash(X),但没有办法在已知Hash(x)和Hash()的情况下,反推出X的具体取值,当然这也是一个理想的情况。
collision resistance和hiding结合实现digital commitment(数据保证): 可以拿市值预测的案例,某个人对某个市值进行预测,我们如何保证能够知晓其预测是否准确?最简单的是提前公布, 等待实际结果出现后验证。但实际中,当提前发布预测后,可能会由于预测者本身对市值实际结果造成影响(比如该预测者是业内极具影响力的人物)。 所以,应该将提前将其写于纸上并密封,交给第三方机构保管,等到实际结果出现后开启密封与实际对比,这就是digital commitment。而第三方机构需要能够使人信服,在实际生活中,有很多场景并不存在一个这样的第三方机构,而区块链技术正为此提供了一个很好的解决方法。 我们把预测结果看作X,提前公布Hash(X),等到预测结果发生时间来临后,公布X,如果根据X可以得到公布的Hash(X),则说明公布的X确实为所预先预测的 内容。从而,我们可以实际进行判断预测是否准确。实际使用中,为了X足够大,会对X进行“加盐”,对X拼接一 个nonce,对其整体取Hash。
Puzzle friendly:该性质要求哈希值计算事先不可预测, 仅仅根据输入很难预测出输出。例如:我们需要一个哈希值,存在于某一个范围内,只能通过不停运算查找出 来。该性质保证了比特币系统中,只能通过“挖矿”获得BTC。也就是说,该性质保证了工作量证明(POW)机制 可以运行下去【“挖矿难,但验证易”】。 在BTC系统中采用SHA-256和RIPEMD160哈希函数
2:挖矿
挖矿实际就是一个不断测试区块头部(block header)的随机数部分nonce使得整个区块头的哈希值满足H(block header)<= target的过程,这里的target通常前面x位都是0
区块的构成有区块头(block header)和区块体(block body)组成:
区块头的随机数就是nonce
2.1挖矿原理示意图
3:签名
3.1数字签名和手写签名的不同之处:
手写签名是被签文件的物理组成部分;数字签名是连接到被签消息上的数字串
数字签名和所签名的消息能够在网络中传输。手写签名使用传统的安全方式传输
手写签名是通过将它与真是的签名进行对比来验证正确与否;而数字签名是利用公开的验证算法来验证
数字签名的复制品是有效的;手写签名的复制品是无效的。
数字签名是0和1的字符串,因消息而异;手写签名是模拟的,因人而异
3.2数字签名的安全要求:
接受者能够核实签名者对消息的签名
除了签名者,任何人不能伪造消息的签名
同一消息不同时刻其签名是有区别的
签名者事后不能抵赖对消息的签名,出现争议时,第三方可解决争端
3.3加入BTC系统账户:
在BTC系统中创建账户只需要生成一个公私钥对。公私钥对保证了“数字签名”的应用。大致流程如下:比如A转给B,A需要用自己的私钥给该交易签名,B通过A的公钥来验证该交易是否由A发起(保证了交易的安全性)。你可能会担心是否会有两个人有相同的公私钥对,其实不必担心,签名算法中创建相同公私钥对的可能性微乎其微,所以通过大量创建账户来盗取他人交易的做法是不可行的