区块链之旅(四)双花攻击、博弈论、Hash函数、数字签名

双花攻击

简介

“双花”,即一笔钱被花了两次或者两次以上,也叫“双重支付”

“双花攻击”,又叫“双重消费攻击”,即同一笔资金,通过某种方式被花费了两次,取得了超过该笔资金的服务。

实现

  • 在确认前的双花:零确认的交易本来就可能最后没有写入区块链。除非小额,最好至少等确认即可规避此类双花。
  • 在确认后的双花:这就要控制超50%算例才能试试。即类似于一个小分叉,将给一个商店的交易放入孤立区块中。这种确认后的双花,很难实施,只是理论上可行。

案例

2018年发生的比特币黄金(BTG)的双花攻击。BTG当时是全球第27大的加密货币。攻击者控制BTG网络上51%以上的算力(具体百度)

博弈论

简介

博弈论又被称为对策论(Game Theory)即是现代数学的一个新分支,也是运筹学的一个重要学科。博弈论是区块链的数学基础理论,区块链是基于一个分布式网络技术,在分布式网络上,任何一个节点获得信息的权利是对等的,你能在这个系统上得到的任何信息,另外一个人也完全能够得到。

关键概念

  • 纳什均衡:纳什均衡是博弈论的一个解决方案。假设每个参与者都知道其他参与者的策略的情况下,没有参与者可以通过改变自身策略使自身受益的一个概念。
  • 谢林点:这也是博弈论的一个解决方案。是指人们在没有沟通的情况下的选择倾向,做出这一选择可能因为他看起来自然、特别、或者与选择者有关。

模型

  • 决策者:例如公司董事长
  • 战略:未来推动公司发展而做出的决定
  • 回报:策略的结果

分类

  1. 根据参与者之间是否具有约束力的协议,博弈可分为。
    • 合作博弈:研究合作中如何分配利益的问题,目的是使得协议框架内所有参与者都满意,例如欧佩克组织。
    • 非合作博弈:只争取对自己最大化的利益,不考虑其他参与者的利益,与其他参与者之间没有共同遵守的协议
  2. 根据参与者选择策略、做出决定的先后顺序,博弈可分为。
    • 静态博弈:参与者的策略又先后,但后做的策略的参与者并不知道其他参与者的策略,例如石头剪刀布游戏。
    • 动态博弈:后的参与者知道其他参与者提前选择的策略,如下象棋。
  3. 根据对其他参与者的信息掌握程度,博弈分为。
    • 完全信息博弈:博弈中对其他参与者的特征、利益、可能选择的策略等信息有一个准确的了解,反之就是不完全信息博弈。
  4. 按照结果可分为。
    • 零和博弈、负和博弈、正和博弈(双赢博弈)

Hash函数

简介

一种算法,也称散列函数,消息摘要函数,单向函数或杂凑函数,任意程度的二进制数据映射为固定长度的二进制数据。

特点

  • 确定性:对同一个输入的数据,无论重复计算多少次,结果相同。
  • 单向性:hash函数的数学原理无逆运算,不能将hash值转换成加密前的信息。
  • 隐秘性:已知hash值的情况下,没有可行的办法算出函数的输入值。、
  • 防篡改:任何微小的输入都有可能对输出产生巨大的影响。
  • 抗碰撞:任意两个不同的数据库,hash值相同的可能性极小。

实现

MD系列、SHA系列

MD5

package main
import(
	"fmt"
    "crypto/md5"
    "encoding/hex"
)
func main(){
     
    //方法一
    data:=[]byte("hello world")
    s:=fmt.Sprintf("%x",md5.Sum(data))
    fmt.Println(s)
    //方法二
    h:=md5.New()
    h.Write(data)
    s= hex.EncodeToString(h.Sum(nil))
    fmt.Println(s)
}

SHA256

package main
import(
	"fmt"
    "github.com/nebulasio/go-nebulas/crypto/hash"
    "encoding/hex"
	"crypto/sha256"    
)

func main(){
     
    //方法一 一个方法直接输出
    data:=[]byte("hello world")
    hash:=hash.Sha256(data)
    fmt.Println(hex.EncodeToString(hash))
    sha256.New()
    //方法二 按照步骤一步一步输出
    h:= sha256.New() //创建sha256算法
    h.Write(data)  //用sha256算法对参数a进行加密,得到8个变量
    hashTemp := h.Sum(nil)//将8个变量相加得到最终hash
    fmt.Println(hex.EncodeToString(hashTemp))
}

数字签名

简介

数字签名在信息安全,包括身份认证、数据完整性、不可否认性以及匿名性有着重要应用,是吸纳带密码学的重要分支。签名隶属于公钥密码学。

签名过程:发送方用自己的私钥对发送信息进行所谓的加密运算,得到一个hash值,该hash值就是签名。使用时需要将签名和信息发给接收方。接受者用发送方公开的公钥和接收到的信息对签名及逆行验证,通过认证,说明接受到的信息是完整的,准确的,否则说明消息来源不对。

普通签名

签名只是用一把私钥,并且是发送方自己进行的签名动作,这类签名就是普通签名,常用的签名方法有很多,包括RSA数字签名,DSS数字签名,ElGamal数字签名,ECDSA数字签名

eg:

ECDSA签名对数据helloworld进行签名,上链之前需要先进行验证,验证通过之后才能上链。

基本过程

  1. 通过ecdsa.GenerateKey产生一私钥;输出的私钥是指针类型。
  2. 通过私钥产生公钥
  3. 对数据进行hash运算,实际公链中就是挖矿过程
  4. 未来可以给任何长度的data进行签名,我们创建自己的签名方法。
  5. 验证数据是否合法,也就是通过公钥对签名进行验证,通过后才能对数据进行上链动作。

群签名

入群:群成员在入群之前候会给群管理进行申请入群,通过后,申请人会和群管理员达成交互式协议,该协议可生成群成员的私钥。群管理员队该密钥进行签名,并颁发给申请人,完成入群。群成员群管理员将群公钥对外开放。

签名:群成员通过自己的群密钥和群公钥对消息进行签名,获取群签名。

验证:通过输入群公钥和群签名用公开的某种验证方法进行验证,返回值只有真假,验证者无法计算得到签名者是群公钥里的具体成员,只知道该签名属于群公钥里面,可以代表群体。

追踪:群管理员可以通过群签名得到具体是哪个群成员进行去拿命的。

群签名是一个中心化的签名结构,该结构的算法都是群管理员定的,造成签名者的隐私没有左到真正的保证。

关键要素

  1. 只有群体中合法成员才能代表整个群体进行签名。
  2. 接收者可以用群公钥验证群签名的合法性,但不知道群签名使群体中具体哪个成员所签。
  3. 在发生争议时,群管理员可以识别出实际的签名者。

环签名

可以认为是不可追踪的群签名,实际的操作过程都是自己完成的,没有群管理员。

签名者是某个群体的成员,他把其他群体的公钥拿来并加上自己的公钥组成一个群公钥,然后用自己的私钥和群公钥要发布的信息进行环签名。接收者接受到群公钥、签名、和信息,然后对签名进行验证,如果签名来自群公钥,那么验证成功,否则消息不合法。

群公钥中的签名者的公钥只是迷惑作用,并不对数据进行任何操作。

形成的签名因为是每个其他群公钥产生的数据和自己用私钥产生的数据组成的环,自己的数据隐藏环中,攻击者很难找到签名者的公钥,所以签名者的隐私很好的被保护起来了。

盲签名

盲签名允许使用者获得一个消息的签名,而签名者即不知道该消息的内容,也不知道该消息的签名。

盲签名可用于需要提供匿名性的密码协议中,如电子投票和电子现金。

基本组成:

  1. 消息盲化:使用者利用盲因子对要签名的信息进行盲化处理,然后将盲化后的消息发送给签名者。
  2. 盲消息签名:签名者对盲化后的消息进行签名,因此他并不知道真实消息的具体内容。
  3. 恢复签名:使用者除去盲因子,得到真实消息的签名。

零知识证明

实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需要采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,当证明过程不能向验证者泄露任何关于被证明消息的信息。

简单理解,就是证明者能够在不向验证者提供任何有用信息的情况下,让验证者相信你。

你可能感兴趣的:(区块链,区块链,博弈论,数字签名,哈希函数)