Chinaunix首页 | 论坛 | 博客
  • 博客访问: 431239
  • 博文数量: 83
  • 博客积分: 2622
  • 博客等级: 少校
  • 技术积分: 1345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 08:59
个人简介

一直在努力

文章分类

全部博文(83)

文章存档

2014年(3)

2013年(9)

2012年(46)

2010年(25)

分类: LINUX

2012-09-11 22:48:54

SHA1散列函数是很常用的散列函数,它产生160bit(20字节)长度的散列值。

今天,我就来介绍利用OpenSSL现成的API来计算数据的SHA1散列值。

先来看OpenSSL的相关API声明:

 

  1. #include   
  2.  unsigned char *SHA1(const unsigned char *d, unsigned long n,  
  3.                   unsigned char *md);  
  4.  int SHA1_Init(SHA_CTX *c);  
  5.  int SHA1_Update(SHA_CTX *c, const void *data,  
  6.                   unsigned long len);  
  7.  int SHA1_Final(unsigned char *md, SHA_CTX *c); 

这里有2个(套)API可以来计算数据的SHA1散列值。

最先的SHA1函数很直白,参数d是数据块的起始地址,n是数据块的长度,计算的散列值存储在参数md指向的内存中。如果md为NULL,那么SHA1函数会把计算得到的散列值存储在函数内部的静态空间内,然后通过函数返回值返回给我们。刚才我们说过SHA1散列值的长度为20字节,所以md至少需要拥有20字节的空间大小。当然,OpenSSL已经为我们定义了常量SHA_DIGEST_LENGTH。

 

对于第二套API,我们看到由3个函数组成。粗粗一看,有些看客会觉得3个函数不就是完成SHA1函数的功能吗?为什么要搞3个函数来啊?呵呵,OpenSSL显然是有充分的理由来这么做的。这么做的关键是SHA1_Update这个函数可以被调用多次,这些待计算散列值的数据会被叠加,最终产生一个散列值。也许有人现在还没想到它的使用场景,我下面来举个例子点破。

 

比如一个文件大小为6GB,我们知道32位程序无法访问大于4GB的内存空间(其实程序员可以操作的最多也就3GB,程序/数据/栈/保护区等会占用1GB左右的空间),这时如何计算这个文件的散列值?SHA1肯定是不行的了。这时我们可以分N次来读这个文件,每次读1MB的数据,然后调用SHA1_Update函数来累计计算散列值,读完文件的所有数据后,我们再调用SHA1_Final函数来得到最终的散列值。

 

怎么样?简单吧,贪多嚼不烂,今天就到这里

阅读(4300) | 评论(1) | 转发(1) |
0

上一篇:linux md5认证

下一篇:C++ 多线程编程总结

给主人留下些什么吧!~~

llyandong2014-09-04 10:33:16

不知道博主最近还在研究openssl的摘要算法不,想请教一下博主。
文章中所指的两套sha1的摘要算法,其实第一套的实现是第二套的种三个函数的依次调用吧。
我是想知道int SHA1_Final(unsigned char *md, SHA_CTX *c);这个函数在openssl中的具体实现,看看到底对md和c这两个参数进行了什么操作。
本人现在研究替换openssl引擎中的各种算法,在写到这里的时候遇到困难了,望博主能指导。