MD5加密解密算法的描述
- 格式:doc
- 大小:39.50 KB
- 文档页数:9
MD5破解技巧1.概述MD5(Message Digest Algorithm 5)是一种常见的哈希算法,用于将任意长度的数据转化为128位的固定长度摘要。
由于MD5是单向不可逆的算法,因此在实际应用中经常被用于密码存储和数字签名等场景。
然而,随着计算能力的增强,传统的MD5算法已经变得越来越容易受到暴力破解的攻击。
在本文中,我们将探讨一些MD5破解的常用技巧,帮助您更好地了解如何应对MD5的安全风险。
2.字典攻击字典攻击是一种常见的MD5破解技巧,它基于事先准备好的密码字典来尝试破解MD5摘要。
字典通常包含常见密码、常用字典、尊称、生日等可能的密码组合。
在实际应用中,我们可以使用一些常见的密码字典,如”rockyou.txt”、“password.txt”等。
通过将这些密码字典与目标MD5摘要进行比对,我们可以有效地找出可能的明文密码。
然而,对于较复杂、随机组合的密码,字典攻击会变得不太有效。
在进行MD5破解时,我们还需要考虑其他的技巧。
3.暴力破解暴力破解是一种耗时较长的MD5破解方法,它通过尝试所有可能的密码组合来逐个验证MD5摘要。
这种方法需要消耗大量的计算资源和时间,但对于任何密码都具有一定的破解成功率。
在实践中,我们可以使用一些专门的密码破解工具,如Hashcat、John the Ripper等,来执行暴力破解。
这些工具通常支持并行计算和分布式破解,能够加快破解速度。
然而,暴力破解方法的破解速度与密码长度和复杂性成正比。
当面对较长、复杂的密码时,暴力破解可能需要非常长的时间。
4.彩虹表攻击彩虹表攻击是一种基于预先计算的技术,用于破解MD5摘要。
它通过事先计算出明文密码和对应的MD5摘要的映射关系,并将其保存在一个巨大的彩虹表中。
在进行破解时,只需要在彩虹表中查找对应的MD5摘要即可获得明文密码。
彩虹表攻击具有较高的破解速度,但需要花费大量的存储空间和计算资源来构建和查询彩虹表。
在实际应用中,我们可以使用一些现成的彩虹表,如”oclHashcat-plus”等。
MD5原理及定义算法MD5(Message Digest Algorithm 5)是一种广泛使用的哈希函数,用来将任意长度的数据块(message)通过一种算法,转换为固定长度的输出(digest)。
MD5算法是由美国密码学家罗纳德·李维斯特在1992年提出的。
MD5算法的核心原理是:将输入的数据通过一系列复杂的计算过程,转换为一个128位(16字节)长的输出,这个输出称为MD5值或者摘要。
对于相同的输入数据,无论多大或多小,输出的MD5值都是唯一的。
MD5算法的定义如下:1.初始化:选择4个32位的字作为初始变量(A、B、C、D),这些变量的初始值是固定的。
2.编码:将待处理的原始二进制数据分割成若干个512位的块(每个块由16个32位字组成),每个块的最后64位用于保存长度信息(单位为比特)。
3.填充:对于每个块,如果长度不是512位的整数倍,就添加填充位(一般为1和若干个0),直到长度达到512位的整数倍。
4.处理:对每个512位的块进行处理,每次处理都会更新变量值(A、B、C、D),通过一系列逻辑运算和非线性函数实现。
5.输出:将最终的变量值(A、B、C、D)依次连接起来,形成128位的输出,即MD5值或者摘要。
MD5算法的具体算法步骤如下:1.初始化变量A、B、C、D为固定值。
2.将输入数据分为若干512位的块。
3.对每个块进行处理,包括消息扩展、压缩函数和更新变量值。
-消息扩展:对512位块进行填充,并添加64位的长度信息。
-压缩函数:将消息块与当前变量值进行运算,包括四轮迭代运算。
-更新变量值:每一轮迭代运算之后,更新变量值。
4.返回最终的变量值(A、B、C、D)连接成的128位输出。
MD5算法具有以下特点:1.简单快速:MD5算法的计算过程相对简单,能够快速地处理。
2.不可逆:MD5值无法通过逆向算法恢复原始数据。
3.高度离散:输入数据发生微小变化,输出的MD5值也会发生巨大变化,具有很强的离散性。
MD5解密⽅法整理
⼀般来说,形如1e4dc79d489e86b2的16位或者32位密码就是经过MD5加密的,(当然也有特殊,⽐如DVBBS在登陆时候会先产⽣⼀个16位的随机密码,当然,这个密码还是和MD5密码的形式有点区别,相同的是都是16位的数字+字母组合。
);
这个⼀般来说可以⽤⼀个叫dv.exe的⼯具来破解。
他可以破解加密前是10位以下的纯数字或者纯字母,破解纯数字的,速度超快,但是纯字母的,就慢了,当然他还有其他功能,但是其他功能没什么特别之处,所以不说。
破解纯数字时候:dv -p a.txt -b num
纯字母: dv -p a.txt -b char
[以上的两a.txt是保存要破解的密码存放的⽂件,存放格式是每⾏⼀组,例如:
1e4dc79d489e86b2 admin
1e4dc79d489e86b3 admin2
......
注意:在要破解的密码和后⾯的admin ⽤户名之间有⼀个空格。
当然还有很多字典破解的⼯具,不建议使⽤。
还有就是有很多⽹站提供MD5密码查询,⽐如:。
MD5原理及定义算法MD5(Message-Digest Algorithm 5)是一种广泛使用的密码散列函数,用于产生数字指纹,以确保数据的完整性和一致性。
它是由美国密码学家Ronald Rivest于1991年设计的,并在RFC 1321中被正式定义。
MD5算法主要通过将任意长度的输入数据转换成128位固定长度的输出,实现数据的不可逆变换。
它的主要原理可以分为以下几个步骤:1.填充:首先,MD5算法会将输入数据以512位(64字节)为单位进行分块处理,并对每个分块进行填充。
填充的目的是确保输入数据长度是512位的整数倍,并在最后一个分块中添加一些额外的信息,以表示数据的原始长度。
2.初始化:MD5算法使用一个128位的缓冲区作为内部状态,并将其初始化为指定的初始值。
这个初始值是由32位整数的平方根的前32位小数部分的二进制形式组成。
这个初始值起到了混淆的作用,使得算法对不同的输入数据产生不同的输出结果。
3.迭代运算:MD5算法通过对每个分块进行四轮迭代运算来混合和置换数据。
每轮迭代都包括四个单元操作,分别是“加法、非线性函数、环移位和级联”。
这些操作在每轮迭代中不断改变缓冲区的值,使其对输入数据产生复杂的影响。
4.输出:当所有分块都被处理完毕后,MD5算法将最终结果从缓冲区中提取出来,得到一个128位的输出值。
这个输出值通常以16进制字符串的形式表示,作为数据的唯一指纹。
然而,MD5算法并不是无懈可击的。
由于其设计的时候主要考虑了速度和效率,而忽略了安全性,使得它在现代密码学领域已经变得相对不安全。
主要的安全问题包括碰撞攻击和预映像攻击。
碰撞攻击是指找到两个不同的输入数据生成相同MD5哈希值的过程。
由于MD5输出的128位长度相对较小,所以在空间中找到碰撞是可行的。
预映像攻击则是指从给定的输出值逆推出对应的输入数据。
这些攻击都利用了MD5算法的一些弱点和漏洞。
鉴于MD5的安全性问题,现在已经不推荐在安全领域中使用该算法,尤其是对于密码存储和校验等应用场景。
32位md5加密原理什么是md5加密MD5(Message Digest Algorithm 5)是一种常用的哈希算法,用于将任意长度的数据转换为固定长度的哈希值。
MD5算法广泛应用于数据完整性校验、数字签名、口令加密等领域。
MD5的特点•固定长度:MD5算法将任意长度的输入数据转换为128位的输出,即32个16进制数。
•不可逆性:MD5算法是单向的,无法通过哈希值逆推出原始数据。
•高度离散性:即使输入数据只有微小的变化,其对应的哈希值也会有很大的差异。
MD5加密的应用MD5加密广泛应用于密码存储、文件完整性校验等场景。
在密码存储中,将用户密码经过MD5加密后存储在数据库中,当用户登录时,将输入的密码进行MD5加密后与数据库中的密文进行比对,从而验证密码的正确性。
MD5加密的过程MD5加密的过程可以分为四个步骤:填充、初始化、循环运算和输出。
填充MD5算法要求输入数据的长度是64的整数倍,因此需要对输入数据进行填充。
填充的规则是在数据末尾添加一个1,然后添加若干个0,直到数据长度满足要求。
初始化MD5算法定义了四个32位的寄存器A、B、C、D,初始值分别为固定的常量。
将填充后的数据按照512位(64字节)分组,并将A、B、C、D的初始值分别存放在寄存器中。
循环运算MD5算法将每个512位的分组进行循环运算,共进行四轮。
每轮中,都会对A、B、C、D进行一系列的位运算和逻辑运算,从而更新寄存器的值。
输出经过四轮循环运算后,最终得到的A、B、C、D的值即为加密后的结果。
将这四个32位的值按照从低位到高位的顺序连接起来,即可得到32位的MD5加密结果。
MD5加密的安全性问题尽管MD5算法在很多场景下被广泛应用,但它并不是一个安全的加密算法。
由于MD5算法的设计缺陷,存在以下安全性问题:•易碰撞:MD5算法存在碰撞问题,即不同的输入数据可能会生成相同的MD5值。
这使得攻击者可以通过构造恶意数据,使其与正常数据的MD5值相同,从而绕过数据完整性校验。
一、引言Python作为一种广泛应用的编程语言,在各种应用场景下均有其独特的优势。
其中,字符串的处理是Python编程中的一个重要部分,而字符串的加解密方法在安全领域和数据传输中具有重要意义。
本文将结合Python3语言,介绍字符串的加解密方法。
二、字符串加密方法在Python3中,字符串加密可以使用多种方法,包括常见的加密算法和库。
1. MD5加密MD5(Message-Digest Algorithm 5)是一种常见的哈希加密算法,它能够将任意长度的信息压缩成一个128位的信息摘要。
在Python3中,可以使用hashlib库对字符串进行MD5加密。
```pythonimport hashlibdef md5_encrypt(text):hash_object = hashlib.md5(text.encode())return hash_object.hexdigest()```2. SHA-256加密SHA-256(Secure Hash Algorithm 256)是一种较为安全的密码散列函数,它可以对任意长度的数据进行加密,并生成一个256位的摘要。
在Python3中,同样可以使用hashlib库对字符串进行SHA-256加密。
```pythonimport hashlibdef sha256_encrypt(text):hash_object = hashlib.sha256(text.encode())return hash_object.hexdigest()```3. base64加密base64是一种基于64个可打印字符来表示二进制数据的方法,通常用于在URL、Cookie、网页或电流信箱中传输数据,也可用于将小段二进制数据嵌入到文本中。
在Python3中,可以使用base64库对字符串进行base64加密。
```pythonimport base64def base64_encrypt(text):encoded_text = base64.b64encode(text.encode())return encoded_text```三、字符串解密方法与字符串加密类似,Python3也提供了多种方法来对加密后的字符串进行解密。
实验五MD5加密解密一.MD5生成文件摘要(1)本机进入“密码工具”|“加密解密”|“MD5哈希函数”|“生成摘要”页签,在明文框中编辑文本内容: ghgfnd4eh56t78udfnhgfdghgfdhqa3mkjhagawfftefg 。
单击“生成摘要”按钮,生成文本摘要:单击“导出”按钮,将摘要导出到MD5共享文件夹(D:\Work\Encryption\MD5\)中,并通告同组主机获取摘要。
(2)单击“导入摘要”按钮,从同组主机的MD5共享文件夹中将摘要导入。
在文本框中输入同组主机编辑过的文本内容,单击“生成摘要”按钮,将新生成的摘要与导入的摘要进行比较,验证相同文本会产生相同的摘要。
(3)对同组主机编辑过的文本内容做很小的改动,再次生成摘要,与导入的摘要进行对比,验证MD5算法的抗修改性。
二.MD5算法本机进入“密码工具”|“加密解密”|“MD5哈希函数”|“演示”页签,在明文输入区输入文本(文本不能超过48个字符),单击“开始演示”,查看各模块数据及算法流程。
(1)明文:fhgfhgftyfhgftdfhgsdhj54654fghfghfghfgh(2)摘要演示过程:三.源码应用(选做)设计MD5文件校验工具,利用MD5算法计算文件摘要。
单击工具栏“VC6”按钮,启动VC++6.0。
选择“File”|“Open Workspace…”加载程文件“C:\ExpNIS\Encrypt-Lab\Projects\MD5\MD5.dsw”。
基于此工程进行程序设计。
程序代码如下:(只实现了加密的功能解密具体没有实现)#include <string.h>#include <stdlib.h>#include "md5.h"//! 文件最大2M#define MAX_FILE 1024*1024*2/*******************/// 名称:usage// 功能:帮助信息// 参数:应用程序名称// 返回:无/**********/void Usage( const char *appname )printf( "\n\tusage: md5 文件\n" );}/********/// 名称:CheckParse// 功能:校验应用程序入口参数// 参数:argc等于main主函数argc参数,argv指向main主函数argv参数// 返回:若参数合法返回true,否则返回false// 备注:简单的入口参数校验/*********/bool CheckParse( int argc, char** argv ){if( argc != 2 ){Usage( argv[0] );return false;}return true;}unsigned A,B,C,D,a,b,c,d,i,len,flen[2],x[16]; //i临时变量,len文件长,flen[2]为64位二进制表示的文件初始长度char filename[200]; //文件名FILE *fp;char MD5[32];//用于清除回车键缓存的影响void safe_flush(FILE *fp){int ch;while( (ch = fgetc(fp)) != EOF && ch != '\n' );}void dealy(){for(int time=0;time<=366666666;time++){if(time == 366666666){system("cls");}}void main(){printf("\n\n\n\n\n\t*****************题目:MD5加密工具****************\n\n");printf("\n\t*****************作者:徐刘根谢燕******************\n\n");printf("\n\t*****************指导老师:张恒汝********************\n\n");printf("\n\t*****************日期:2014-6-16********************\n\n");printf("\n\n\n\n\t\t\t3秒后自动跳转......");dealy();printf("\n\n\t******************************************************\n \n");printf("\t 加密请输入:1 退出请输入:2\n\n");printf("\t******************************************************\n");int temp;scanf("%d",&temp);safe_flush(stdin);if(temp == 2){printf("感谢使用加密解密程序!\n");}else if(temp == 1){printf("请输入你的文件名:");gets(filename);if(!(fp=fopen(filename,"rb"))){printf("无法打开你的文件!\n");}if(filename[0]==34)filename[strlen(filename)-1]=0,strcpy(filename,filename+1);fseek(fp, 0, SEEK_END);len=ftell(fp);rewind(fp);A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476;flen[1]=len/0x20000000;flen[0]=(len%0x20000000)*8;memset(x,0,64);fread(&x,4,16,fp);for(i=0;i<len/64;i++){md5();memset(x,0,64);fread(&x,4,16,fp);}((char*)x)[len%64]=128;if(len%64>55) md5(),memset(x,0,64);memcpy(x+14,flen,8); //文件末尾加入原文件的bit长度md5();fclose(fp);sprintf(MD5,"%08X%08X%08X%08X",PP(A),PP(B),PP(C),PP(D));printf("经过MD5加密后的内容为:");printf("MD5 Code:%s\n",MD5);}else{printf("请输入一个正确的选择!");}}运行结果:。
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发,经MD2、MD3和MD4发展而来。
它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。
由于MD5算法的使用不需要支付任何版权费用,所以在一般的情况下(非绝密应用领域。
但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。
由于MD5加密实际上是一种不可逆的加密手段,现实中的MD5破解其实是将字典档内容来逐个MD5加密后,使用加密后的密文比对需要破解的密文,如果相同则破解成功。
实验步骤学习MD5加密工具的使用步骤说明:了解MD5密文的生成方法。
1.运行远程桌面客户端程序mstsc.exe,输入服务器端IP地址,点击Connect连接,如图1:图12.以Administrator(管理员)身份登陆服务器桌面。
注:服务器Administrator用户的登陆密码为123456。
3.点击桌面“MD5加密器”快捷图标,程序界面如图2:图24.在程序主界面中选择“字符串MD5加密” 方式,在“加密或校验内容”文本框中,输入待加密的明文,这里我们输入了123456。
5.点击“加密或校验”按钮对明文加密,密文将呈现在“生成的MD5密文”文本框中。
E10ADC3949BA59ABBE56E057F20F883E就是MD5密文。
学习MD5暴力破解工具的使用步骤说明:学习使用MD5暴力破解工具,了解MD5密文破解原理。
1.运行桌面MD5Crack程序快捷图标。
注:常见的MD5密文暴力破解主要原理是将目标密文与自己基于字典批量加密生成的MD5密文对比,如果字符串相同,则可获取到明文,这是一个比对猜测的过程。
MD5加密算法原理及实现MD5消息摘要算法,属Hash算法⼀类。
MD5算法对输⼊任意长度的消息进⾏运⾏,产⽣⼀个128位的消息摘要。
以下所描述的消息长度、填充数据都以位(Bit)为单位,字节序为⼩端字节。
算法原理1、数据填充对消息进⾏数据填充,使消息的长度对512取模得448,设消息长度为X,即满⾜X mod 512=448。
根据此公式得出需要填充的数据长度。
填充⽅法:在消息后⾯进⾏填充,填充第⼀位为1,其余为0。
2、添加消息长度在第⼀步结果之后再填充上原消息的长度,可⽤来进⾏的存储长度为64位。
如果消息长度⼤于264,则只使⽤其低64位的值,即(消息长度对 264取模)。
在此步骤进⾏完毕后,最终消息长度就是512的整数倍。
3、数据处理准备需要⽤到的数据: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));把消息分以512位为⼀分组进⾏处理,每⼀个分组进⾏4轮变换,以上⾯所说4个常数为起始变量进⾏计算,重新输出4个变量,以这4个变量再进⾏下⼀分组的运算,如果已经是最后⼀个分组,则这4个变量为最后的结果,即MD5值。
具体计算的实现较为复杂,建议查阅相关书籍,下⾯给出在C++上的实现代码。
代码实现#MD5.h1 #ifndef MD5H2#define MD5H3 #include <math.h>4 #include <Windows.h>56void ROL(unsigned int &s, unsigned short cx); //32位数循环左移实现函数7void ltob(unsigned int &i); //B\L互转,接受UINT类型8 unsigned int* MD5(const char* mStr); //接⼝函数,并执⾏数据填充,计算MD5时调⽤此函数910#endif#MD5.cpp1 #include "MD5.h"23/*4组计算函数*/4 inline unsigned int F(unsigned int X, unsigned int Y, unsigned int Z)5 {6return (X & Y) | ((~X) & Z);7 }8 inline unsigned int G(unsigned int X, unsigned int Y, unsigned int Z)9 {10return (X & Z) | (Y & (~Z));11 }12 inline unsigned int H(unsigned int X, unsigned int Y, unsigned int Z)13 {14return X ^ Y ^ Z;15 }16 inline unsigned int I(unsigned int X, unsigned int Y, unsigned int Z)17 {18return Y ^ (X | (~Z));19 }20/*4组计算函数结束*/2122/*32位数循环左移实现函数*/23void ROL(unsigned int &s, unsigned short cx)24 {25if (cx > 32)cx %= 32;26 s = (s << cx) | (s >> (32 - cx));27return;28 }2930/*B\L互转,接收UINT类型*/31void ltob(unsigned int &i)32 {33 unsigned int tmp = i;//保存副本34byte *psour = (byte*)&tmp, *pdes = (byte*)&i;35 pdes += 3;//调整指针,准备左右调转36for (short i = 3; i >= 0; --i)37 {38 CopyMemory(pdes - i, psour + i, 1);39 }40return;41 }4243/*44MD5循环计算函数,label=第⼏轮循环(1<=label<=4),lGroup数组=4个种⼦副本,M=数据(16组32位数指针)45种⼦数组排列⽅式: --A--D--C--B--,即 lGroup[0]=A; lGroup[1]=D; lGroup[2]=C; lGroup[3]=B;46*/47void AccLoop(unsigned short label, unsigned int *lGroup, void *M)48 {49 unsigned int *i1, *i2, *i3, *i4, TAcc, tmpi = 0; //定义:4个指针; T表累加器;局部变量50 typedef unsigned int(*clac)(unsigned int X, unsigned int Y, unsigned int Z); //定义函数类型51const unsigned int rolarray[4][4] = {52 { 7, 12, 17, 22 },53 { 5, 9, 14, 20 },54 { 4, 11, 16, 23 },55 { 6, 10, 15, 21 }56 };//循环左移-位数表57const unsigned short mN[4][16] = {58 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },59 { 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12 },60 { 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2 },61 { 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 }62 };//数据坐标表63const unsigned int *pM = static_cast<unsigned int*>(M);//转换类型为32位的Uint64 TAcc = ((label - 1) * 16) + 1; //根据第⼏轮循环初始化T表累加器65 clac clacArr[4] = { F, G, H, I }; //定义并初始化计算函数指针数组6667/*⼀轮循环开始(16组->16次)*/68for (short i = 0; i < 16; ++i)69 {70/*进⾏指针⾃变换*/71 i1 = lGroup + ((0 + i) % 4);72 i2 = lGroup + ((3 + i) % 4);73 i3 = lGroup + ((2 + i) % 4);74 i4 = lGroup + ((1 + i) % 4);7576/*第⼀步计算开始: A+F(B,C,D)+M[i]+T[i+1] 注:第⼀步中直接计算T表*/77 tmpi = (*i1 + clacArr[label - 1](*i2, *i3, *i4) + pM[(mN[label - 1][i])] + (unsigned int)(0x100000000UL * abs(sin((double)(TAcc + i)))));78 ROL(tmpi, rolarray[label - 1][i % 4]);//第⼆步:循环左移79 *i1 = *i2 + tmpi;//第三步:相加并赋值到种⼦80 }81return;82 }8384/*接⼝函数,并执⾏数据填充*/85 unsigned int* MD5(const char* mStr)86 {87 unsigned int mLen = strlen(mStr); //计算字符串长度88if (mLen < 0) return0;89 unsigned int FillSize = 448 - ((mLen * 8) % 512); //计算需填充的bit数90 unsigned int FSbyte = FillSize / 8; //以字节表⽰的填充数91 unsigned int BuffLen = mLen + 8 + FSbyte; //缓冲区长度或者说填充后的长度92 unsigned char *md5Buff = new unsigned char[BuffLen]; //分配缓冲区93 CopyMemory(md5Buff, mStr, mLen); //复制字符串到缓冲区9495/*数据填充开始*/96 md5Buff[mLen] = 0x80; //第⼀个bit填充197 ZeroMemory(&md5Buff[mLen + 1], FSbyte - 1); //其它bit填充0,另⼀可⽤函数为FillMemory98 unsigned long long lenBit = mLen * 8ULL; //计算字符串长度,准备填充99 CopyMemory(&md5Buff[mLen + FSbyte], &lenBit, 8); //填充长度100/*数据填充结束*/101102/*运算开始*/103 unsigned int LoopNumber = BuffLen / 64; //以16个字为⼀分组,计算分组数量104 unsigned int A = 0x67452301, B = 0x0EFCDAB89, C = 0x98BADCFE, D = 0x10325476;//初始4个种⼦,⼩端类型105 unsigned int *lGroup = new unsigned int[4]{ A, D, C, B}; //种⼦副本数组,并作为返回值返回106for (unsigned int Bcount = 0; Bcount < LoopNumber; ++Bcount) //分组⼤循环开始107 {108/*进⼊4次计算的⼩循环*/109for (unsigned short Lcount = 0; Lcount < 4;)110 {111 AccLoop(++Lcount, lGroup, &md5Buff[Bcount * 64]);112 }113/*数据相加作为下⼀轮的种⼦或者最终输出*/114 A = (lGroup[0] += A);115 B = (lGroup[3] += B);116 C = (lGroup[2] += C);117 D = (lGroup[1] += D);118 }119/*转换内存中的布局后才能正常显⽰*/120 ltob(lGroup[0]);121 ltob(lGroup[1]);122 ltob(lGroup[2]);123 ltob(lGroup[3]);124 delete[] md5Buff; //清除内存并返回125return lGroup;126 }再给出调⽤实例(以win32控制台应⽤程序为例):#main.cpp1 #include <iostream>2 #include <string.h>3 #include <stdlib.h>4 #include "MD5.h"56int main(int argc, char **argv)7 {8char tmpstr[256], buf[4][10];9 std::cout << "请输⼊要加密的字符串:";10 std::cin >> tmpstr;11 unsigned int* tmpGroup = MD5(tmpstr);12 sprintf_s(buf[0], "%8X", tmpGroup[0]);13 sprintf_s(buf[1], "%8X", tmpGroup[3]);14 sprintf_s(buf[2], "%8X", tmpGroup[2]);15 sprintf_s(buf[3], "%8X", tmpGroup[1]);16 std::cout <<"MD5:"<< buf[0] << buf[1] << buf[2] << buf[3] << std::endl; 1718 delete[] tmpGroup;19return0; //在此下断点才能看到输出的值20 }注:以上代码在VS2013上编译通过。
MD5详解MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展⽽来。
MD5算法的使⽤不需要⽀付任何版权费⽤。
MD5功能:输⼊任意长度的信息,经过处理,输出为128位的信息(数字指纹);不同的输⼊得到的不同的结果(唯⼀性);根据128位的输出结果不可能反推出输⼊的信息(不可逆);MD5属不属于加密算法:认为不属于的⼈是因为他们觉得不能从密⽂(散列值)反过来得到原⽂,即没有解密算法,所以这部分⼈认为MD5只能属于算法,不能称为加密算法;认为属于的⼈是因为他们觉得经过MD5处理后看不到原⽂,即已经将原⽂加密,所以认为MD5属于加密算法;我个⼈⽀持后者。
MD5⽤途:1、防⽌被篡改:1)⽐如发送⼀个电⼦⽂档,发送前,我先得到MD5的输出结果a。
然后在对⽅收到电⼦⽂档后,对⽅也得到⼀个MD5的输出结果b。
如果a 与b⼀样就代表中途未被篡改。
2)⽐如我提供⽂件下载,为了防⽌不法分⼦在安装程序中添加⽊马,我可以在⽹站上公布由安装⽂件得到的MD5输出结果。
3)SVN在检测⽂件是否在CheckOut后被修改过,也是⽤到了MD5.2、防⽌直接看到明⽂:现在很多⽹站在数据库存储⽤户的密码的时候都是存储⽤户密码的MD5值。
这样就算不法分⼦得到数据库的⽤户密码的MD5值,也⽆法知道⽤户的密码(其实这样是不安全的,后⾯我会提到)。
(⽐如在UNIX系统中⽤户的密码就是以MD5(或其它类似的算法)经加密后存储在⽂件系统中。
当⽤户登录的时候,系统把⽤户输⼊的密码计算成MD5值,然后再去和保存在⽂件系统中的MD5值进⾏⽐较,进⽽确定输⼊的密码是否正确。
通过这样的步骤,系统在并不知道⽤户密码的明码的情况下就可以确定⽤户登录系统的合法性。
这不但可以避免⽤户的密码被具有系统管理员权限的⽤户知道,⽽且还在⼀定程度上增加了密码被破解的难度。
)3、防⽌抵赖(数字签名):这需要⼀个第三⽅认证机构。
md5算法例子
MD5算法是一种常用的哈希函数,可以将任意长度的消息摘要为128位的散列值。
举个例子,假如我们要对一段文本“你好,世界!”进行MD5加密,其加密后的结果应该是:
7eca689f0d3389d9dea66ae112e5cfd7
MD5算法的应用非常广泛,例如在网络传输中,我们可以利用MD5算法确保数据的完整性。
又比如,在密码验证中,我们可以把用户输入的密码经过哈希后和数据库中存储的哈希值进行比对,从而验证密码的正确性。
虽然MD5算法比起其它哈希函数来说已经较为容易被破解,但是它仍然是一种非常有效的加密手段。
MD5加密概述⼀、Note:写到这篇⽂章是⼯作中实际遇到了,以前都听过不过没有细看。
这⾥简单概述下,原理的话需要看看更专业的介绍了。
⼆、MD5简介Message Digest Algorithm MD5(中⽂名为第五版)为计算机安全领域⼴泛使⽤的⼀种散列函数,⽤以提供消息的完整性保护。
该算法的⽂件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),⽤于确保信息传输完整⼀致。
是计算机⼴泛使⽤的杂凑算法之⼀(⼜译、),主流编程语⾔普遍已有MD5实现。
将数据(如汉字)运算为另⼀固定长度值,是杂凑算法的基础原理,MD5的前⾝有MD2、和。
三、消息摘要算法简介1、主要特征消息摘要算法的主要特征是加密过程不需要,并且经过加密的数据⽆法被解密,只有输⼊相同的明⽂数据经过相同的消息摘要算法才能得到相同的密⽂。
消息摘要算法不存在密钥的管理与分发问题,适合于分布式⽹络上使⽤。
由于其加密计算的⼯作量相当可观,所以以前的这种算法通常只⽤于数据量有限的情况下的加密,例如计算机的⼝令就是⽤不可逆加密算法加密的。
近年来,随着计算机性能的飞速改善,加密速度不再成为限制这种加密技术发展的桎梏,因⽽消息摘要算法应⽤的领域不断增加。
消息摘要算法主要应⽤在“数字签名”领域,作为对明⽂的摘要算法。
著名的摘要算法有RSA公司的MD5算法和SHA-1算法及其⼤量的变体。
2、应⽤⼀般地,把对⼀个信息的摘要称为该消息的指纹或。
数字签名是保证信息的完整性和不可否认性的⽅法。
数据的完整性是指信宿接收到的消息⼀定是信源发送的信息,⽽中间绝⽆任何更改;信息的不可否认性是指信源不能否认曾经发送过的信息。
其实,通过数字签名还能实现对信源的⾝份识别(认证),即确定“信源”是否是信宿意定的通信伙伴。
MD5算法详解前⾯⼀篇,带⼤家对加密算法进⾏了鸟瞰,本篇主要谈md5算法的实现。
MD5:Message-Digest Algorithm 5(信息摘要5),确保信息的完整性。
其算法是1992年公开的,那时我才⼏岁,鉴于⼤家对md5都很熟悉,且程序中经常应⽤,我就不再介绍了。
我简单的介绍下设计者。
其⼈是罗纳德·李维斯特,美国密码学家,后来发明了⾮对称秘钥RSA 算法,因这个算法的在信息安全中的突破与重要性⽽获得了2002年的图灵奖。
好了,接下来⼀起看算法步骤以及源代码:1、填充在MD5算法中,⾸先需要对信息进⾏填充,使其位长对512求余的结果等于448,并且填充必须进⾏,使其位长对512求余的结果等于448。
因此,信息的位长(Bits Length)将被扩展⾄N*512+448,N为⼀个⾮负整数,N可以是零。
理解:位长,就是位数。
⽐如⼀个“wbq”,字符串是三个字节存储,⼀个字节8bit,所以位长就是24。
⽤数学语⾔可能更简洁:设M为位长,当且仅当 M%512==448时,才可以处理。
换另⼀种表⽰⽅式,M=N*512+448 ,N>=0填充的⽅法如下:1) 在信息的后⾯填充⼀个1和⽆数个0,直到满⾜上⾯的条件时才停⽌⽤0对信息的填充。
2) 在这个结果后⾯附加⼀个以64位⼆进制表⽰的填充前信息长度(单位为Bit),如果⼆进制表⽰的填充前信息长度超过64位,则取低64位。
经过这两步的处理,M=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。
这样做的原因是为满⾜后⾯处理中对信息长度的要求。
经过两步处理后,信息变成了这样,如下图所⽰:64位,8个字节,⽤来表⽰原始信息的位长。
1private static UInt32[] MD5_Append(byte[] input)2 {3int zeros = 0;4int ones = 1;5int size = 0;6int n = input.Length;7int m = n % 64;8if (m < 56)9 {10 zeros = 55 - m;11 size = n - m + 64;12 }13else if (m == 56)14 {15 zeros = 0;16 ones = 0;17 size = n + 8;18 }19else20 {21 zeros = 63 - m + 56;22 size = n + 64 - m + 64;23 }2425 ArrayList bs = new ArrayList(input);26if (ones == 1)27 {28 bs.Add((byte)0x80); // 0x80 = $1000000029 }30for (int i = 0; i < zeros; i++)31 {32 bs.Add((byte)0);33 }3435 UInt64 N = (UInt64)n * 8;36byte h1 = (byte)(N & 0xFF);37byte h2 = (byte)((N >> 8) & 0xFF);3839byte h3 = (byte)((N >> 16) & 0xFF);40byte h4 = (byte)((N >> 24) & 0xFF);41byte h5 = (byte)((N >> 32) & 0xFF);42byte h6 = (byte)((N >> 40) & 0xFF);43byte h7 = (byte)((N >> 48) & 0xFF);44byte h8 = (byte)(N >> 56);45 bs.Add(h1);46 bs.Add(h2);47 bs.Add(h3);48 bs.Add(h4);49 bs.Add(h5);50 bs.Add(h6);51 bs.Add(h7);52 bs.Add(h8);53byte[] ts = (byte[])bs.ToArray(typeof(byte));5455/* Decodes input (byte[]) into output (UInt32[]). Assumes len is56 * a multiple of 4.57*/58 UInt32[] output = new UInt32[size / 4];59for (Int64 i = 0, j = 0; i < size; j++, i += 4)60 {61 output[j] = (UInt32)(ts[i] | ts[i + 1] << 8 | ts[i + 2] << 16 | ts[i + 3] << 24);62 }63return output;64 }说明,补多少0,如何补?第7⾏,求余。
MD5算法解析 MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展⽽来。
MD5将任意长度的“字节串”变换成⼀个128bit的⼤整数,并且它是⼀个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也⽆法将⼀个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有⽆穷多个,这有点象不存在反函数的数学函数。
MD5的典型应⽤是对⼀段Message(字节串)产⽣fingerprint(指纹),以防⽌被“篡改”。
举个例⼦,你将⼀段话写在⼀个叫 readme.txt⽂件中,并对这个readme.txt产⽣⼀个MD5的值并记录在案,然后你可以传播这个⽂件给别⼈,别⼈如果修改了⽂件中的任何内容,你对这个⽂件重新计算MD5时就会发现。
如果再有⼀个第三⽅的认证机构,⽤MD5还可以防⽌⽂件作者的“抵赖”,这就是所谓的数字签名应⽤。
MD5还⼴泛⽤于加密和解密技术上,在很多操作系统中,⽤户的密码是以MD5值(或类似的其它算法)的⽅式保存的,⽤户Login的时候,系统是把⽤户输⼊的密码计算成MD5值,然后再去和系统中保存的MD5值进⾏⽐较,⽽系统并不“知道”⽤户的密码是什么。
在⼀些初始化处理后,MD5以512位分组来处理输⼊⽂本,每⼀分组⼜划分为16个32位⼦分组。
算法的输出由四个32位分组组成,将它们级联形成⼀个128位散列值。
⾸先填充消息使其长度恰好为⼀个⽐512位的倍数仅⼩64位的数。
填充⽅法是附⼀个1在消息后⾯,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。
这两步的作⽤是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。
四个32位变量初始化为:A=0×01234567B=0×89abcdefC=0xfedcba98D=0×76543210它们称为链接变量(chaining variable) 接着进⾏算法的主循环,循环的次数是消息中512位消息分组的数⽬。
添加到搜藏编辑词条词条统计MD5简介算法的应用算法描述具体的一个MD5实现一些破解MD5的网站FF(d, a, b, c, M9, 12, 0x8b44f7af) FF(c, d, a, b, M10, 17, 0xffff5bb1) FF(b, c, d, a, M11, 22, 0x895cd7be) FF(a, b, c, d, M12, 7, 0x6b901122) FF(d, a, b, c, M13, 12, 0xfd987193) FF(c, d, a, b, M14, 17, 0xa679438e) FF(b, c, d, a, M15, 22, 0x49b40821) 第二轮GG(a, b, c, d, M1, 5, 0xf61e2562) GG(d, a, b, c, M6, 9, 0xc040b340) GG(c, d, a, b, M11, 14, 0x265e5a51) GG(b, c, d, a, M0, 20, 0xe9b6c7aa) GG(a, b, c, d, M5, 5, 0xd62f105d) GG(d, a, b, c, M10, 9, 0x02441453) GG(c, d, a, b, M15, 14, 0xd8a1e681) GG(b, c, d, a, M4, 20, 0xe7d3fbc8) GG(a, b, c, d, M9, 5, 0x21e1cde6) GG(d, a, b, c, M14, 9, 0xc33707d6) GG(c, d, a, b, M3, 14, 0xf4d50d87) GG(b, c, d, a, M8, 20, 0x455a14ed) GG(a, b, c, d, M13, 5, 0xa9e3e905) GG(d, a, b, c, M2, 9, 0xfcefa3f8)GG(c, d, a, b, M7, 14, 0x676f02d9) GG(b, c, d, a, M12, 20, 0x8d2a4c8a)第三轮HH(a, b, c, d, M5, 4, 0xfffa3942)HH(d, a, b, c, M8, 11, 0x8771f681) HH(c, d, a, b, M11, 16, 0x6d9d6122) HH(b, c, d, a, M14, 23, 0xfde5380c) HH(a, b, c, d, M1, 4, 0xa4beea44) HH(d, a, b, c, M4, 11, 0x4bdecfa9) HH(c, d, a, b, M7, 16, 0xf6bb4b60) HH(b, c, d, a, M10, 23, 0xbebfbc70)件Security.h===============================================/*使用方法:char Md5Buffer[33];CSecurity Security;Security.MD5("a string",Md5Buffer);执行完成之后Md5Buffer中即存储了由"a string"计算得到的MD5值*/// 下列 ifdef 块是创建使从 DLL 导出更简单的// 宏的标准方法。
C#:使⽤MD5对⽤户密码加密与解密C#中常涉及到对⽤户密码的加密于解密的算法,其中使⽤MD5加密是最常见的的实现⽅式。
本⽂总结了通⽤的算法并结合了⾃⼰的⼀点⼩经验,分享给⼤家。
⼀.使⽤16位、32位、64位MD5⽅法对⽤户名加密1)16位的MD5加密///<summary>/// 16位MD5加密///</summary>///<param name="password"></param>///<returns></returns>public static string MD5Encrypt16(string password){var md5 = new MD5CryptoServiceProvider();string t2 = BitConverter.ToString(puteHash(Encoding.Default.GetBytes(password)), 4, 8);t2 = t2.Replace("-", "");return t2;}2)32位的MD5加密///<summary>/// 32位MD5加密///</summary>///<param name="password"></param>///<returns></returns>public static string MD5Encrypt32(string password){string cl = password;string pwd = "";MD5 md5 = MD5.Create(); //实例化⼀个md5对像// 加密后是⼀个字节类型的数组,这⾥要注意编码UTF8/Unicode等的选择 byte[] s = puteHash(Encoding.UTF8.GetBytes(cl));// 通过使⽤循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得for (int i = 0; i < s.Length; i++){// 将得到的字符串使⽤⼗六进制类型格式。
加密算法分析与研究1 调研背景随着计算机互联网的飞速发展和的不断普及,地球已经成为了地球村。
在人们获得巨大便利的同时,也有着一系列的严重问题出现,其中信息的安全性最为突出。
因特网极大地改变了人类生产,生活和思维方式。
进入新世纪以来,网络用户呈几何级数增长,而很多企业正是看到其中巨大的商机纷纷开展网上业务。
无论在计算机上存储、处理、应用,还是在通信网络上传输,信息都可能被非授权访问而导致泄密,被篡改破坏而导致不完整,被冒充替换而导致否认,也可能被阻塞拦截而导致无法存取。
在网络通信之中,这些有可能是有意的破坏,如黑客攻击、病毒感染,也有可能是无意的失误,如程序错误等。
网络通信安全问题为越来越多的人所认识,这影响着人们对于网络的态度和行为。
2 文献资料主要内容2.1 数据加密的概念数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。
该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。
根据密钥的不同分为对称加密和非对称加密,典型的对称加密算法有DES、AES等,典型的非对称加密算法有RSA、ECC等。
2.2 加密算法的概述DES加密算法DES的原始思想可以参照二战德国的恩格玛机,其基本思想大致相同。
传统的密码加密都是由古代的循环移位思想而来,恩格玛机在这个基础之上进行了扩散模糊。
但是本质原理都是一样的。
现代DES在二进制级别做着同样的事:替代模糊,增加分析的难度。
DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。
这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。
使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。
MD5 算法描述 对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。
当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。 将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。
主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。 以一下是每次操作中用到的四个非线性函数(每轮一个)。
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)) (&是与,|是或,~是非,^是异或)
这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。 F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 设Mj表示消息的第j个子分组(从0到15),<<为: FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)< 第一轮 FF(a,b,c,d,M0,7,0xd76aa478) FF(d,a,b,c,M1,12,0xe8c7b756) FF(c,d,a,b,M2,17,0x242070db) FF(b,c,d,a,M3,22,0xc1bdceee) FF(a,b,c,d,M4,7,0xf57c0faf) FF(d,a,b,c,M5,12,0x4787c62a) FF(c,d,a,b,M6,17,0xa8304613) FF(b,c,d,a,M7,22,0xfd469501) FF(a,b,c,d,M8,7,0x698098d8) FF(d,a,b,c,M9,12,0x8b44f7af) FF(c,d,a,b,M10,17,0xffff5bb1) FF(b,c,d,a,M11,22,0x895cd7be) FF(a,b,c,d,M12,7,0x6b901122) FF(d,a,b,c,M13,12,0xfd987193) FF(c,d,a,b,M14,17,0xa679438e) FF(b,c,d,a,M15,22,0x49b40821) 第二轮 GG(a,b,c,d,M1,5,0xf61e2562) GG(d,a,b,c,M6,9,0xc040b340) GG(c,d,a,b,M11,14,0x265e5a51) GG(b,c,d,a,M0,20,0xe9b6c7aa) GG(a,b,c,d,M5,5,0xd62f105d) GG(d,a,b,c,M10,9,0x02441453) GG(c,d,a,b,M15,14,0xd8a1e681) GG(b,c,d,a,M4,20,0xe7d3fbc8) GG(a,b,c,d,M9,5,0x21e1cde6) GG(d,a,b,c,M14,9,0xc33707d6) GG(c,d,a,b,M3,14,0xf4d50d87) GG(b,c,d,a,M8,20,0x455a14ed) GG(a,b,c,d,M13,5,0xa9e3e905) GG(d,a,b,c,M2,9,0xfcefa3f8) GG(c,d,a,b,M7,14,0x676f02d9) GG(b,c,d,a,M12,20,0x8d2a4c8a) 第三轮 HH(a,b,c,d,M5,4,0xfffa3942) HH(d,a,b,c,M8,11,0x8771f681) HH(c,d,a,b,M11,16,0x6d9d6122) HH(b,c,d,a,M14,23,0xfde5380c) HH(a,b,c,d,M1,4,0xa4beea44) HH(d,a,b,c,M4,11,0x4bdecfa9) HH(c,d,a,b,M7,16,0xf6bb4b60) HH(b,c,d,a,M10,23,0xbebfbc70) HH(a,b,c,d,M13,4,0x289b7ec6) HH(d,a,b,c,M0,11,0xeaa127fa) HH(c,d,a,b,M3,16,0xd4ef3085) HH(b,c,d,a,M6,23,0x04881d05) HH(a,b,c,d,M9,4,0xd9d4d039) HH(d,a,b,c,M12,11,0xe6db99e5) HH(c,d,a,b,M15,16,0x1fa27cf8) HH(b,c,d,a,M2,23,0xc4ac5665) 第四轮 II(a,b,c,d,M0,6,0xf4292244) II(d,a,b,c,M7,10,0x432aff97) II(c,d,a,b,M14,15,0xab9423a7) II(b,c,d,a,M5,21,0xfc93a039) II(a,b,c,d,M12,6,0x655b59c3) II(d,a,b,c,M3,10,0x8f0ccc92) II(c,d,a,b,M10,15,0xffeff47d) II(b,c,d,a,M1,21,0x85845dd1) II(a,b,c,d,M8,6,0x6fa87e4f) II(d,a,b,c,M15,10,0xfe2ce6e0) II(c,d,a,b,M6,15,0xa3014314) II(b,c,d,a,M13,21,0x4e0811a1) II(a,b,c,d,M4,6,0xf7537e82) II(d,a,b,c,M11,10,0xbd3af235) II(c,d,a,b,M2,15,0x2ad7d2bb) II(b,c,d,a,M9,21,0xeb86d391) 常数ti可以如下选择: 在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。(4294967296等于2的32次方) 所有这些完成之后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后的输出是A、B、C和D的级联。 当你按照上面所说的方法实现MD5算法以后,你可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。 MD5 ("") = d41d8cd98f00b204e9800998ecf8427e MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f MD5 ("123456789012345678901234567890123456789012345678901234567890123456789 01234567890") = 57edf4a22be3c955ac49da2e2107b67a 如果你用上面的信息分别对你做的MD5算法实例做测试,最后得出的结论和标准答案完全一样,那我就要在这里象你道一声祝贺了。要知道,我的程序在第一次编译成功的时候是没有得出和上面相同的结果的。 MD5的安全性