首页 算命 正文

md5值计算命令

一、MD5怎么运算 他的运算方法是

关于MD5算法破解对实际应用影响的讨论国家信息中心信息安全研究与服务中心 李丹北京天威诚信电子商务服务有限公司 龙毅宏摘要:在2004国际密码学会议(Crypto'2004)上,王小云教授公布了破解MD5算法的研究成果,引起了密码学界轰动,国内有些媒体甚至认为这一破解会导致数字签名安全大厦的轰然倒塌,那么,实际情况究竟是怎样的呢?本文就MD5算法破解对实际应用的影响进行分析讨论,回答了这个问题。

正文:在2004年8月17日美国加州圣巴巴拉召开的国际密码学会议(Crypto'2004)上,来自中国山东大学的王小云教授做了破解MD5算法的报告。当她公布了她的研究结果之后,会场上响起激动的掌声。

王小云教授的报告轰动了全场,得到了与会专家的赞叹。国内有些媒体甚至认为这一破解会导致数字签名安全大厦的轰然倒塌。

那么,实际应用的情况究竟是怎样的呢? MD5是一种散列算法(Hash function),又称为哈希算法、消息摘要算法,它的作用是获取数字信息的特征(我们有时称之为“信息指纹)。一个任意长度的任意数字信息,通过散列算法运算后,会产生一串固定长度(比如160bit)的数字信息,称为散列值(或哈希值、消息摘要)。

安全的散列算法有这样的特点:⑴ 两个不同数字信息产生同样的 散列值的概率是非常小的(小到现实中几乎无法发生);⑵ 仅从散列值无法演推出原信息;⑶ 原信息的微小改变,哪怕只改变一位(bit),将导致散列值的很大变化。数字签名要使用散列值。

MD5是一种常用散列算法,另外目前常用的散列算法还有SHA-1。两个不同的数字信息产生相同的散列值就是人们所说的“散列值碰撞“。

散列算法是一个将无穷维空间的信息映射到有限维空间的变换,学过数学的人都知道这不是一个一一对应的变换。实际上一个散列值可能对应有无穷多个数字信息,换言之,会有无穷多个数字信息产生同样一个散列值。

这点是研究密码的人众所周知的,而不像有些媒体所说的那样,散列值是唯一的。一个安全散列算法的安全性是基于这样的假设,知道一个信息A的散列值H,很难找到,或者从H倒推出另一个信息B具有同样的散列值H。

中国学者的发现是这样的,对于MD5散列算法,针对某些信息集合,找到了一种方法,当我们知道它的散列值H时,能推出一个信息数据B具有同样的MD5散列H。需要强调的是,王小云教授的破解算法是一个概率性的破解算法,只对部分信息集合适用。

这当然是密码学界的一个重大发现,这说明了MD5不像我们原先认为的那样安全。但是,这个研究发现的实际影响要远远小于它的理论意义。

这可以从以下几方面加以说明。根据MD5破解算法,对一个信息A及其散列值H,我们有可能推出另一个信息B,它的MD5散列值也是H 。

现在的问题是,如果A是一个符合预先约定格式的、有一定语义的信息,那么演推出的信息B将不是一个符合约定格式、有语义的信息。比如说,A是一个甚于Word文档的、有语义的电子合同,而B却不可能是一个刚好符合Word格式的文档,只能是一堆乱码,也就是说,B不可能是一个有效的、有意义的并且符合伪造者期望的电子合同。

再比如说,A是一个符合X509格式的数字证书,那么我们推出的B不可能刚好也是一个符合X509格式而且是伪造者希望的数字证书。还有我们知道,电子合同是需要双方、甚至多方电子签名的。

对于双方签名,这相当于我们先产生A的散列值H1,然后对A和H1合起来的信息进一步产生散列值H2。我们目前的研究发现还无法找到一个方法,推出一个信息B刚好产生同样的H1和H2。

(这个B是一定存在的!只是目前不知道怎样找!)其次,MD5被破解了,我们现在还有SHA-1等其他散列算法,以后还可以有新的、更安全的散列算法。总之,这里MD5算法的破解对实际应用的冲击要远远小于它的理论意义,不会造成PKI、数字签 名安全体系的崩溃,这也是为什么MD5散列算法的破解并没有造成密码界、PKI行业的恐慌的原因。

当然,我们也为中国人在密码学上取得的杰出成就起立鼓掌。 参考文献【1】 2004国际密码学会议(Crypto'2004)破译MD5、HAVAL-128、MD4和RIPEMD算法的报告 王小云等【2】 应用密码学,Bruce Schneier著,吴世忠等译。

关于MD5的介绍,还有一个MD5百科的链接,您可以参考一下: http://baike.baidu.com/view/7636.htm 希望我的回答对您有参考意义!。

二、如何计算一个文件的md5值

文件校验和完整性验证程序 (FCIV) 实用程序可以用于计算 MD5 或 sha-1 加密哈希值的文件。 有关文件校验和完整性验证程序 (FCIV) 实用程序的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

841290可用性和文件校验和完整性验证程序实用程序的说明

若要计算在 MD5 和文件的 sha-1 哈希值,请在命令行键入以下命令:

FCIV-md5-sha1 path\filename.ext

例如对于计算 Shdocvw.dll 文件 %Systemroot% \System32 文件夹中的 MD5 和 sha-1 哈希值,键入以下命令:

FCIV-md5-sha1 c:\windows\system32\shdocvw.dll

三、linuxshell怎么计算设备文件的md5

计算设备文件的md5所要用到的命令就是 md5summan一下md5sum命令,得到md5sum命令的用法:md5sum [OPTION]… [FILE]…1、计算指定文件的MD5值(如a.rmvb)md5sum a.rmvb输出结果类似如下:8dab209d0b7c7fb1afb071f0855a8c37 a.rmvb即计算出的md5值加上文件名测试了一下,发现这命令算一2G多的电影所用时间不过几十钞,效率还行。

2、计算字符串MD5值(如字符串 “password”)echo -n “password” | md5sum输出:5f4dcc3b5aa765d61d8327deb882cf99 –上面echo加 -n的作用是去除串结尾的回车符,因为echo命令默认会添加一回车符。像如果是:echo “password” | md5sum那输出的将会是:286755fad04869ca523320acce0dc6a4 –不加-n与加-n结果是不一样的。

正确的做法一般是要加-n参数。

四、求:MD5逆运算算法

对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

第一步、填充:如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit);

第二步、记录信息长度:用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N*512+448+64=(N+1)*512位。

第三步、装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。

五、求代码

#include #include #include #include typedef unsigned char BYTE;typedef unsigned int UINT;typedef UINT MD5_SUB_ARRAY[16];typedef UINT MD5_TRANSORM_FUNC(UINT,UINT,UINT);typedef struct{ UINT a; UINT b; UINT c; UINT d; MD5_SUB_ARRAY sub_array;}MD5_TRANSFORM_PARAM;const double MAX_INT = (double)0xFFFFFFFF + 1.0;const UINT MD5_TRANSFORM_MATRIX[4][16][3] ={ { { 0, 7, 1}, { 1,12, 2}, { 2,17, 3}, { 3,22, 4}, { 4, 7, 5}, { 5,12, 6}, { 6,17, 7}, { 7,22, 8}, { 8, 7, 9}, { 9,12,10}, {10,17,11}, {11,22,12}, {12, 7,13}, {13,12,14}, {14,17,15}, {15,22,16}, }, { { 1, 5,17}, { 6, 9,18}, {11,14,19}, { 0,20,20}, { 5, 5,21}, {10, 9,22}, {15,14,23}, { 4,20,24}, { 9, 5,25}, {14, 9,26}, { 3,14,27}, { 8,20,28}, {13, 5,29}, { 2, 9,30}, { 7,14,31}, {12,20,32}, }, { {5, 4, 33}, { 8,11,34}, {11,16,35},{14, 23,36}, {1, 4, 37}, { 4,11,38}, { 7,16,39},{10, 23,40}, {13,4, 41}, { 0,11,42}, { 3,16,43},{ 6, 23,44}, {9, 4, 45}, {12,11,46}, {15,16,47},{ 2, 23,48}, }, { { 0,6,49}, { 7,10,50}, {14,15,51},{ 5, 21,52}, {12,6,53}, { 3,10,54}, {10,15,55},{ 1, 21,56}, { 8,6,57}, {15,10,58}, { 6,15,59},{13, 21,60}, { 4,6,61}, {11,10,62}, { 2,15,63},{ 9, 21,64}, },};static UINT MD5_TRANSFORM_ARRAY[65];void MD5_Init(){ int x; for(x = 1; x <= 64; x++) { MD5_TRANSFORM_ARRAY[x] = (UINT)(MAX_INT * fabs(sin(x))); }}UINT F(UINT x,UINT y,UINT z){ return ((x & y) | ((~x) & z));}UINT G(UINT x,UINT y,UINT z){ return ((x & z) | (y & (~z)));}UINT H(UINT x,UINT y,UINT z){ return (x ^ y ^ z);}UINT I(UINT x,UINT y,UINT z){ return (y ^ (x | (~z)));}BYTE* MD5_prepare_data(const BYTE* data,int len,int* new_len){ int rest,fill,size; BYTE* new_data; UINT bit_len; // (1) 字节补齐 rest = len % 56; if (rest <= 56) fill = 56 - rest; else fill = (64 - rest) + 56; new_data = http://www.kddxy.net//ming/(BYTE*)malloc(len + fill + 8); if (NULL == new_data) return NULL; if (len> 0) memcpy(new_data,data,len); if (fill > 0) memset(new_data + len,0x80,1); if (fill > 1) memset(new_data + len + 1,0,fill - 1); size = fill + len; // (2) 附加数据的比特长度 bit_len = len * 8; // (64位二进制数表示的)比特长度的低32位 memset(new_data + size + 0,(bit_len & 0x000000FF), 1); memset(new_data + size + 1,(bit_len & 0x0000FF00) >> 8, 1); memset(new_data + size + 2,(bit_len & 0x00FF0000) >> 16,1); memset(new_data + size + 3,(bit_len & 0xFF000000) >> 24,1); // 不考虑比特长度超出32位无符号数表示范围,所以高32位总是0 memset(new_data + size + 4,0,4); *new_len = size + 8; return new_data;}void MD5_transform(MD5_TRANSFORM_PARAM* param,int ring,MD5_TRANSORM_FUNC func){ UINT a,b,c,d,s,k,i; UINT abcd[4]; UINT *X,*T; int index; abcd[0] = param->a; abcd[1] = param->b; abcd[2] = param->c; abcd[3] = param->d; X = param->sub_array; T = MD5_TRANSFORM_ARRAY; for(index = 0; index < 16; index++) { a = abcd[(3 * index + 0) % 4]; b = abcd[(3 * index + 1) % 4]; c = abcd[(3 * index + 2) % 4]; d = abcd[(3 * index + 3) % 4]; k = MD5_TRANSFORM_MATRIX[ring][index][0]; s = MD5_TRANSFORM_MATRIX[ring][index][1]; i = MD5_TRANSFORM_MATRIX[ring][index][2]; a = a + func(b,c,d) + X[k] + T[i]; a = ( a << s) | ( a >> (32 - s)); // 循环左移 a = a + b; abcd[(3 * index + 0) % 4] = a; } param->a = abcd[0]; param->b = abcd[1]; param->c = abcd[2]; param->d = abcd[3];}int MD5(const BYTE* data,int len){ int x,y,new_len; MD5_TRANSFORM_PARAM param; UINT AA,BB,CC,DD; BYTE* buf; MD5_Init(); buf = MD5_prepare_data(data,len,&new_len); if (buf == NULL) return -1; AA = 0x67452301; BB = 0xefcdab89; CC = 0x98badcfe; DD = 0x10325476; for(x = 0; x < new_len / 64; x++) { param.a = AA; param.b = BB; param.c = CC; param.d = DD; for(y = 0; y < 16; y++) { param.sub_array[y] = buf[64 * x + 4 * y + 0]; param.sub_array[y] += buf[64 * x + 4 * y + 1] << 8; param.sub_array[y] += buf[64 * x + 4 * y + 2] << 16; param.sub_array[y] += buf[64 * x + 4 * y + 3] << 24; } MD5_transform(¶m,0,F); MD5_transform(¶m,1,G); MD5_transform(¶m,2,H); MD5_transform(¶m,3,I); AA += param.a; BB += param.b; CC += param.c; DD += param.d; } printf("MD5(\"%s\")=",data); printf("%02X%02X%02X%02X", (AA & 0x000000FF), (AA & 0x0000FF00) >> 8, (AA & 0x00FF0000) >> 16, (AA & 0xFF000000) >> 24); printf("%02X%02X%02X%02X", (BB & 0x000000FF), (BB & 0x0000FF00) >> 8, (BB & 0x00FF0000) >> 16, (BB & 0xFF000000) >> 24); printf("%02X%02X%02X%02X", (CC & 0x000000FF), (CC & 0x0000FF00) >> 8, (CC & 0x00FF0000) >> 16, (CC & 0xFF000000) >> 24); printf("%02X%02X%02X%02X", (DD & 0x000000FF), (DD & 0x0000FF00) >> 8, (DD & 0x00FF0000) >> 16, (DD & 0xFF000000) >> 24); printf("\n"); return 0;}。