实验背景:

哈希函数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

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

  1. 【区块链实战】区块链新发明:工作量证明,PoW共识算法

    目录 一.简介 二.知识点 工作量证明(POW) 随机值做作用 挖矿矿工 区块交易手续费 三.工作量证明 PoW 与 区块链的关系 1.为何要引入 PoW 2.如何确认工作难度 3.挖矿机制与矿工 4 ...

  2. redis实现轮询算法_Dcron:基于redis与一致性哈希算法的分布式定时任务库

    背景 最近项目中的定时任务越来越多,为了防止任务重复执行曾经使用过的方案: 只启用了一个节点. 固定循环间隔,使用分布式事务锁. 部署一套分布式任务调度系统. 方案一 没有容错机制,当单个节点宕机,所 ...

  3. 从工作量证明(POW)到高阶工作量证明(HPOW)

    1 介绍 工作量证明机制作为抗女巫攻击的重要手段,已成为区块链和加密货币领域的主流机制之一,目前已广泛使用于一些主流的数字货币系统如比特币.以太币等.这一机制最早由Cynthia Dwork和Moni ...

  4. 基于存储证明(Proof of storage)的Permacoin挖矿原理解析

    过去的一周让人感觉五味杂陈,心力交瘁,工作非常忙,非常累,非常没有进展,时而芳香,时而谢特,本想着这周末什么也不干撸点没意义的事情度日呢,然而还是觉得把意义拆散来的可靠些.所以依旧很早爬起来总结一下过 ...

  5. 相似图像搜索的哈希算法思想及实现(差值哈希算法和均值哈希算法)

    图像相似度比较哈希算法: 什么是哈希(Hash)? • 散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小 的数字"指纹"的方法.散 ...

  6. 工作量证明 - 如何证明你的工作很卖力

    前言 什么是POW 计算机是如何实现POW POW与挖矿的关系 笔记本VS挖矿机 diffculty 前言 上一期我们讨论了哈希函数的特性,本期我们来谈一谈哈希的应用,工作量证明是哈希的典型应用,现在 ...

  7. 动手学区块链学习笔记(二):区块链以及工作量证明算法

    引言 紧接上文,在介绍完区块链中的加密解密以及公钥私钥等算法后,本篇开始正式进入区块链概念与一个简单区块链系统的实现过程介绍. 区块链技术介绍 什么是区块链? 区块链,就是一个又一个区块组成的链条.每 ...

  8. 区块链-工作量证明算法

    目录:https://blog.csdn.net/qq_40452317/article/details/89646633 比特币的去中心化共识由所有网络节点的 4 种独立过程相互作用而产生: 每个全 ...

  9. 链接哈希是什么_熊猫人行情:什么是工作量证明机制(POW)

    熊猫人行情:什么是工作量证明机制(POW)(视频链接) 知乎视频​ ​大家好!这里是熊猫人~ 上班打卡下班打卡,想必大家都并不陌生 总有各种方式证明你确确实实是工作过 (加油,打工人!) 区块链中也有 ...

最新文章

  1. laravel controller
  2. 一:包装好和吹出去 二:三国心得
  3. 查看mysql字段的编码_MySQL查看和修改字符编码的实现方法
  4. matlab绘3d图
  5. box-shadow
  6. ckeditor复制html样式丢失,Ckeditor选择html无法正常使用铬浏览器
  7. 使用annotation配置hibernate(1)
  8. sql数据库自动增量备份_SQL自动增量
  9. 工作闲暇-曾经的“伪”前端+切图工作
  10. pp助手苹果版_吃药提醒助手ios版下载-吃药提醒助手苹果版下载v1.0
  11. windows 禁用ipv6服务_win10系统电脑中禁用ipv6协议的修复方案
  12. php将文字生成图片显示,php生成文字图片效果
  13. 用accelstepper库控制28BYJ-48步进电机(快慢运动切换)
  14. 完美解决python manage.py makemigrations 报错
  15. 关于Sunday算法以及实现
  16. 网络版计算机化系统3q认证,实验室分析仪器3Q确认服务|分析仪器3Q认证服务|计算机系统认证确认服务...
  17. 开源新手引导框架,支持TypeScript
  18. Python爬虫验证码识别四
  19. docker仓库harbor安装与使用
  20. 本人制作的视频汇总(原创视频)

热门文章

  1. java的start()函数是什么意思_在Java中,start()函数在多线程中做了什么? - Break易站...
  2. 【物尽其用】ADKEY多按键制作与经验分享
  3. Big Transfer (BiT)论文阅读笔记
  4. Oracle分批提交DML
  5. usb7.1声道 7.1音效USB单插版 头戴式带麦游戏耳机 电竞耳机
  6. hive中split(),explode()和lateral row
  7. 中国历史上的特等美女
  8. 项目管理基础2021复习笔记
  9. 设备管理---设备驱动程序、设备无关性、缓冲区管理
  10. 《编程之美》读书笔记(四): 卖书折扣问题的贪心解法