比特币全部权及隐私问题-非对称加密应用

本文首发于深刻浅出区块链社区 原文连接:比特币全部权及隐私问题-非对称加密应用原文已更新,请读者前往原文阅读python

比特币系统是如何肯定某个帐户的比特币是属于谁的?谁能够支付这个帐户比特币? 若是你对这个问题还不是很明白,那就一块儿来看看吧。算法

银行系统

咱们先来回顾下现实的银行系统:json

  1. 首先咱们须要把咱们的我的信息(如身份证)给银行,银行给咱们开立相对应的帐户,银行在开户的时候确立了对帐户的全部权。
  2. 进行支付的时候,银行对交易双方完成转帐(银行在开户的时候已经知道咱们对应的帐户)。

同时银行会对帐户信息进行保密(这点其实不能保证)。数组

匿名帐本

那么比特币如何在没有第三方银行的参与下,在确保隐私的同时如何肯定帐户全部权的呢?安全

实际上比特币的帐户是用地址来表示,帐本上不显示我的信息,转帐是把比特币从一个地址转移到另外一个地址。 转帐记录如这样:学习

{
    "付款地址":"2A39CBa2390FDe"
    "收款地址":"AAC9CBa239aFcc"
    "金额":"0.2btc"
}

接下来问题就变为了 谁有权用某个地址进行付款。区块链

支付和全部权 实际是同一个问题,若是此比特币只有我能够用来支付,那么说明我拥有全部权编码

地址与私钥

比特币的解决方案是,谁拥有某个地址的私钥(若是彻底没有加密概念的人,能够简单的把私钥看成密码),谁就能用这个地址进行支付。(因此私钥必定保管好,若是私钥泄漏,比特币就可能丢失)加密

比特币地址和私钥是一个非对称的关系,私钥通过一系列运算(其中有两次Hash)以后,能够获得地址, 可是没法从地址反推获得私钥。code

地址: 2A39CBa2390FDe
私钥: sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal

Hash(Hash(fun(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal)))  -> 2A39CBa2390FDe

银行系统银行帐号和密码是彻底独立的,没法互相推导,转出时须要同时验证帐号和密码

仍是上面交易的例子:

{
    "付款地址":"2A39CBa2390FDe",
    "收款地址":"AAC9CBa239aFcc",
    "金额":"0.2btc"
}

只有拥有地址2A39CBa2390FDe的私钥才能进行支付。

非对称加密技术

这个时候问题就变为了,如何证实你拥有某个地址的私钥(在不泄漏私钥的状况下)。

对交易信息进行签名

实际在签名以前,会先对交易信息进行Hash运算获得摘要信息,而后对摘要信息进行签名。过程大概是这样: 1.对交易进行hash, 获得一个摘要信息(Hash值)

hash('
    {"付款地址":"2A39CBa2390FDe",
    "收款地址":"AAC9CBa239aFcc",
    "金额":"0.2btc"
    }') -> 8aDB23CDEA6

2.用私钥对交易摘要进行签名(付款方在安全的环境下进行,以免私钥泄密), 用代码表示大概是这样。

#参数1为交易摘要
#参数2为私钥
#返回签名信息
sign("8aDB23CDEA6", "J78sknJhidhLIqdngalket") -> "3cdferdadgadg"

广播

在签名运算以后,付款节点就开始在全网进行广播:我支付了0.2btc到AAC9CBa239aFcc,签名信息是3cdferdadgadg,大家来确认一下吧。

广播过程其实是发信息到相连的其它节点,其它节点在验证经过后再转发到与之相连的节点,这样的扩散过程。

广播的信息包含了交易原始信息和签名信息

验证

其它节点在收到广播信息以后,会验证签名信息是否是付款方用私钥对交易原始信息签名产生的,若是验证经过说明确实是付款方本人发出的交易,说明交易有效,才会记录到帐本中去。 (实际还会验证付款帐号有没有足够的余额,咱们暂时忽略这点) 验证过程实际是签名过程的逆运算,用代码表示大概过程是这样的:

#参数1为签名信息
#参数2为付款方地址
#返回交易摘要
verify("3cdferdadgadg", "2A39CBa2390FDe") -> "8aDB23CDEA6"

若是验证输出的信息和原始交易信息的hash一致,则验证经过,记录帐本,用代码表示大概是这样:

if(verify("3cdferdadgadg", "2A39CBa2390FDe")
    == hash('{"付款地址":"2A39CBa2390FDe",
              "收款地址":"AAC9CBa239aFcc",
              "金额":"0.2btc"}')) :
    # 写入帐本 
    # 广播
else:
   # donothing

你们能够理解为付款地址为公钥,签名过程即为用私钥对交易摘要的加密过程,验证过程为用公钥解密的过程(为方便你们理解,严格来说是不许确的)。

补充说明

上面为了更好的理解,我对一些信息进行了简化。

比特币系统使用了椭圆曲线签名算法,算法的私钥由32个字节随机数组成,经过私钥能够计算出公钥,公钥通过一序列哈希算法和编码算法获得比特币地址,地址也能够理解为公钥的摘要。

深刻浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。

☛ 个人知识星球为各位解答区块链技术问题,欢迎加入讨论。

☛ 关注公众号“深刻浅出区块链技术”第一时间获取区块链技术信息。

相关文章
相关标签/搜索