一.密码学基础

日常生活中,我们使用的纸质货币是由央行发行控制,并且每张纸币上都有可鉴定真假的防伪标识。
如果要发行数字货币,假如像纸币一样,发行货币后使用防伪标识来鉴定数字货币的真假。这看上去可行,但是,数字货币本质来说是一个文件,文件是可以随便复制的,这样的话每个人都可以在得到一个数字货币后无限复制,这肯定是不行的。所以在数字货币中需要用到些密码学的知识来防止这种现象。

一、哈希函数

哈希函数简单来说就是一个函数,但是他具备一些特性,使得该函数在密码学中发挥着重大的用处。

  • 特性一:他的输入可以是任意长度的字符串;(输入域可以说无限大)
  • 特性二:虽然他的输入长度任意,但是它产生固定的输出;(输出域是固定的)
  • 特性三:它可以有效的计算,也就是在合理的时间内可以对与特定的输入算出其输出;(也就是说不管输入啥都可以计算出来)

以上是哈希函数的基本特性,但如果要使哈希函数达到密码安全,还需要以下三个特性;

  • 安全特性一:碰撞阻力(collision-resistance)
    • 碰撞指对于两个不同的输入,一个哈希函数产生了同样的输出;
    • 碰撞阻力是指无法找到两个不同的输入产生相同的输出;(即x1x2, y1=hash(x1),y2 = hash(x2),没人能找到两个值使得y1=y2)
    • 注意上面说的是没人能找到两个值使得y1=y2,其实经过一些数学分析方法,任意一个哈希函数都是有碰撞的,因为输入域远远大于输出域,总会有两个x产生相同的y。但是经过计算(此处不再赘述),它们碰撞的概率任然是无穷小的,比两秒后地球被毁灭的概率还小。
    • 特性应用:信息摘要
  • 安全特性二:隐秘性(hiding)
    • 隐秘性是指在我们知道哈希函数的输出y=hash(x),我们没有可行的办法算出x;(如 + x = y,在知道y的情况下,我们很难算出x值为多少)
    • 注意:在实际操作中,对于输入域我们要有足够的随机性,如果输入域太小,隐秘性很容易被破解(比如输入域只有两个值,对手最对只需要试两次就可以知道你的输入值),所以最好在我们要输入的信息之后再拼接一些随机性较强的数值(如日期等),防止被破解。
    • 特性应用:承诺
  • 安全特性三:谜题友好(puzzle-friendliness)
    • 谜题友好是指如果有个人在知道输出y的情况下,想找到对应的输入x,在输入集合中,有一部分是非常随机的,那么他很难求得y值对应的输入
    • 说直白点就是在输入集合中有一部分是非常随机的,没有什么捷径可以快速的算出x,只能一个一个试。
    • 特性应用:比特币挖矿
1. 安全哈希函数(secure Hash Algorithm-256 [ SHA-256 ])

比特币使用该哈希函数

二. 哈希指针及数据结构

简单来说,哈希指针是一个指向数据存储位置其位置数据的哈希指针。

1. 区块链(Block Chain)
区块链数据结构.png
  • 链表头部的哈希指针被称为创世区块
  • 一个区块的哈希指针指向上一个区块
2. 梅克尔数(Merkle trees)

哈希指针建立的二叉树

梅克尔数.png

三、数字签名(digital signatures)--- 非对称加密算法

数字签名被认为是对纸上手写签名的模拟;如现实中我们写一个支票给另一个人,那个人去银行换钱的时候银行则对支票上的签名进行验证。同样,在区块链网络中,一个人向另一个人支付了比特币,他需要对这笔签名进行签名,而验证签名是由所有的区块链网络节点验证。

对于数字签名我们有两个特性的要求:

  • 特性一:只有你自己可以制作自己的签名
  • 特性二:我们希望一个签名只与某一个特定的文件发生联系(就像现实中签支票一个支票一个签名)
1. 数字签名的方案

数字签名的算法由以下三个算法构成:

  • generateKeys(keysize):生成一对密钥,一个公钥(public key),一个私钥(private key)
  • sig = sign(private key, message): 使用私钥对message进行签名
  • isValid(public key, message, sig): 验证消息有效性

比特币使用的签名算法叫做椭圆曲线数字签名算法(ECDSA)

四、公钥即身份

区块链网络中并没有中心化的用户管理,所以区块链的用户管理并不像平常我们像微信等软件一样的注册操作;如果想要加入区块链网络,用户直接在本地生成一对密钥,用户保留私钥,公布公钥,如果一条交易消息被某个用户的公钥验证通过,即代表该条交易由该用户发出。这样就将一个用户和系统参与者的身份对等了起来。

将公钥视为身份的一个结果是,你可以随时指定新的身份(你可以简单通过数字签名方案中的generateKeys程序生成新的公钥和私钥,则新公钥是你的新身份)

因为生成公钥是随机的,所以并没有人能够通过检查公钥发现你现实中的身份

公钥的哈希通常被称为地址

五、两种简单的加密货币

1. GoofyCoin
  • GoofyCoin规则:
    • 规则一:Goofy(GoofyCoin的创作者)可以随时创建新币,且这些新创建的货币都属于他;
    • 规则二:拥有此币的人可以将其转给其他人,转移一只币不是简单地将币数据结构发送给接收者,而是必须通过密码程序完成;
  • GoofyCoin如何创建新币:
    • Goofy生成一个他之前从未生成的唯一的货币编号(uniqueCoinID)
    • 建立字符串“CreateCoin[ uniqueCoinID ]”
    • 使用秘密密钥对建立的字符串进行签名
    • 该字符串和Goofy的签名就构成一个单位币
    • 任何人都可以验证该新币包含Goofy的有效签名,因此该新币为有效币
  • GoofyCoin转账:
    • 假如嘻嘻想转一枚币给哈哈
    • 哈哈需要创建一个声明“将此币转给哈哈”(声明中的“此币”就是该币的哈希指针,“哈哈”为哈哈的公钥)
    • 嘻嘻对该声明进行签名
  • GoofyCoin的安全隐患:
    • 双重支付(double spending):如果嘻嘻转一个币给哈哈,他并没有告诉其他人,在哈哈看来这个交易是没问题的;但是嘻嘻又创建一个“将此币转给啦啦”的声明并签名,在啦啦看来这条交易也是没问题的。但是,嘻嘻将一个币花了两次,这就有问题了,钱要是能这样花,给我100块我可以买下整个世界。23333333
2.ScroogeCoin(以GoofyCoin为基础创建,解决了double spending)
  • ScroogeCoin的主要概念:
    • 一个叫做Scrooge的指定实体将负责公布包含所有发生过的交易历史记录的仅增账目,之前所有的交易都被写如这个仅增账目,这样可以看到这个币之前是否有被消费,防止了double spending
    • ScroogeCoin造币:ScroogeCoin是通过交易造币,由Scrooge签署该交易的声明;
    • ScroogeCoin转账:这一交易会消耗币 ,就是消除他们,并创建相同数量的新币。
  • ScroogeCoin的安全隐患:
    • 在一条交易没有被Scrooge记录在仅增账本中时,会存在double spending ;
    • scrooge的权利太大了,虽然他不能创建虚假的交易,因为每个人都可以看这个账本,但是他可以停止对某用户的交易,不为他们提供服务,导致他们的ScroogeCoin无处可用;

你可能感兴趣的:(一.密码学基础)