虚拟货币中的用到的密码学

科技   2024-12-29 08:00   广东  
相信做过和金钱钱相关业务的伙伴,对数据在网络上的传输和加密并不陌生,下图是笔者10多年前在处理一个外部订单系统整个加密验证过程,仅供参考

我们讨论一下比特币中加密体系是如何实现的
1. 哈希函数(cryptographic hash function)

哈希函数是密码学中常用的重要概念,哈希算法有两个性质

1.1 哈希碰撞 collision resistance 
什么是哈希碰撞(collision resistance)?
假如我们有两个输入,一个是x,一个是y ,x!=y , 哈希函数是H ,我们计算出H(x)=H(y),这叫哈希碰撞

目前没有一种人为的高效的方法来制造哈希碰撞,使得x的哈希值等于y的哈希值,可以通过brute-force的方式!这种方式带来的后果是工作量非常大

这个哈希碰撞(collision resistance)有什么用呢?
可以用来给message求签名,假如我们有一个message,计算这个message的哈希值H(message),用来检测对Message的篡改,如果有人尝试改message的内容,那么哈希值就会发生变化,collision resistance 特性说明你找不到message2能使它的哈希值和message的哈希值相等,没有办法篡改内容而又不被检测出来。
哈希碰撞(collision resistance)现实中的用途
现实生活中最典型的就是文件校验,假如你有一个文件想要存储到云端,将来用的时候再下载下来,那么我们如何判断下载下来的文件和我当初上传的文件是一样的呢?这就用到了哈希碰撞(collision resistance) ,在你上传文件之前计算出该文件的哈希值,在你将来用的时候在下载下来计算一下哈希值,用来对比一下如果相等,就说明没有被篡改,如果不等,就被篡改,没有哪个哈希函数在数学上能够证明是collision resistance,我们刚才说的这个性质是从理论上证明不出来的,只能靠实践中的经验,世界上那么多密码专家,谁也没有找到人为制造哈希碰撞的方法!
这里面有个很著名的例子MD5,MD5曾经是一个很流行的哈希函数,现在已经不安全,目前已经知道如何去做人为碰撞。

1.2 隐藏(Hiding)

什么是隐藏(Hiding)
Hiding 说明哈希函数的计算是单向的不可逆的,我们可以算出x的哈希值H(x),但是没有办法根据H(x)反推出原来的x,换句话说这个哈希值没有泄露任何关于x的信息,其实这里有一种方法是可以的,就是我们上面提到的brute-force,遍历所有的输入可能,计算出一个和x的哈希值相等的值。
隐藏(Hiding)有什么用呢?
哈希碰撞(collision resistance)隐藏(Hiding)用来实现digital commitment有时候也叫digital equivalent of a sealed envelope
在现实中我们一般用H(x+nonce), nonce一个随机数来计算哈希值,用来保证整个值是随机和足够均匀的
1.3 puzzle friendly特性
什么是puzzle friendly
puzzle friendly 表明哈希值是不可预测的,你很难知道给出一个值,哈希值的输出是多少,如果你想让你的哈希值落在某个范围内,没有好的方法只能一个一个尝试,查看输入计算出来恰好是落在那个范围内,比如你想要一个0000....0XXXXXXX 整个256位的哈希值必须以K个0开始

那么什么样的值才能算出这样的哈希值,puzzle friendly的意思是你事先是不知道的,如果你想得到这个哈希值就得去尝试,没有捷径

为什么要有puzzle friendly ?
后面我们讲一下比特币挖矿过程,挖矿本质上就是找一个随机数nonce,这个nonce和区块的块头中的信息合在一起作为输入计算出一个哈希值,得到的这个哈希值小于等于一个目标域值,比特币本质是一个一个区块组成的链表,链表有块头(block header),block header中有很多的域,其中有一个域是我们的设置的随机数nonce,挖矿的过程本质上是在尝试各种不同的随机数,使的整个H(block header)取哈希值之后落在指定的目标空间

puzzle friendly 的性质是说这个挖矿的过程没有捷径,只能靠大量的尝试不同的nonce才能知道符合要求的值,所以这个过程才能够用来证明工作量证明(proof of work), 如果你挖到矿了,找到符合的nonce,一定是你做了大量的工作,因为没有别的捷径,一旦有人找到这个nonce,发布出去之后,其他人验证这个nonce是否符合要求,其实非常容易,计算一下block header的哈希值是否落在target空间

挖矿很难,验证很容易,这个性质叫做difficult to solve,but easy to verify
比特币中用到的哈希函数是SHA-256,SHA表示Secure Hash Algorighm ,我们上面三个性质这个函数都满足
2. 签名 
比如日常生活中我们想开一个银行账户的话,需要拿上相关证件去银行开户,这是一个典型中心化管理,比特币是去中心化,没有银行这种概念,那我们如何开户呢?
开户过程很简单,就是创建一对公钥(public key )和私钥(private key), 这就是一个账户
什么是公私钥?
公私钥对来自非对称加密体系(asymmetric encryption algorighm),与之相对的是对称加密(symmetric encryption algorighm),最早人们使用是对称加密(symmetric encryption algorighm),比如两个人之间在互联网上进行信息交换,为了防止被窃听,我们提前商量好一个秘钥 encryption key,发送方用这个秘钥进行加密,接收方用相同的秘钥进行解密,这里加密和解密用的同一个秘钥,所以叫对称加密,对称加密的前提是假设有一种安全的渠道能够将秘钥分发给双方,你不将秘钥以明文形式分发,这也是对称加密体系的一个弱点,秘钥的分发不是很安全。
为了解决这个问题非对称加密体系就提出来,我们不是用一个秘钥使用一对秘钥(公钥和私钥),加密用的公钥,解密用的私钥,这有什么好处呢?
这个公钥是不用保密的,大家都可以知道,像有些网站上将自己的公钥公布出去,提供给大家下载,私钥是解密的,只保存在你本地
发送者用接收者的公钥进行加密,接收者收到信息后用自己的私钥进行解密,彼此不需要对方的私钥,这就解决了对称加密体系中秘钥分发不方便的问题
比特币系统中你要创建一个账户就在本地中产生一对公钥和私钥,这个公钥就是你的银行账号,别人给你转账,只需要知道你的公钥就可以,这个私钥相对你的银行密码,知道私钥就可以把账户钱转走
假如我转10个比特币给你,我把这笔交易发布到区块链上,别人怎么知道这个交易是我发起的,会不会有冒充,这就是发布这笔交易的时候用自己的私钥进行签名,接收方会用我的公钥验证这个签名的正确性,因为公钥是公开
那么问题来了,有没有可能有的人生成的公钥和私钥是相同的?
有没有一种方法是不停的产生公钥,和区块链上的公钥对比,如果相等,我就可以窃取它账户了,这种攻击理论上是可以的,但是实际上是不可行的,如果你是256位哈希值的话,产生相同的公私钥是微乎其微的,即使你有一台超级计算机不停地运行,产生相同公私钥也是微乎其微的,这个概率比地球爆炸还要小,到目前位置还没有发现哪个人用这种方法攻击的先例
这里如果生成好的公私钥对,要选择一个好的随机源(a good source of randomness),如果没有好的随机源,前面所说的都不成立,就有可能生成的公私钥对是一样的。
两个功能,一个哈希函数,一个签名,这两个功能是可以结合起来用,比特币系统中一般先对一个message计算哈希值,然后再对哈希值进行签名
参考:《BTC 密码学原理》

新一代智能化应用
人工智能是一门认知科学,而新一代的智能化应用是一个系统工程。智能应用程序是 人工智能驱动的应用程序,可转变用户的工作效率、自动化流程并获得见解
 最新文章