基于工作量证明的哈希算法实验

实验背景:

哈希函数H:X→Y ,其中,X为定义域,Y为值域,且|X|>|Y|,能够实现任意长度的输入转换成固定长度的输出。

密码学哈希函数H应满足如下的要求:

(1) 压缩:x任意长,H(x)固定长;

(2) 容易从x计算出 H(x);

(3) 抗原像攻击:已知y ∈ Y,要找出x∈X,使得H(x) = y是困难的;

(4) 抗第二原像攻击:已知x ∈ X, 找出另一个x‘ ∈ X,使得H(x‘)=H(x)是困难的;

(5) 抗碰撞性:找出任意两个不同的x, x‘ ∈ X,使得H(x) = H(x‘)是困难的。

利用哈希函数的上述性质,可以构造一个谜题问题:已知哈希函数H,一个值v以及目标范围T,寻找x,使得H( v|| x) ∈T。

求解上述问题等价于需要找到一个输入值,使得输出值落在目标范围T内,例如,如果哈希函数H的输出为n比特,那么输出值可以是任何一个0~2n-1范围内的值,可以定义T为0~2k (k < n) 范围内的值。目标范围T的大小决定了解这个谜题的求解难度。如果T包含所有n比特长的串,即k=n, 那么求解等价于计算一次哈希值;如果T只包含一个元素,即k=1,则这个求解是最难的,相当于给定一个哈希值,找出其中的一个原像。一般的,k越小,求解花费的时间越长。

求解上述哈希函数构造的谜题问题形成了工作量证明,可以用于对付垃圾邮件发送者、拒绝服务攻击以及设计密码货币的共识算法。

本实验即设计并求解基于哈希函数构造的谜题问题。

符号约定及要求

HASH(m):表示对消息串进行哈希计算;

n:哈希函数值的长度,要求至少为160比特;

d:以16进制位表示的前缀0的个数;

SHR(h, k):对无符号数h右移k位;

v||x:两个字符串首尾相连

实验步骤:

  构造谜题并求解

1、 d = 1

2、  v = 你的学号或姓名

3、  从x=1出发,增加x的值并转化为对应的串x,直到 HASH(v||x)< SHR(2n-1, d*4)

4、记下这时的x的值

5、 取d=2,3,重复2~4

思路分析:

第1和第5步可以用循环来解决:for(d=1;d<4;d++){}

第2步:取v=”陈华展”;

第3步也可以利用for循环解决:for(x=1; HASH(v||x)>=SHR(2n-1, d*4);x++);

这里主要目的是求出x的值使得HASH(v||x)< SHR(2n-1, d*4)成立;

第4步:打印出第3步求得的x值

代码实现:

利用php脚本实现这个简单的程序:

其中哈希计算采用的是sha1函数加密,n取值160,对无符号数2n-1右移d*4位可看作2n-1除以2的d*4次方;于是可取shr= SHR(2n-1, d*4)= 2n-1/2d*4

程序运行脚本如下:

运行结果:

程序深入改进:

  1. 记录程序运行过程所花费的时间

运行结果:程序运行了6毫秒

2.增加d循环的次数为6

运行结果:记录的x值疯狂递增,程序运行了22408毫秒(约22.5秒)

从哈希函数的数学性质的角度分析实验结果

由哈希函数的定义可知:当哈希函数的输出长度n确定时,哈希函数的值域Y也固定了,对于任意的信息m,其哈希值H(m) ∈Y,而对于Y的子集T,H(m) ∈T不一定成立,由于哈希函数的计算不可逆,所以H(m)是否落入T中是随机的,而且当T越小时,H(m) ∈T成立的概率就越小,即要找到m使得H(m) ∈T就越困难。当T只包含一个元素时,要找到m使得H(m) ∈T相当求解哈希函数的原像。

在本次实验中,随着d的增加,要找到x使得 HASH(v||x)< SHR(2n-1, d*4)变得越困难,程序的计算量就不断增大,求得的x值有很大概率会一直增加,所花费的时间也会相应地上升。

实验思考:

为什么基于哈希函数的谜题问题可以用于设计对付垃圾邮件的发送和拒绝服务攻击的系统?你会如何利用这类工作量证明的方法设计上述的系统?

答:在上述哈希函数构造的谜题问题中可以发现,当d的值很小时,并不会给计算机造成太大的计算负担,而随着d的增加,计算机的计算负担不断上升,工作量大幅度上升甚至影响系统的正常运行。基于以上原理,可以这样设计一个对付垃圾邮件的发送和拒绝服务攻击的系统:

当一台计算机要发送某些消息(例如邮件、SYN请求等)时,消息系统要求发送方计算出一个满足一定范围的哈希值,并且规定:

(1)       在计算完成之前不允许发送方发送消息;

(2)       在一定的周期内,发送方首次要求发送消息,系统要求哈希值范围会相对较大,不会造成太大的计算负担;

(3)       在一定的周期内,如果发送方再次要求发送请求,则哈希值的范围随着发送次数的增加而不断减小,大大增加发送方的计算负担,从而阻止一个发送方在短时间内发送大量信息;

在这个系统中,不会正常发送消息的计算机造成困扰,而对于那些发送垃圾邮件或者其他有害信息则会有极大的阻拦效果。

原文地址:https://www.cnblogs.com/chuanzi/p/10525511.html

时间: 2024-07-29 12:54:24

基于工作量证明的哈希算法实验的相关文章

浅谈无需工作量证明的加密货币

浅谈无需工作量证明的加密货币 Iddo Bentov1,Ariel Gabizon2,Alex Mizrahi (Computer Science Dept., Technion; chromawallet.com) 译者:shylocks ([email protected]) 摘要:本文研究了那些并没有使用 PoW(工作量证明)协议的加密货币.这些协议通常采用 PoS(权益证明)协议,也就是采用了一种使担任验证工作的人获得在系统中相关权限的协议.我们对拥有较多矿工的系统进行了分析.最后,提出

QT:用QSet储存自定义结构体的问题——QSet和STL的set是有本质区别的,QSet是基于哈希算法的,要求提供自定义==和qHash函数

前几天要用QSet作为储存一个自定义的结构体(就像下面这个程序一样),结果死活不成功... 后来还跑到论坛上问人了,丢脸丢大了... 事先说明:以下这个例子是错误的 [cpp] view plaincopyprint? #include <QtCore> struct node { int cx, cy; bool operator < (const node &b) const { return cx < b.cx; } }; int main(int argc, cha

Java进阶(五十七)-基于感知哈希算法的图像配准

Java进阶(五十七)-基于感知哈希算法的pHash图像配准算法 ??毕业论文提交之后,老师交给自己一项任务:图像配准,也就是给你两幅图像,通过系统来判定两幅图像是否为同一副图像.自己作为这一方面的小白,先去网上搜索一下相应的检测方法,当然有现成的API调用最好,花钱也无所谓. ??我们这里采用的基础关键技术叫做 "感知哈希算法"(Perceptual hash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同

基于感知哈希算法的图像搜索实现

无意中看见一篇博客,是讲仿造google搜图的,链接如下: Google 以图搜图 - 相似图片搜索原理 - Java实现 觉得挺好玩的,博主使用Java实现的,于是我用 OpenCv实现了下. 根据看到的博文,里面说到,Google图像搜索的关键技术是"感知压缩算法"(Perceptual hash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹.结果越接近,就说明图片越相似.看到这里我就突然来了

三种基于感知哈希算法的相似图像检索技术

大家都用google或baidu的识图功能,上面就是我搜索一幅图片的结果,该引擎实现相似图片搜素的关键技术叫做"感知哈希算法"(Perceptual hash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹.结果越接近,就说明图片越相似.达到图片比较目的且利用信息指纹比较有三种算法,这些算法都很易懂,下面分别介绍一下: 1.基于低频的均值哈希 一张图片就是一个二维信号,它包含了不同频率的成分.如下图

第二章 工作量证明和挖矿

概览 工作量证明拼图和难易度 挖矿 难易度共识 时间戳校验 累积难易度 验证测试 小结 概览 本章节我们将会在我们的玩具版区块链的基础上加入工作量证明(POW)的支持.在第一章节的版本中, 任何人都都可以在没有任何工作量证明的情况下添加一个区块到区块链中. 当我们引入工作量证明机制之后,一个节点必须要解开一个有相当计算量的拼图(POW Puzzle)之后,才能往区块链上添加一个新的区块.而去解开该拼图,通常就被称为挖矿. 引入工作量证明机制之后,我们还可以对一个新区块的产出时间作出大致的控制.大

哈希算法集锦

因为工作原因,看了一下redis的底层实现,发现redis底层使用的哈希算法是murmurhash,第一次听说这个算法感觉自己对哈希值计算的常用算法了解太少,整理了一下网上讲的比较原理性的观点: 简介   哈稀函数按照定义可以实现一个伪随机数生成器(PRNG),从这个角度可以得到一个公认的结论:哈希函数之间性能的比较可以通过比较其在伪随机生成方面的比较来衡量. 一些常用的分析技术,例如泊松分布可用于分析不同的哈希函数对不同的数据的碰撞率(collision rate).一般来说,对任意一类的数据

机器学习之基于朴素贝叶斯文本分类算法

原理 在分类(classification)问题中,常常需要把一个事物分到某个类别.一个事物具有很多属性,把它的众多属性看做一个向量,即x=(x1,x2,x3,-,xn),用x这个向量来代表这个事物.类别也是有很多种,用集合Y=y1,y2,-ym表示.如果x属于y1类别,就可以给x打上y1标签,意思是说x属于y1类别.这就是所谓的分类(Classification). x的集合记为X,称为属性集.一般X和Y的关系是不确定的,你只能在某种程度上说x有多大可能性属于类y1,比如说x有80%的可能性属

用python阐释工作量证明(proof of work)

了解比特币的都知道挖矿很耗电,这是因为比特币用到了工作量证明. 工作量证明是指系统为达到某目标而设置的工作度量方法.一开始是用在网络攻防上,大大提高攻击者的计算量,攻击成本也就上去了. 工作量证明需要由工作者和验证者两方共同完成.它有两层含义. 1.工作者需要完成的工作必须有一定的量,这个量由验证者给出. 2.验证者可以迅速的检验工作量是否达标,注意这里的检验完成过程必须简单. 举几个例子 A跟B说,你给我还原这个魔方,B还原魔方需要很多时间,而A验证却很快,只需要看一眼就行了. A跟B说,你给