介绍
Hash函数是密码学的一个重要分支,它是一种将任意长度的输入变换为固定长度的输出且不可逆的单向密码体制。Hash函数在数字签名和消息完整性检测等方面有着广泛的应用。Hash函数又称为哈希函数、散列函数、杂凑函数。它是一种单向密
码体制,即一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。
特性
Hash函数可以将满足要求的任意长度的输入进行转换,从而得到固定长度的输出。这个固定长度的输出称为原消息的散列(HashValue)或消息摘要(Message Digest)。Hash函数的数学表述为:
h=H(m)其中,H是Hash函数,没m是任意长度明文,h是固定长度的Hash值。
理想的Hash函数对于不同的输入可以获得不同的Hash值。如果是两个不同的消息,存H (x)=H(x′)在,则称x和x′是Hash函数的一个碰撞。由于Hash函数这种单向的特征及长度固定的特征使得它可以生成消息或数据块的消息摘要(也称为散列值、哈希值),因此在数据完整性和数字签名领域有着广泛的应用。
典型的Hash函数有两类:消息摘要算法(MD5)和安全散列算法(SHA)。Hash函数具有如下特点:
1、易压缩:对于任意大小的输入x,Hash值H(x)的长度很小,在实际应用中,函数H产生的Hash值其长度是固定的。
2、易计算:对于任意给定的消息,计算其Hash值比较容易。
3、单向性:对于给定的Hash值h,要找到m′使得 H(m′)= h在计算上是不可行的,即求Hash的逆很困难。
4、抗碰撞性:理想的Hash函数是无碰撞的,但在实际算法的设计中很难做到这一点。有两种抗碰撞性:
1)弱抗碰撞性,即对于给定的消息x,要发现另一个消息y,满足H(x)= H(y)在计算上是不可行的。
2)强抗碰撞性,即对于任意一对不同的消息(x,y),使得H(x)= H(y)在计算上也是不可行的。
6、高灵敏性:这是从比特位角度出发的,指的是1比特位的输入变化会造成1/2的比特位的输出变化。
比特币中的Hash
比特币中的hash有SHA-256、SHA-512、RIPEMD160算法。它们的算法描述 以我的水平看看的懵懵懂懂,反正不能完全理解。这里也就不说明了。感兴趣的可以自行了解。
SHA-256是构造区块链所用的主要密码哈希函数。同时也是pow的共识机制重要的一环,基于寻找给定前缀的SHA256哈希值。
RIPEMD160用于构造生成比特币中的地址。比特币地址,脚本地址。( 以公钥 K 为输入,计算其SHA256哈希值,并以此结果计算RIPEMD160 哈希值,得到一个长度为160比特(20字节)的输出:.................A = RIPEMD160(SHA256(K)) 。公式中,K是公钥,.........A是生成的比特币地址)。比特币交易中的脚本地址 也是类似 比特币地址,只不过SHA256的输入换成了脚本内容。
SHA-512主要用于 从种子中创造HD钱包。
如何使用
比特币中的hash封装的很好,使用也很简单。相关源码已从bitcoin中抽离出来。可独立编译运行验证。github上的地址为:https://github.com/1261385937/hash