.8hash值摘要算法设计

1.进行数据填充使消息的长度对32取模得28,填充方法是,填充第一位为1,其余为0。

2.在消息后面添加4位值,表示原消息的长度。如果消息长度大于2^4,则只使用其低4位的值。

3. 把消息分以32位为一分组进行处理,每一分组又被划分为16个2位子分组。每一个分组进行4轮变换,以4个常数为起始变量进行计算,重新输出4个变量,以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD5值。

4个常数: A = 01, B = 19, C = 28, D = 44;

4个函数:F(X,Y,Z)=(X & Y) | ((~X) & Z); G(X,Y,Z)=(X & Z) | (Y & (~Z));  H(X,Y,Z)=X ^ Y ^ Z; I(X,Y,Z)=Y ^ (X | (~Z));

.MD5算法实验

1.分析编程实现

首先,进行数据填充使消息的长度对512取模得448。填充方法是,填充第一位为1,其余为0。

然后,再在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于2^64,则只使用其低64位的值。

把消息分以512位为一分组进行处理,每一分组又被划分为16个32位子分组。每一个分组进行4轮变换,以4个常数为起始变量进行计算,重新输出4个变量,以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD5值。

4个常数: A = 0x67452301, B = 0x0EFCDAB89, C = 0x98BADCFE, D = 0x10325476;

4个函数:F(X,Y,Z)=(X & Y) | ((~X) & Z); G(X,Y,Z)=(X & Z) | (Y & (~Z));  H(X,Y,Z)=X ^ Y ^ Z; I(X,Y,Z)=Y ^ (X | (~Z));

具体代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>// Constants are the integer part of the sines of integers (in radians) * 2^32.
const uint32_t k[64] = {
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 };// r specifies the per-round shift amounts
const uint32_t r[] = {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};// leftrotate function definition
# define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c))))void to_bytes(uint32_t val, uint8_t *bytes)
{bytes[0] = (uint8_t) val;bytes[1] = (uint8_t) (val >> 8);bytes[2] = (uint8_t) (val >> 16);bytes[3] = (uint8_t) (val >> 24);
}uint32_t to_int32(const uint8_t *bytes)
{return (uint32_t) bytes[0]| ((uint32_t) bytes[1] << 8)| ((uint32_t) bytes[2] << 16)| ((uint32_t) bytes[3] << 24);
}void md5(const uint8_t *initialMsg, size_t initialLen, uint8_t *digest) {// These vars will contain the hashuint32_t h0, h1, h2, h3;// Message (to prepare)uint8_t *msg = NULL;size_t newLen, offset;uint32_t w[16];uint32_t a, b, c, d, i, f, g, temp;// Initialize variables - simple count in nibbles:h0 = 0x67452301;h1 = 0xefcdab89;h2 = 0x98badcfe;h3 = 0x10325476;//Pre-processing://append "1" bit to message    //append "0" bits until message length in bits ≡ 448 (mod 512)//append length mod (2^64) to messagefor (newLen = initialLen + 1; newLen % (512/8) != 448/8; newLen++);msg = (uint8_t*)malloc(newLen + 8);memcpy(msg, initialMsg, initialLen);msg[initialLen] = 0x80; // append the "1" bit; most significant bit is "first"for (offset = initialLen + 1; offset < newLen; offset++)msg[offset] = 0; // append "0" bits// append the len in bits at the end of the buffer.to_bytes(initialLen*8, msg + newLen);// initialLen>>29 == initialLen*8>>32, but avoids overflow.to_bytes(initialLen>>29, msg + newLen + 4);// Process the message in successive 512-bit chunks://for each 512-bit chunk of message:for(offset=0; offset<newLen; offset += (512/8)) {// break chunk into sixteen 32-bit words w[j], 0 ≤ j ≤ 15for (i = 0; i < 16; i++)w[i] = to_int32(msg + offset + i*4);// Initialize hash value for this chunk:a = h0;b = h1;c = h2;d = h3;// Main loop:for(i = 0; i<64; i++) {if (i < 16) {f = (b & c) | ((~b) & d);g = i;} else if (i < 32) {f = (d & b) | ((~d) & c);g = (5*i + 1) % 16;} else if (i < 48) {f = b ^ c ^ d;g = (3*i + 5) % 16;          } else {f = c ^ (b | (~d));g = (7*i) % 16;}temp = d;d = c;c = b;b = b + LEFTROTATE((a + f + k[i] + w[g]), r[i]);a = temp;}// Add this chunk's hash to result so far:h0 += a;h1 += b;h2 += c;h3 += d;}// cleanupfree(msg);//var char digest[16] := h0 append h1 append h2 append h3 //(Output is in little-endian)to_bytes(h0, digest);to_bytes(h1, digest + 4);to_bytes(h2, digest + 8);to_bytes(h3, digest + 12);
}int main(int argc, char **argv) {char *msg;size_t len;int i;uint8_t result[16];char a[100];scanf("%s",a);msg = a;len = strlen(msg);// benchmarkfor (i = 0; i < 1000000; i++) {md5((uint8_t*)msg, len, result);}// display resultfor (i = 0; i < 16; i++)printf("%2.2x", result[i]); //十六进制输出 puts("");return 0;
}//代码来源https://github.com/LovelyBuggies/C_InfoSecurity_Experiments/blob/master/MD5/src/MD5.c

2.特性验证

仅仅改变明文一位,输出完全发生变化,说明其具有雪崩效应。

还能说明其有弱碰撞性,很难找到MD5值完全相同的两段不同明文。

北理工网络安全导论作业:MD5算法相关推荐

  1. 北理工远程教育在线作业统考计算机,北理工19春《操作系统》在线作业【标准答案】...

    北理工19春<操作系统>在线作业[标准答案] 作者:佚名 字体:[增加 减小] 来源:互联网 时间:2019-08-30 23:45 北理工<操作系统>在线作业 -0001 试 ...

  2. 北理工计算机在线作业答案,北理工《操作系统》在线作业满分

    北理工<操作系统>在线作业 一. 单选题 (共 20 道试题,共 40 分) 1.在下列文件的物理结构中,不利于文件长度动态增长的是( ) A.连续结构 B.链接结构 C.索引结构 D.H ...

  3. 北理工远程教育在线作业统考计算机,北京理工大学计算机统考网上作业答案

    在 Word 文档中插入数学公式, 在"插入"菜单中应选的命令是 ( ) . 单选 题 单选 题 10.0 4 4 在 Excel 2003中,能够进行条件格式设置的区域( ) . ...

  4. matlab画电子云,北理工理论物理导论实验一:用MATLAB绘制电子云

    实验一:用MATLAB 绘制电子云 1.实验目的 1)用matlab 绘制氢原子?430态的动态电子云图,用灰度深浅表示电子出现的几率大小: 2)掌握matlab 绘图的方法: 3)理解电子云的深刻含 ...

  5. 北理工计算机流程图,北京理工大学:用“286”电脑,为北京亚运会上做出世界先进“信息系统”...

    在如今的体育赛事直播中 成绩瞬间发布 球路动态模拟 技术时实解析-- 已经让人们习以为常 在上世纪八十年代末 计算机尚未在中国普及 如果要为国际性体育赛事搭建信息化系统 无疑是困难重重 然而在1990 ...

  6. 北京理工大学计算机在线作业答案,北理工17秋《操作系统》在线作业答案

    北理工<操作系统>在线作业 ' n! f. Y+ ^% C一.单选题:[20道,总分:40分] . v7 c6 \% }  @- M1 p6 y3 @1.下面关于重定位的有关描述,错误的是 ...

  7. 北京理工大学计算机在线作业答案,北理工《操作系统》在线作业满分

    北理工<操作系统>在线作业 试卷总分:100  得分:100 一. 单选题 (共 20 道试题,共 40 分) 1.很好地解决了"零头"问题的存储管理方法是( ) A. ...

  8. 北理工 管理系统计算机仿真作业,20秋北理工《CADCAM原理与应用》--模拟3-答案 更…...

    20秋北理工<CADCAM原理与应用>--模拟3-答案 更- 2020-08-06 09:08:00 583 有学员问关于20秋北理工<CADCAM原理与应用>--模拟3-答案 ...

  9. java 北理工 教材_北理工《Java技术与应用》在线作业

    北理工<Java技术与应用>在线作业 可以代做所有奥鹏平台的作业.小论文.毕业论文.离线作业.考核作业.在线作业.在线测试,有需要的请联系本人 一.单选题(共 20 道试题,共 40 分. ...

最新文章

  1. php关联二维数组,php-检查关联二维数组
  2. Scala可以将Java中的接口当作特质来使用
  3. python时间格式化代码_Python datetime格式化代码
  4. 超图理论的一点理解(一)
  5. 华三交换机mode是什么意思_POE交换机150米、长距离250米传输是什么意思?
  6. sourcetree mac 免登录_「vscode remote ssh 免登录」mac
  7. [学习笔记] 初次见面,请多关照 (公式推导+题集)——杜教筛
  8. 软件工程学习笔记《四》需求分析
  9. 如何在命令行中使用jq将JSON转换为CSV
  10. PP视频如何将默认缓存清晰度设置成超清
  11. 数据结构与算法 | LeetCode 224. Basic Calculator
  12. 生成树协议计算机网络,【图片】生成树协议奇怪!我错哪了两边都绿了呀【计算机网络吧】_百度贴吧...
  13. springboot中Word转PDF技巧
  14. matlab二重积分运算,matlab二重积分
  15. 模板匹配及其源代码---Edge Based Template Matching
  16. 严正声明:不要抄袭本人的创作内容
  17. 我如何构建heimdall开源个人电子邮件监护人
  18. Javascript中四舍六入五成双
  19. 基于微信小程序的医院预约挂号系统设计与实现 毕业设计论文 课题题目参考(1)功能和界面效果
  20. System.Threading.ThreadAbortException: 正在中止线程

热门文章

  1. linux根目录没有卷组,linux – 卷组消失了,LV仍然可用
  2. 惠普HP LaserJet Pro 400-M401d 打印机打印出的纸出现雨水滴在玻璃的现象!!
  3. stm32毕设分享 GSM手机短信收发系统(源码+论文)
  4. android监听程序被杀死,Android 监听主进程被杀
  5. 系统架构设计笔记(73)—— 政府信息化与电子政务
  6. figlet:ASCII 艺术字天生器
  7. Android开发中app图标更换
  8. TikTok变现玩法分析
  9. ffmpeg移植Android方法以及常见问题汇总
  10. 虚拟现实数据手套汇总一览