C++ 技术中心

   :: 首页 :: 联系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

郑重声明:本BLOG所发表的原创文章,作者保留一切权利。必须经过作者本人同意后方可转载,并注名作者(天空)和出处(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新随笔

最新评论

评论排行榜

方法一:
#include<stdio.h>
#include<openssl/md5.h>
#include<string.h>

int main( int argc, char **argv )
{
MD5_CTX ctx;
unsigned char *data="123";
unsigned char md[16];
char buf[33]={'\0'};
char tmp[3]={'\0'};
int i;

MD5_Init(&ctx);
MD5_Update(&ctx,data,strlen(data));
MD5_Final(md,&ctx);

for( i=0; i<16; i++ ){
sprintf(tmp,"%02X",md[i]);
strcat(buf,tmp);
}
printf("%s\n",buf);
return 0;
}

输出:
202CB962AC59075B964B07152D234B70

方法二:
#include<stdio.h>
#include<openssl/md5.h>
#include<string.h>

int main( int argc, char **argv )
{
unsigned char *data = "123";
unsigned char md[16];
int i;
char tmp[3]={'\0'},buf[33]={'\0'};
MD5(data,strlen(data),md);
for (i = 0; i < 16; i++){
sprintf(tmp,"%2.2x",md[i]);
strcat(buf,tmp);
}
printf("%s\n",buf);
return 0;
}
输出:
202cb962ac59075b964b07152d234b70

总结:
两种实现方式,一样的结果。相比较,第二种方法更直观简单些。
遇到的问题:
1.sprintf时的格式,%02X和%2.2格式是一样的,强制输出两位,比如十进制的8,十六进制也是8,这个格式是控制输出两位,08。如果加密结果要小写字母显示,就是"%2.2x",大写就是"2.2X"。
2.一定要使用unsigned char,虽然是char,其实就是个int,当然,它只有一个字节,和char的区别是,unsigned char 0~255 ,char -127~127。使用char会出问题。这个md5加密函数,返回16个十进制数,范围在0~255间,把它format为十六进制就是32为md5编码了。
3.gcc编译的时候,后面加上参数 -lcrypto 如果系统没有安装libcrypto,是不能用这个方法的。

如果不想使用openssl库函数,前面我的文章里有md5加密的源码,可以直接使用。
posted on 2013-08-09 11:24 C++技术中心 阅读(8139) 评论(0)  编辑 收藏 引用 所属分类: Linux 编程

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理