openssl之EVP系列之9---EVP_Digest系列函数的一个样例

    ---依据openssl doc/crypto/EVP_DigestInit.pod翻译

    (作者:DragonKing, Mail: [email protected] ,公布于:http://openssl.126.com 之openssl专业论坛,版本号:openssl-0.9.7)

    本样例是openssl帮助文档提供的。该样例依据命令行输入的信息摘要算法名字对"Test Message/n"和"Hello World/n"字符串进行信息摘要操作。

     #include <stdio.h>

     #include <openssl/evp.h>

    

     main(int argc, char *argv[])

     {

     EVP_MD_CTX mdctx;

     const EVP_MD *md;

     char mess1[] = "Test Message/n";

     char mess2[] = "Hello World/n";

     unsigned char md_value[EVP_MAX_MD_SIZE];

     int md_len, i;

     //使EVP_Digest系列函数支持全部有效的信息摘要算法

     OpenSSL_add_all_digests();

    

     if(!argv[1]) {

     printf("Usage: mdtest digestname/n");

     exit(1);

     }

     //依据输入的信息摘要函数的名字得到对应的EVP_MD算法结构

     md = EVP_get_digestbyname(argv[1]);

    

     if(!md) {

     printf("Unknown message digest %s/n", argv[1]);

     exit(1);

     }

     //初始化信息摘要结构mdctx。这在调用EVP_DigestInit_ex函数的时候是必须的。

     EVP_MD_CTX_init(&mdctx);

     //使用md的算法结构设置mdctx结构,impl为NULL,即使用缺省实现的算法(openssl本身提供的信息摘要算法)

     EVP_DigestInit_ex(&mdctx, md, NULL);

     //開始真正进行信息摘要运算,能够多次调用该函数。处理很多其它的数据,这里仅仅调用了两次

     EVP_DigestUpdate(&mdctx, mess1, strlen(mess1));

     EVP_DigestUpdate(&mdctx, mess2, strlen(mess2));

     //完毕信息摘要计算过程,将完毕的摘要信息存储在md_value里面,长度信息存储在md_len里面

     EVP_DigestFinal_ex(&mdctx, md_value, &md_len);

     //使用该函数释放mdctx占用的资源,假设使用_ex系列函数,这是必须调用的。

     EVP_MD_CTX_cleanup(&mdctx);

    

     printf("Digest is: ");

     for(i = 0; i < md_len; i++) printf("%02x", md_value[i]);

     printf("/n");

     }

05-02 18:14