
尝试了在Internet上找到的md5函数的实现,可以使用它,并对其进行了一些修改. 它支持16位和32位加密代码的输出并进行记录. 由三个文件组成,顺序如下:
头文件TL_MD5.h
[cpp]
#ifndefMD5_H#defineMD5_Htypedefstruct {unsignedintcount [2]; unsignedintstate [4]; unsignedcharbuffer [64];} MD5_CTX; #defineF(x,y,z)((x&y)|(〜x&z))#defineG(x,y,z)((x&z)|(y&〜z))#defineH(x ,y,z)(x ^ y ^ z)#defineI(x,y,z)(y ^(x |〜z))#defineROTATE_LEFT(x,n)((x << n)|(x >> (32-n)))#defineFF(a,b,c,d,x,s,ac)\ {\ a + = F(b,c,d)+ x + ac; \ a = ROTATE_LEFT(a,s); \ a + = b; \}#defineGG(a,b,c,d,x,s,ac)\ {\ a + = G(b,c,d)+ x + ac; \ a = ROTATE_LEFT(a,s); \ a + = b; \}#defineHH(a,b,c,d,x,s,ac)\ {\ a + = H(b,c,d)+ x + ac; \ a = ROTATE_LEFT(a,s); \ a + = b; \}#defineII(a,b,c,d,x,s,ac)\ {\ a + = I(b,c,d)+ x + ac; \ a = ROTATE_LEFT(a,s); \ a + = b; \} voidMD5Init(MD5_CTX *上下文); voidMD5Update(MD5_CTX *上下文,unsignedchar * input,unsignedintinputlen); void MD5Final(MD5_CTX *上下文,未签名字符摘要[16]); voidMD5Transform(unsignedintstate [4],unsignedcharblock [64]); voidMD5Encode(unsignedchar *输出,unsignedint *输入,unsignedintlen); voidMD5Decode(unsignedint *输出,unsignedchar *输入,unsignedintlen); #endif
C / C ++语言实现文件TL_MD5.c或TL_MD5.cpp

[cpp]
#include <字符串. h> #include“ md5.h” unsignedcharPADDING [] = {0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; void MD5Init(MD5_CTX * context){context-> count [0] = 0; context-> count [1] = 0; context->状态[0] = 0x67452301; context-> state [1] = 0xEFCDAB89;上下文->状态[2] = 0x98BADCFE; context-> state [3] = 0x10325476;} voidMD5Update(MD5_CTX *上下文,unsignedchar *输入,unsignedintinputlen){unsignedinti = 0,索引= 0,partlen = 0;索引=(上下文->计数[0] >> 3)&0x3F; partlen = 64指数; context-> count [0] + = inputlen << 3; if(context->计数[0] <(inputlen << 3))context->计数[1] ++;上下文->计数[1] + = inputlen >> 29; if(inputlen> = partlen){memcpy(&上下文->缓冲区[index],输入,partlen); MD5Transform(上下文->状态,上下文->缓冲区); for(i = partlen; i + 64 <= inputlen; i + = 64)MD5Transform(上下文->状态,&输入[i]); index = 0;} else {i = 0;} memcpy(&context-> buffer [index],&input [i],inputlen-i);} voidMD5Final(MD5_CTX * context,unsignedchardigest [16]){unsignedintindex = 0 ,padlen = 0; unsignedcharbits [8]; index =(context-> count [0] >> 3)&0x3F; padlen =(索引<56)? (56指数):( 120指数); MD5Encode(bits,context-> count,8); MD5Update(上下文,PADDING,padlen); MD5Update(上下文,位,8); MD5Encode(摘要,上下文->状态,16);} voidMD5Encode(unsignedchar *输出,unsignedint *输入,unsignedintlen)(unsignedinti = 0,j = 0;而(j
md5功能测试代码文件
[cpp]
#include#include#include#include“ md5.h” intmain(intargc,char * argv []){MD5_CTXmd5; MD5Init(&md5);英蒂unsignedcharencrypt [] =“ admin”; // 21232f297a57a5a743894a0e4a801fc3unsignedchardecrypt [16; MD5Update(&md5,加密,strlen((char *)加密)); MD5Final(&md5,解密); printf(“加密前: %s \ n16位,加密后: ”,加密);对于(i = 4; i <12; i ++){printf(“ 02x”,解密[i]); // 02x需要添加%} printf(“ \ n加密前: %s \ n加密后n32位: ”,加密);对于(i = 0; i <16; i ++){printf(“ 02x”,解密[i]); // 02x需要添加%} getchar(); return0;}

MD5加密常用字符
7a57a5a743894a0eadmin(16位MD5小写加密)
972130B75066C825ADMIN(16位MD5大写加密)
21232f297a57a5a743894a0e4a801fc3admin(32位MD5小写加密)
73ACD9A5972130B75066C82595A1FAE3ADMIN(32位MD5大写加密)

49ba59abbe56e057123456(16位MD5小写加密)
e10adc3949ba59abbe56e057f20f883e123456(32位MD5小写加密)
469e80d32c0559f8admin888(16位MD5小写加密)
2299413865C28A35ADMIN888(16位MD5大写加密)
7fef6171469e80d32c0559f88b377245admin888(32位MD5小写加密)

A1F63A962299413865C28A3593D359B0ADMIN888(32位MD5大写加密)
md5知识素养
MD5: 是一种特定的算法,是散列算法,散列算法,但非加密算法(因为没有密钥),可以用于加密(不可逆)
MD5是单向哈希函数. 单向散列函数的功能是将任意长度的数据散列为固定长度. 通常用于生成消息认证码等,可以与非对称算法一起用于数字签名.
参见标准
MD5似乎被中国一位教授破解了. 顺便说一下,我给你个地址. 有时应该很方便. : )
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-190562-1.html
面子上都过得去
但利用军事手段还是应该做为最后的选择
只是对于大多数人而言