代码改变世界

EVP_DigestInit(3)源码解析

2012-11-20 19:16  Rudrj2  阅读(3408)  评论(0编辑  收藏  举报

由于今天做密码学实验需要去验证HASH函数的单向属性和抗碰撞属性,设计了一个用暴力破解的方法来查看使用多长时间来打破这两种属性,需要编写C函数来调用openssl库函数中的digest方法,查看EVP_DigestInit得到启发。以下是EVP_DigestInit(3)的源码解析:

 1 本例子是openssl帮助文档提供的。该例子根据命令行输入的信息摘要算法名字对"Test Message\n""Hello World\n"字符串进行信息摘要操作。
 2      #include <stdio.h>
 3      #include <openssl/evp.h>
 4      main(int argc, char *argv[])
 5      {
 6      EVP_MD_CTX mdctx;
 7      const EVP_MD *md;
 8      char mess1[] = "Test Message\n";
 9      char mess2[] = "Hello World\n";
10      unsigned char md_value[EVP_MAX_MD_SIZE];
11      int md_len, i;
12      //使EVP_Digest系列函数支持所有有效的信息摘要算法
13      OpenSSL_add_all_digests();
14      if(!argv[1]) {
15      printf("Usage: mdtest digestname\n");
16      exit(1);
17      }
18      //根据输入的信息摘要函数的名字得到相应的EVP_MD算法结构
19      md = EVP_get_digestbyname(argv[1]);
20      if(!md) {
21      printf("Unknown message digest %s\n", argv[1]);
22      exit(1);
23      }
24      //初始化信息摘要结构mdctx,这在调用EVP_DigestInit_ex函数的时候是必须的。
25 
26      EVP_MD_CTX_init(&mdctx);
27      //使用md的算法结构设置mdctx结构,impl为NULL,即使用缺省实现的算法(openssl本身提供的信息摘要算法)
28      EVP_DigestInit_ex(&mdctx, md, NULL);
29      //开始真正进行信息摘要运算,可以多次调用该函数,处理更多的数据,这里只调用了两次
30      EVP_DigestUpdate(&mdctx, mess1, strlen(mess1));
31      EVP_DigestUpdate(&mdctx, mess2, strlen(mess2));
32      //完成信息摘要计算过程,将完成的摘要信息存储在md_value里面,长度信息存储在md_len里面
33      EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
34      //使用该函数释放mdctx占用的资源,如果使用_ex系列函数,这是必须调用的。
35      EVP_MD_CTX_cleanup(&mdctx);
36      printf("Digest is: ");
37      for(i = 0; i < md_len; i++) printf("%02x", md_value[i]);
38      printf("\n");
39      }