一、实验目的
信息摘要函数(Hash函数)的设计与性质验证

二、实验步骤
1.设计符合原理要求的信息摘要函数H(m)。
2.对于如下明文信息m:
Once upon a time, there lived a monkey in the woods. The monkey climbed up the tree and looked down at the river everyday. One day, the monkey saw fishermen throw a net over the river. He watched how the fishermen caught fish. Sometime after, the fishermen left the net and went to have lunch. Then, the monkey climbed down from the tree and went to the riverside. The monkey was planning to throw the net like the fishermen did. The monkey was confident since he was good at imitating. Yet, the net wound around the monkey when he touched it. Tied up in the net, the monkey fell into the water.The monkey regretted his behavior, but it was too late. “I should have learned how to use the net before touching it. After believing my prowess and showing off, I am in a bad fix.” The monkey who did not behave carefully drowned in the water.
调用H(m)算法,产生Hash值。
3. 随机改变m的任意一位字符,产生新的Hash值,如此实验10次,记新的Hash值为 H1,H2,…H10
4. 设计函数计算H0和Hi 的相似度 i=1,2,…10
5. 分析结果,得出结论。

三、实验原理
1.信息摘要函数具有固定的输出数位。
2.信息摘要函数满足不可求逆,不可伪造和在可行时间之内找不到碰撞等特性。

四、实验过程
Md5.cpp:

#include<iostream>
#include<string>
using namespace std;
#define shift(x, n) (((x) << (n)) | ((x) >> (32-(n))))//右移的时候,高位一定要补零,而不是补充符号位
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
#define A 0x67452301
#define B 0xefcdab89
#define C 0x98badcfe
#define D 0x10325476
//strBaye的长度int strlength;
//A,B,C,D的临时变量int atemp;int btemp;int ctemp;int dtemp;
//常量ti unsigned int(abs(sin(i+1))*(2pow32))
const int k[]={0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391};
//向左位移数
const int s[]={7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21};
const char str16[]="0123456789abcdef";
void mainLoop( int M[])
{int f,g;int a=atemp;int b=btemp;int c=ctemp;int d=dtemp;for (int i = 0; i < 64; i++){if(i<16){f=F(b,c,d);g=i;}else if (i<32){f=G(b,c,d);g=(5*i+1)%16;}else if(i<48){f=H(b,c,d);g=(3*i+5)%16;}else{f=I(b,c,d);g=(7*i)%16;}int tmp=d;d=c;c=b;b=b+shift((a+f+k[i]+M[g]),s[i]);a=tmp;}atemp=a+atemp;btemp=b+btemp;ctemp=c+ctemp;dtemp=d+dtemp;
}
/*
*填充函数
*处理后应满足bits≡448(mod512),字节就是bytes≡56(mode64)
*填充方式为先加一个1,其它位补零
*最后加上64位的原来长度
*/int* add(string str)
{int num=((str.length()+8)/64)+1;//以512位,64个字节为一组int *strByte=new  int[num*16];    //64/4=16,所以有16个整数strlength=num*16;for ( int i = 0; i < num*16; i++)strByte[i]=0;for ( int i=0; i <str.length(); i++){strByte[i>>2]|=(str[i])<<((i%4)*8);//一个整数存储四个字节,i>>2表示i/4 一个unsigned int对应4个字节,保存4个字符信息}strByte[str.length()>>2]|=0x80<<(((str.length()%4))*8);//尾部添加1 一个unsigned int保存4个字符信息,所以用128左移/**添加原长度,长度指位的长度,所以要乘8,然后是小端序,所以放在倒数第二个,这里长度只用了32位*/strByte[num*16-2]=str.length()*8;return strByte;
}
string changeHex(int a)
{int b;string str1;string str="";for(int i=0;i<4;i++){str1="";b=((a>>i*8)%(1<<8))&0xff;   //逆序处理每个字节for (int j = 0; j < 2; j++){str1.insert(0,1,str16[b%16]);b=b/16;}str+=str1;}return str;
}
string getMD5(string source)
{atemp=A;    //初始化btemp=B;ctemp=C;dtemp=D;int *strByte=add(source);for( int i=0;i<strlength/16;i++){int num[16];for( int j=0;j<16;j++)num[j]=strByte[i*16+j];mainLoop(num);}return changeHex(atemp).append(changeHex(btemp)).append(changeHex(ctemp)).append(changeHex(dtemp));
}int main()
{string ss;string s=getMD5("Once upon a time, there lived a monkey in the woods. The monkey climbed up the tree and looked down at the river everyday. One day, the monkey saw fishermen throw a net over the river. He watched how the fishermen caught fish. Sometime after, the fishermen left the net and went to have lunch. Then, the monkey climbed down from the tree and went to the riverside. The monkey was planning to throw the net like the fishermen did. The monkey was confident since he was good at imitating. Yet, the net wound around the monkey when he touched it. Tied up in the net, the monkey fell into the water.The monkey regretted his behavior, but it was too late. I should have learned how to use the net before touching it. After believing my prowess and showing off, I am in a bad fix. The monkey who did not behave carefully drowned in the water.");cout<<s;return 0;
}相似度计算.c:#include<stdio.h>
int main()
{char a[]={'f','l','a','9','4','c','4','9','6','5','b','e','2','7','1','f','0','a','c','d','8','e','c','e','0','8','5','c','5','f','8','a'};char b[32];int i,amount=0;double c;for(i=0;i<32;i++){scanf("%c",&b[i]);}for(i=0;i<32;i++){if(a[i]==b[i])amount++;}c=(float)amount/32;printf("%lf",c);return 0;
}

相似度计算.c:

#include<stdio.h>
int main()
{char a[]={'f','l','a','9','4','c','4','9','6','5','b','e','2','7','1','f','0','a','c','d','8','e','c','e','0','8','5','c','5','f','8','a'};char b[32];int i,amount=0;double c;for(i=0;i<32;i++){scanf("%c",&b[i]);}for(i=0;i<32;i++){if(a[i]==b[i])amount++;}c=(float)amount/32;printf("%lf",c);return 0;
}

五、实验结果
hash值:





相似度:








信息安全实验:信息摘要函数的设计与验证相关推荐

  1. 信息摘要函数(Hash函数)的设计与性质验证

    1.信息摘要函数(Hash函数)的设计与性质验证实验 2.实验目的:信息摘要函数(Hash函数)的设计与性质验证. 2.1实验设备:PC机 一台/人 2.2实验原理: 2.2.1.信息摘要函数具有固定 ...

  2. 实验用matlab函数卷积定理,用matlab验证卷积定理

    数字信号处理实验报告实验二:卷积定理班 级: 10051041 姓名: 学号: 一.实验目的 通过本实验,验证卷积定理,掌握利用 DFT 和 FFT 计算线性卷积的方法. 二. ...... 应用MA ...

  3. 密码学专题 信息摘要和数字签名指令

    信息摘要 区别于对称加密和非对称加密,信息摘要算数是一种不可逆的操作,无论输入数据的大小输出的数据长度是固定的 信息摘要算数对输入很敏感,即使数据变化很细微,输出的结果会出现很大的差异 从不同输入得到 ...

  4. 【智能控制实验】基于MATLAB的BP神经网络实现非线性函数拟合设计

    基于MATLAB的BP神经网络实现非线性函数拟合设计 一.实验要求: 重点是掌握BP神经网络的学习算法原理,掌握matlab工具箱设计BP神经网络拟合非线性模型的方法(m文件):掌握在图形用户界面下设 ...

  5. 2019-2020-1 20175227张雪莹《信息安全系统设计基础》 实验五 《通讯协议设计》

    2019-2020-1 20175227张雪莹<信息安全系统设计基础> 实验五 <通讯协议设计> 实验报告封面 课程:信息安全系统设计基础 班级:1752班 姓名:张雪莹 学号 ...

  6. 加密解密、信息摘要常用算法收集~~

    MD5算法研究  综述 md5的全称是message-digest algorithm 5(信息-摘要算法),在90年代初由mit laboratory for computer science和rs ...

  7. 信息安全概论:Hash函数概念与性质

    信息安全除了要保障信息的机密性外,还要保障信息在存储.使用.传输过程中不被非法篡改,即信息的完整性. Hash函数可以将"任意长度"的输入经过变换以后得到固定长度的输出,也称为消息 ...

  8. 科软-信息安全实验2-netfilter实验

    目录 一 前言 二 Talk is cheap, show me the code 三 前期准备 四 效果演示 五 遇到的问题&解决 六 参考资料 七 老师提供的代码 一 前言 文章不讲解理论 ...

  9. SEED Labs信息安全实验

    1.1  SEED Labs 介绍 SEED Labs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理,可用于提高学生体验式学习的实验室练习.项目组2002年由杜文亮教授创建,目前开发 ...

最新文章

  1. 必读!TOP10生成对抗网络GAN论文(附链接)
  2. FPGA配置模式(Altera版)
  3. GitHub年度报告:Python首次击败Java,中国成第二大开源贡献国
  4. 鼠标点上去怎么那向上html,鼠标上去文字上移.html
  5. 经典Golang语法50问!
  6. MFC中GetDlgItemInt()方法的疑惑与使用总结
  7. Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)
  8. 微博短视频千万级高可用、高并发架构如何设计?
  9. 计算机网络中的语法 语义 时序的概念,网络iso协议及语义语法时序详解
  10. centos识别移动硬盘U盘,需安装【ntfs-3g】
  11. 使用Golang实现的快速排序
  12. 【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home...
  13. 互联网协议入门(三)
  14. 【解决方案】HIKSDK/大华SDK/Ehome协议视频融合平台EasyCVR在危化行业的监控系统搭建应用
  15. 解决raise ValueError(Sample larger than population)问题
  16. Element 之loading颜色修改
  17. 将数组升序排列后,插入一个数,仍然保持升序排列。
  18. php保留小数点4位,PHP小数点后保留几位的教程实例
  19. 2022渗透测试-面试题目大全
  20. 微博移动端所获数据各字段的含义

热门文章

  1. Java服务端和客户端开发辅助工具Utils
  2. v2ray服务端启动出现panic: runtime error: invalid memory address or nil pointer dereference
  3. vue中用echarts 绘制geo 中国地图
  4. java 读取ppt_Java 读取PPT文本和图片
  5. 硬实时RTLinux安装配置详解 (二):编译运行RTLinux
  6. python制作qq登录界面_Python制作一个仿QQ办公版的图形登录界面
  7. 光速学会前端三件套之html
  8. 按键精灵连接远程mysql_【按键精灵】按键精灵读取github page 网页,实现脚本远程控制功能...
  9. 工程师的18个梦想,你有几个?
  10. 安卓开发自己写的刻度尺测量,精确到mm.