BTC 系统运行的过程中需要依赖的核心技术之一包括密码学技术,在 BTC 系统中使用到的密码学功能包括哈希算法和数字签名。
一、哈希算法
哈希(Hash)的作用是把任意长度的输入,通过散列算法的方式,变换成固定长度的输出。
在 BTC 中主要使用哈希函数(SHA-256)对源数据信息取 hash,生成固定长度的输出,利用该输出作为检验信息是否被篡改的依据。BTC 中使用的哈希算法应具备三个性质,分别是collision resistance、hiding 以及 puzzle friendly。
性质一:Collision Resistance
Collision Resistance 性质强调的是在实践的过程中,不存在(尚未发现)可以人为制造出哈希碰撞的高效办法,即对于给定的 x x x,无法在有效的时间内人为求出使得 H ( x ) = H ( y ) H(x)=H(y) H(x)=H(y) 成立的 y y y(蛮力的方式在实际中不可取,因为工作量极大)。这一性质的作用主要是用来检测信息内容是否被篡改,比如存在原始数据 m m m,如果原始数据被篡改成了 m ′ m' m′,则 H ( m ) ≠ H ( m ′ ) H(m) \ne H(m') H(m)=H(m′),以此确保数据的有效性。
哈希碰撞(Hash Collision)是指若存在数据 x , y x,y x,y,且 x ≠ y x \ne y x=y,满足 H ( x ) = H ( y ) H(x) = H(y) H(x)=H(y),则称存在哈希碰撞,其中, H H H 表示哈希函数。一般而言,由于哈希的输入空间是远远大于输出空间的(输入长度不定,输出长度固定),所有哈希碰撞是客观存在,不可避免的。
性质二:Hiding
Hiding 性质强调的是哈希函数的计算过程是单向不可逆的,但性质成立的前提是输入空间很大,且取值分布均匀,否则将出现被蛮力破解的情况。在实际的运用过程中,如果输入空间不够大,可以选择拼接一个随机数 none,来确保输入空间足够大且分布随机。这一性质的作用是可以与性质一结合一起实现数字承诺。
数字承诺(Digital Commitment)是指一个涉及承诺方和接收方的二阶段交互协议。第一阶段为承诺级阶段,承诺方选择一个消息 m m m,以密文的形式发送给接收方,此时接收方无法知道 m m m(性质二);第二阶段为打开阶段,承诺方公开消息 m m m ,接收方以此来验证其与承诺阶段所接收的消息是否一致(性质一)。
性质三:Puzzle Friendly
Puzzle Friendly 性质强调的是 hash 值的计算是无法事先预测的,即如果想得到让 hash 值落在某个范围的输入,只能不断尝试不同的输入,不存在什么捷径。这一性质主要用于 BTC 的 Mining 过程,比如对于 256 位的哈希值,若要求计算出的哈希值前 k k k 位均为零,其他位可取任意值,则只能通过不断尝试不同的输入,无法事先缩小输入的可选空间。
Mining 是指寻找一个随机数 nonce,将 nonce 与区块头中的其他信息结合并求取对应的哈希值,使得该哈希值小于等于某一给定目标阈值的过程,即 H ( b l o c k h e a d e r ) ≤ t a r g e t H(block \quad header) \leq target H(blockheader)≤target 。Mining 过程没有捷径,只能通过不断尝试 nonce 去求解满足的解。
二、数字签名
在了解数字签名的概念之前,需要对 对称加密
和 非对称加密
这两个概念有一定的认识:
(1)对称加密
在对称加密系统中,当两个实体之间需要通信时,直接以明文方式在网络中传递容易被其他人窃听,因此,一般通信双方会事先商定好一个密钥,发送方利用密钥对明文进行加密,再发送给接收方,接收方接收到密文后利用密钥进行解密。由于加密和解密过程使用的是同一密钥,所以这一过程称为对称加密,但前提是存在某种安全方式能够将密钥分发给通信双方(对称加密的弱点)。
(2)非对称加密
在非对称加密系统中,每个实体都拥有一对公私钥,当两个实体需要通信时,发送方用接收方公钥(公开)加密,再发送给接收方,接收方接收到密文后利用自己的私钥(保密)进行解密。需要注意的是加密和解密过程使用的都是接收方的公钥和私钥,这样可解决对称加密系统中密钥分发不方便的问题。
BTC 是一个去中心化的系统,在发生交易之前需要创建一个用于交易的账户,在 BTC 中,创建账户的过程就是创建一个公私钥对,公钥相当于账户 ID(可公开),私钥相当于账户密码(需保密),当别人向你转账时,需要知道你的公钥,当你向别人转账时,需要使用你的私钥,这一过程中公私钥对的主要作用是用于数字签名。比如发送方 A 向接收方 B 转一笔交易并对外公布,其他人要验证这笔交易是否真为发送方 A 本人发起的,这就需要在发送交易前,发送方 A 用自己的私钥对交易进行签名,并用 B 的公钥作为接收方,其他人收到交易时用发送方 A 的公钥对交易进行验证,以确定交易是 A 本人发起的。