openssl之EVP系列之9---EVP_Digest系列函數的一個樣例


openssl之EVP系列之9---EVP_Digest系列函數的一個樣例
    ---依據openssl doc/crypto/EVP_DigestInit.pod翻譯
    (作者:DragonKing, Mail: wzhah@263.net ,公布於: 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");
     }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM