密码学哈希函数
特点
- 输入任何长度的字符串
- 输出为固定长度(课程为256)
- 高效计算
哈希函数的密码学特性
-
无碰撞:x、y不同时,没有人可以找到相同的H(x)、H(y)。但实际上碰撞一定存在,只是一般找不到。如何找到碰撞?选择 2 130 2^{130} 2130个输入,有99.8%的可能找到一对碰撞。无碰撞的优点在于可以通过哈希值相同确定原始值/原始文件是相同的。
-
隐秘性:从一个high min-entropy的分布中得到一个值r,无法通过输出的哈希码H(r|x)反推输入x。H(r|x)即把r的二进制位放到x后。high min-entropy的意思是一个数的组成bit越多,其min-entropy越高,可以理解为从的十分分散的分布中取值。
应用:commitment算法,过程如下
(com, key)=cimmit(msg) # 密封信息 match=vertify(com,key,msg) # 确认过程
通过commit函数得到输出com和临时随机值key,com即为密封后的信封,而key为打开信封的密钥。公布key和msg,通过vertify函数任何人都可以确认信封内容。
密封和确认过程如下
commit(msg)=(H(key|msg),key) vertify(com,key,msg)=(H(key|msg)==com)
commit函数:先随机生成256bit的key,连接msg再经过哈希函数计算得到输出com。确认函数:查验H(key|msg)是否和com相同。算法中隐蔽性体现在通过H(key|msg)无法反推输入的msg,无碰撞性体现在无法找到H(key|msg)相同的两个msg。
-
难破译:如果有人想要破解x,只能从很大的解空间中随机选数搜索x,而没有其他捷径。如果我们想要提出难解的问题,我们可以用合适的方法随机生成问题ID。
常见哈希函数
在比特币中,常用的哈希函数为SHA-256。把加密信息切割为512bit每块,最后一块需要padding至512bit,padding内容为10*|length,即100…(一部分0)加上信息长度的64位二进制形式。IV为标准文件中指定的256bit值,第一步将第一个块和IV作为输入得到256bit的哈希码输出,再将得到的哈希码和第二个块作为输入,不断迭代计算得到最终的哈希码。
哈希指针及其数据结构
定义
-
哈希指针:指向数据存储位置及其数据的哈希值,以确认数据是否被改变。
-
区块链结构:如下图,红色箭头表示指向上一块的哈希指针
-
例子:哈希链表——防篡改日志
将日志放到数据末尾,如果数据被更改能够被检测到。只要记住开头的哈希指针(称为创世区块),就完成了防篡改的目的,因为要修改中间的数据,为了保证内容一致就必须串改所有哈希指针使其与修改过的数据一致,直到碰到创世区块。
-
例子:哈希指针二叉树——Merkle树
和哈希链表一样,树根节点即为创世节点。Merkle树的优点在于,要证明某节点在树中时,只需要验证该节点到树根路径上的节点都在树中即可,复杂度为O(log n)。还可以给叶子节点排序称为排序的Merkle树,排序过的Merkle树可以验证节点不在树中。
-
实际上所有不包含环、基于指针的数据结构都可以用哈希指针实现。
数字签名
目的
- 只有自己能签署,但任何人可以确认有效性
- 和特定文件关联,不能剪裁到另一文件
算法
(sk,pk):=generateKeys(keysize) # 生成密钥
sig:=sign(sk, message)
isValid:=verify(pk,message,sig)
sk:私钥,用于签字。pk:公钥,用于验证。sig:表示签名的字符。前两步可以是随机算法,而第三步是固定的。要求:签名可以被验证;不能伪造签名。
公钥作为身份标识
取一个可用于验证数字签名的公钥,作为身份标识。通过数字签名算法可以创建新的钥匙对(新用户),公钥/公钥的哈希值表示公开的身份,而私钥用于证明账号的主人、控制身份。在比特币中,这些身份称为地址(address)。
隐私性
- 地址本身与现实身份无关
- 通过地址的活动、发言可能会推导出现实身份。
简化的加密货币
Goofy币
最简单的加密货币,规则如下:
-
创造新币(CreateCoin)
产生uniqueCoinID(唯一币编号),上面是Goofy的数字签名,表示创造的新币属于它,任何人可验证。
-
Goofy币可以转移给他人
发表一个支付给另一公钥的声明(例如:pay to pk Alice),声明由Goofy签署。
-
双重支付攻击
即Goofy将同一个币支付给两个不同的人,验证算法仍然正确。因为这个特性,Goofy币无法作为数字货币使用。
ScroogeCoin
解决Goofy的双重支付问题,ScroogeCoin会发布一个包含所有交易的交易历史区块链,由ScroogeCoin签名。
-
造币交易
可以一次性创造多个新币,赋予同一或不同的拥有者,创造的第0个币(图中为CoinID 73(0))作为参考币ID。
-
支付交易
消耗原始币,创造新币给接收者(接收者可以是自己),底部有消耗币的人的数字签名。
-
ScroogeCoin不会被改变、细分、合并,它只会被创造和消耗。可以通过创造和消耗来实现细分、合并操作。
-
问题:存在中心化问题,Scrooge本人控制着整个系统。