曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5149|回复: 0
打印 上一主题 下一主题

[字符串] sha1 -- 生成 sha1 散列值

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2012-9-25 22:47:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SHA 是 Secure Hash Algorithm (安全散列算法) 的缩写,它用来产生 20 个字节 (160位) 的散列值,该算法常用于数字签名,以防止数据遭到篡改。

这里介绍 openssl 提供 API 计算数据的 SHA1 值。实际上,该 API 有两套,这里只给出最简单的函数,即  SHA1(),其原型如下:
[C++] 纯文本查看 复制代码
#include <openssl/sha.h>
 
         unsigned char *SHA1(const unsigned char *d, unsigned long n,
                          unsigned char *md);

函数中的第 1 个参数 d 表示要处理的数据;第 2 个参数 n 表示该数据的长度;第 3 个参数 md 表示计算出的 sha 值的存放地方,如果为 NULL,那么系统会安排一个静态缓冲区对其存储。

测试代码:
[C++] 纯文本查看 复制代码
#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <openssl/sha.h>
 
 #define SHA1LEN SHA_DIGEST_LENGTH
 
 static const char hex_chars[] = "0123456789abcdef";
  
 void convert_hex(unsigned char *md, unsigned char *mdstr)
 {
     int i;
     int j = 0;
     unsigned int c;
  
     for (i = 0; i < 20; i++) {
         c = (md[i] >> 4) & 0x0f;
         mdstr[j++] = hex_chars[c];
         mdstr[j++] = hex_chars[md[i] & 0x0f];
     }
     mdstr[40] = '\0';
 }
 
 int main(int argc, char **argv)
 {
     if (argc != 2) {
        fprintf (stderr, "usage: %s your-string\n", argv[0]);
        exit (EXIT_FAILURE);
     }
     
     char md[SHA_DIGEST_LENGTH];
     char mdstr[40];
 
     bzero(md, SHA_DIGEST_LENGTH);
     bzero(mdstr, 40);
     
     SHA1(argv[1], strlen(argv[1]), md);
 
     convert_hex(md, mdstr);
 
     printf ("Result of SHA1 : %s\n", mdstr);
 
     return 0;
 }

运行输出:
beyes:/home/beyes/c/openssl # ./sha1 groad.net
Result of SHA1 : f6f80b59f1b25c82b64d857594fee53cd0df3604
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 11:19 , Processed in 0.059462 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表