1.求用c语言实现md5算法的编程思路
主要就是调用库函数 MD5加密说到底也是函数计算 没有什么思路的问题,了解md5的发明算法,这应该是一个数学问题 我这里有代码,你可以参考一下 #include
2.为什么c和c++基础库都不自带md5算法
因为MD5可以自己实现。
理解并不是很难。下面是MD5的一个C语言实现:---------------------------------------------md5.h#ifndef MD5_H#define MD5_Htypedef struct{ unsigned int count[2]; unsigned int state[4]; unsigned char buffer[64]; }MD5_CTX;#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 ROTATE_LEFT(x,n) ((x > (32-n)))#define FF(a,b,c,d,x,s,ac) \{ \ a += F(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \}#define GG(a,b,c,d,x,s,ac) \{ \ a += G(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \}#define HH(a,b,c,d,x,s,ac) \{ \ a += H(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \}#define II(a,b,c,d,x,s,ac) \{ \ a += I(b,c,d) + x + ac; \ a = ROTATE_LEFT(a,s); \ a += b; \} void MD5Init(MD5_CTX *context);void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);void MD5Final(MD5_CTX *context,unsigned char digest[16]);void MD5Transform(unsigned int state[4],unsigned char block[64]);void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len);void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len);#endifmd5.cpp#include #include "md5.h"unsigned char PADDING[]={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};void MD5Init(MD5_CTX *context){ context->count[0] = 0; context->count[1] = 0; context->state[0] = 0x67452301; context->state[1] = 0xEFCDAB89; context->state[2] = 0x98BADCFE; context->state[3] = 0x10325476;}void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen){ unsigned int i = 0,index = 0,partlen = 0; index = (context->count[0] >> 3) & 0x3F; partlen = 64 - index; context->count[0] += inputlen count[0] count[1]++; context->count[1] += inputlen >> 29; if(inputlen >= partlen) { memcpy(&context->buffer[index],input,partlen); MD5Transform(context->state,context->buffer); for(i = partlen;i+64 state,&input[i]); index = 0; } else { i = 0; } memcpy(&context->buffer[index],&input[i],inputlen-i);}void MD5Final(MD5_CTX *context,unsigned char digest[16]){ unsigned int index = 0,padlen = 0; unsigned char bits[8]; index = (context->count[0] >> 3) & 0x3F; padlen = (index count,8); MD5Update(context,PADDING,padlen); MD5Update(context,bits,8); MD5Encode(digest,context->state,16);}void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len){ unsigned int i = 0,j = 0; while(j > 8) & 0xFF; output[j+2] = (input[i] >> 16) & 0xFF; output[j+3] = (input[i] >> 24) & 0xFF; i++; j+=4; }}void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len){ unsigned int i = 0,j = 0; while(j #include #include #include#include#include "md5.h"int main(){ MD5_CTX md5; MD5Init(&md5); int i; unsigned char encrypt[1000]; printf("请输入要加密的字符串:"); //scanf("%s",encrypt); char *p=(char *)encrypt; gets(p); unsigned char decrypt[16]; MD5Update(&md5,encrypt,strlen((char *)encrypt)); MD5Final(&md5,decrypt); printf("\n加密后:"); for(i=0;i 评论0 0 0。
3.请教MD5算法 用C语言实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(__APPLE__)
# define COMMON_DIGEST_FOR_OPENSSL
# include <CommonCrypto/CommonDigest.h>
# define SHA1 CC_SHA1
#else
# include <openssl/md5.h>
#endif
// 这是我自己写的函数,用于计算MD5
// 参数 str:要转换的字符串
// 参数 lengthL: 字符串的长度 可以用 strlen(str) 直接获取参数str的长度
// 返回值:MD5字符串
char *str2md5(const char * str, int length) {
int n;
MD5_CTX c;
unsigned char digest[16];
char *out = (char*)malloc(33);
MD5_Init(&c);
while (length > 0) {
if (length > 512) {
MD5_Update(&c, str, 512);
} else {
MD5_Update(&c, str, length);
}
length -= 512;
str += 512;
}
MD5_Final(digest, &c);
for (n = 0; n < 16; ++n) {
snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int)digest[n]);
}
return out;
}
int main(int argc, char **argv) {
char *output = str2md5("hello", strlen("hello"));
printf("%s\n", output);
// 上面会输出 hello的MD5字符串:
//
free(output);
return 0;
}
4.C语言怎么这么难
入门不难的,以下是学C快速入门,本人原创。
常用C语言基础总结(60%以上代码),但是不写程序是永远入不了门的!
基础概念:数据类型--int,char运算符--加减乘除,赋值,判断表达式--数据类型 与 运算符的几种典型组合基础程序结构:顺序--普通程序选择--if/switch语句(可先熟悉if)循环--for/while/do while语句(可先熟悉for)(前面都会了之后)数组,函数,指针,结构体,位运算
推荐书籍:谭浩强《C程序设计》,凯尼格《C陷阱与缺陷》
5.MD5是如何编译的
MD5简介 MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。
Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数。请注意我使用了“字节串”而不是“字符串”这个词,是因为这种变换只与字节的值有关,与字符集或编码方式无关。
MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。 MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。
举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不“知道”用户的密码是什么。 一些黑客破获这种密码的方法是一种被称为“跑字典”的方法。
有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。 即使假设密码的最大长度为8,同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘组,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。
在很多电子商务和社区应用中,管理用户的Account是一种最常用的基本功能,尽管很多Application Server提供了这些基本组件,但很多应用开发者为了管理的更大的灵活性还是喜欢采用关系数据库来管理用户,懒惰的做法是用户的密码往往使用明文或简单的变换后直接保存在数据库中,因此这些用户的密码对软件开发者或系统管理员来说可以说毫无保密可言,本文的目的是介绍MD5的Java Bean的实现,同时给出用MD5来处理用户的Account密码的例子,这种方法使得管理员和程序设计者都无法看到用户的密码,尽管他们可以初始化它们。但重要的一点是对于用户密码设置习惯的保护。
有兴趣的读者可以从这里取得MD5也就是RFC 1321的文本。
www.xmd5.org
我有时去破解一些常用的密码,有一定的成功率
7.C语言怎么那么难学
哇!!你觉得C语言难学???
那你知道什么语言好学么??
我听说是VB,我没接触过,所以不知是不是好学。。
可我学过C,感觉一般般,不算难学啊!
我在学C++,哇草,难学的要命,与C相比,觉得难学三倍
如果你真的学不下去了,我只能告诉你,你没这方面的兴趣与天赋。
改学其他吧。
我告诉你一个秘密,学这些语言的秘密:
那就是 坚持与兴趣,将他变成你的兴趣。。
这就是高手的赠言。
转载请注明出处育才学习网 » c语言写md5怎么那么难