主页 > imtoken怎么下载到手机 > 比特币所有权和隐私问题——非对称加密的应用
比特币所有权和隐私问题——非对称加密的应用
比特币系统如何确定账户中的比特币属于谁? 谁可以用比特币支付这个账户? 如果你对这个问题还不是很了解,那我们就一起来看看吧。
银行系统
我们先来回顾一下真实的银行系统:
首先,我们需要把自己的个人信息(比如身份证)交给银行,银行就会为我们开立相应的账户,银行在开户的时候就确立了账户的所有权。 付款时,银行完成向交易双方的转账(银行在开户时已经知道我们对应的账户)。
同时,银行会对账户信息保密(这实际上是不能保证的)。
匿名账本
那么比特币是如何在没有第三方银行介入的情况下,在保证隐私的同时确定账户所有权的呢?
事实上,比特币账户是用地址来表示的,账本上不会显示个人信息。 转账是将比特币从一个地址转移到另一个地址。 转账记录如下:
{
"付款地址":"2A39CBa2390FDe"
"收款地址":"AAC9CBa239aFcc"
"金额":"0.2btc"
}
那么问题就变成了谁有权使用地址进行付款。
支付和所有权其实是同一个问题,只要我能用这个比特币支付,我就有所有权
地址和私钥
比特币的解决方案是,谁拥有某个地址的私钥(如果根本没有加密的概念,私钥可以简单的当密码使用),谁就可以用这个地址来支付。 (所以私钥一定要妥善保管,如果私钥泄露,比特币可能会丢失)
比特币地址和私钥是非对称关系。 对私钥进行一系列计算(包括两次哈希)后,可以得到地址,但是不能从地址推导出私钥。
地址: 2A39CBa2390FDe
私钥: sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal
Hash(Hash(fun(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal))) -> 2A39CBa2390FDe
银行系统的银行账号和密码是完全独立的,不能相互推导。 转出时需同时验证账号和密码
或者上面交易的例子:
{
"付款地址":"2A39CBa2390FDe",
"收款地址":"AAC9CBa239aFcc",
"金额":"0.2btc"
}
只有地址为2A39CBa2390FDe的私钥才能进行支付。
非对称加密技术
这时候问题就变成了,如何证明你拥有某个地址的私钥(不泄露私钥)。
签署交易信息
实际上,在签名之前,会对交易信息进行Hash运算,得到摘要信息,然后对摘要信息进行签名。 流程大致是这样的: 1. 对交易进行哈希处理得到一个汇总信息(Hash值)
hash('
{"付款地址":"2A39CBa2390FDe",
"收款地址":"AAC9CBa239aFcc",
"金额":"0.2btc"
}') -> 8aDB23CDEA6
2.使用私钥对交易摘要进行签名(付款方在安全的环境下进行,避免私钥泄露),代码中大概是这样的。
#参数1为交易摘要
#参数2为私钥
#返回签名信息
sign("8aDB23CDEA6", "J78sknJhidhLIqdngalket") -> "3cdferdadgadg"
播送
签名计算完成后,支付节点开始全网广播:我支付了0.2btc给AAC9CBa239aFcc,签名信息为3cdferdadgadg,请确认。
广播过程实际上是向其他连接节点发送信息,其他节点验证后转发给连接节点,这样一个扩散过程。
广播信息包含原始交易信息和签名信息
核实
其他节点收到广播信息后比特币地址反推私钥软件,将验证签名信息是否为付款人使用私钥对原始交易信息进行签名生成的。 如果验证通过,则说明这笔交易确实是付款人自己发出的,说明这笔交易是有效的,会记录在账本中去。 (其实它还会验证支付账户是否有足够的余额比特币地址反推私钥软件,我们暂且忽略)验证过程其实就是签名过程的逆运算,大致过程用代码表示如下:
#参数1为签名信息
#参数2为付款方地址
#返回交易摘要
verify("3cdferdadgadg", "2A39CBa2390FDe") -> "8aDB23CDEA6"
如果验证输出信息与原始交易信息的哈希值一致,则验证通过并记录账本。 代码表示大致是这样的:
if(verify("3cdferdadgadg", "2A39CBa2390FDe")
== hash('{"付款地址":"2A39CBa2390FDe",
"收款地址":"AAC9CBa239aFcc",
"金额":"0.2btc"}')) :
# 写入账本
# 广播
else:
# donothing
可以理解为支付地址就是公钥,签名过程就是交易摘要用私钥加密的过程,验证过程就是用公钥解密的过程(为了方便大家理解,这里是严格来说是不准确的)。
补充说明
为了更好地理解,我简化了上面的一些信息。
比特币系统采用椭圆曲线签名算法。 该算法的私钥由32字节的随机数组成。 公钥可以通过私钥计算出来。 公钥可以通过一系列哈希算法和编码算法得到比特币地址。 可以理解为对公钥的总结。
深入浅出区块链——系统学习区块链,打造最好的区块链技术博客 我的知识星球将为您解答区块链技术问题,欢迎加入讨论。