首页 > 技术文章 > 比特币 一、密码学基础

lazyuan 2021-02-09 21:10 原文

1.函数
函数有一个映射的定义
对于集合A中的任意一个数x,在集合B中都有唯一确定的数y与之对应。
要注意:
  • 集合A中的元素a,都能找到有且仅有一个集合b中数与之对应;即不存在f(a)=b1,又有f(a)=b2的情况
  • 但是,存在f(a1)=b,同时又有f(a2)=b的情况
 
 
2.哈希函数是一种函数
哈希函数本质上你们可以理解为是一个特殊的函数。它首先符合函数的映射定义。
我们记y=H(x)为哈希函数,其中x我们成为输入值,y我们成为哈希值。
哈希函数的特殊性体现在:
  • 输入x可以为任意字符串。即,x可以是这样的中文,也可以是一部电影、一首歌、一个软件等等(因为这些东西在电脑里都是字符串)
  • 输出y,是一个固定长度的字符串。即,无论一个哈希函数的输入值是什么,它的输出值,都是固定长度的字符串。比如,比特币使用的SHA256哈希函数,输出就是256位的二进制数(如下图,256位二进制转换为十六进制就是64位)
 
 
3.比特币用到的哈希函数的3个性质
(1)collision resistance,即抗碰撞性
①首先要知道,什么是collision(碰撞)
对函数f(x)而言,存在x1≠x2,使得f(x1)=f(x2),即碰撞
 
②那什么是collision resistance,即抗碰撞性。
我们很难人工的去找到(即除了穷举brute-force外)一组x1≠x2,使得f(x1)=f(x2)
要注意的是,collision resistance,并不是collision free。以SHA256为例,其输出空间为2^256,如果我们的输入空间为2^256+1,那必然发生碰撞。而事实上,如果我们的输入空间达到了2^130次,就有99%的可能发生碰撞。(生日碰撞问题)
 
③collision resistance性质的作用
  • 检测软件是否被更改:对于一个软件的安装包,官方可以在其官网公布一个哈希函数H(x),和对该软件包求哈希的一个哈希值y。网友可以用他下载到的该软件安装包,用公布的哈希函数求哈希值y1,比较y1与y是否相等,就可以发现该软件是否被更改。()
  • 检测上传到云端的文件是否被更改(老师举例):上传文件前先求该文件的hash值,过段时间下载该文件后,再求一次hash值,比较两值是否相等即可知道文件是否被篡改
上述两个case中,由于无法人工制造hash碰撞,因此坏人如果想搞更改软件安装包或者你上传的文件,必然求得的哈希值会改变。
 
④collision resistance并不是永恒的
(这段我自己写的,如果有误请私信告诉我)
我国著名密码学家王小云教授,就找到算法,人工制造了哈希函数MD5的哈希碰撞,使得MD5函数安全性收到了冲击。
这块我想要啰嗦一下……为什么人工制造了哈希碰撞,函数安全性就大幅降低了。我们以上述软件安装包为例。某坏人在某软件安装包中植入密码后,新安装包的哈希值与安装包就不一致了,但是由于该坏人掌握了人工制造哈希碰撞的方法,他只需要在新安装包中再做修改(比如增加一些无用的内容),使得新安装包的哈希值与原安装包一直,这样网友运用collision resistance的原理就检测不出来软件经过修改。所以我说安全性大幅降低了。
如果无法人工制造哈希碰撞,那么坏人就只能用brute-force蛮力穷举,这种工作量就巨大到不可能了。
 
(2)hiding property
 
①hiding property的含义
hiding property,大家可以理解为单向性。即,对于函数y=H(x),给定输入x,能够很容易求得哈希值y。但给定哈希值y,很难求得输入x。通俗的说,除了brute-force蛮力求解(穷举)外,函数不可解。
collision resistance + hiding property = digital commitment
 
②hiding property成立的前提
  • 输入空间要足够大,不然很容易可以遍历完。
  • 输入空间分布要比较均匀,各种取值的可能性要差不多。简言之,不能为蛮力求解提供方便。
 
③hiding property性质的作用
hiding property+collision resistance结合,可以实现digital commitment or digital equivalent of sealed envelope。
老师的举例:某股票大神,预测第二天某些股票会涨停。但是他不能提前公布出来,因为他的猜想会影响股市。他要把他的猜想放到一个“密封的信封”中。这个时候,他可以这么做:将他的猜想x,求哈希值y。然后他可以把哈希值公布出来。这个时候,由于hiding property单向性,韭菜们无法知道这位大神写的是什么。而由于collision resistance,第二天股市收盘后,这位专家也没办法按照股票收盘后的结果,重新找到一个x',是其哈希值y'=y,即他无法更改他的猜想。
实际操作中需要注意的是,由于股票就那么几只,即输入的空间很有限,那么坏人就可以通过brute-force的方法暴力破解,从而hiding就不hiding了。所以上面说,输入空间要足够大才可以。
那么这位大神要怎么做呢?他可以将他的猜测的后面拼一个随机数nonce,比如大神的猜想是“亨通光电和恒力股份”,那么大神要在后面拼一个随机数“亨通光电和恒力股份1234567890”,整体取哈希值。
 
(3)puzzle friendly
所谓puzzle friendly,就是对于哈希函数,他的输出是无法预测的,要找到特定区间内的哈希值的输入x,没有捷径,只能通过大量的计算
比如,我要找到SHA256函数的哈希值,前60位都是零,我除了一个一个试验以外,没有其他的方法。


推荐阅读