MD5和CRC

MD5和CRC都是某种信息摘要算法。

MD5能够生成一段信息(可以很大如视频文件,也可以很小如密码)的信息摘要(126bits,16Bytes)。这个信息摘要相当于这段信息的数字签名,能够防止这段信息被篡改。

CRC生成的信息摘要长度4bytes,且对源信息的大小有限制(小于4GBytes)。

CRC (Cyclic Redundancy Check)循环冗余校验码

http://blog.csdn.net/liyuanbhu/article/details/7882789

CRC校验核心是指定一个除数,实现无借位的除法运算,并将余数作为校验码。所谓无借位的除法指的是正常的除法,但加减法采用模2运算(异或)。

MD5库下载地址http://download.csdn.net/detail/huang_yx005/9724535

/* Md5 number length */
#define SMART_MD5NUMBER_SIZE                    16

// 计算从首地址为memory,大小为memorysize的一段信息的MD5值,结果存放在md5number中
static int calc_md5number(const char *memory, uint memorysize, uchar *md5number) {
  if (NULL == memory || NULL == md5number || memorysize == 0)
    return 0;
  /* Do md5 purity versification */
  MD5_CTX mdcontext;
  MD5Init(&mdcontext);
  MD5Update(&mdcontext, (uchar *)memory, memorysize);
  MD5Final(&mdcontext);
  memcpy(md5number, mdcontext.digest, SMART_MD5NUMBER_SIZE);
  return 1;
}

// 比较两个md5值是否相等
static int equal_md5number(uchar *md51, uchar *md52) {
  uint i = 0;
  if (NULL == md51 || NULL == md52)
    return 0;
  while (i < SMART_MD5NUMBER_SIZE && md51[i] == md52[i])
    i++;
  return i == SMART_MD5NUMBER_SIZE;
}

// 另一个例子
int bytes;
unsigned char data[1024];
MD5_CTX tmp_mdContext;
MD5Init (&tmp_mdContext);
while ((bytes = fread (data, 1, 1024, fp_OutTmp)) != 0) // 从文件fp_OutTmp中读取1024字节数据到data中
{
	MD5Update(&tmp_mdContext, data, bytes); // 更新MD5值
	fwrite(data, sizeof(unsigned char), bytes, fp_Out); // 将data中数据写入fp_out
}
MD5Final (&tmp_mdContext);
// 写入校验码
fprintf(fp_Out, "md5\n");
fwrite(tmp_mdContext.digest, sizeof(unsigned char), 16, fp_Out);
// 写入版本号
fprintf(fp_Out, "ver\n");
fwrite(&version, sizeof(unsigned int), 1, fp_Out);

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值