openssl evp 哈希算法(md5,sha1,sha256)


1. 簡述

openssl提供了豐富密碼學工具,一些常用的哈希算法

比如md5,sha 可以直接用提供的md5.h ,sha.h 接口使用;

為了方便開發者使用,openssl 又提供了一個EVP, evp.h 該文件中提供各種常用工具;

man evp 可以得知,evp 是openssl 提供的更高一級的密碼學工具,

可以理解為對提供的各種接口的一個封裝

EVP文件包含的比較多,本次主要說明EVP提供的哈希算法

2. 示例 sha512代碼

   使用需要導入evp.h

    //初始化
   EVP_MD_CTX *evpCtx = EVP_MD_CTX_new(); EVP_DigestInit_ex(evpCtx, EVP_sha512(), NULL); char *data = (char *)"hello"; unsigned int len = strlen(data);
  //hash計算 EVP_DigestUpdate(evpCtx, data , len); unsigned
char result[SHA512_DIGEST_LENGTH] = {0};
  //返回結果 EVP_DigestFinal_ex(evpCtx, result,
&len); hex_print("sha512", result, SHA512_DIGEST_LENGTH);
  //直接使用一個函數 unsigned
char resultT[SHA512_DIGEST_LENGTH] = {0}; EVP_Digest("hello", 5, resultT, NULL, EVP_sha512(), NULL); hex_print("sha512", resultT, SHA512_DIGEST_LENGTH);

  上述測試EVP提供的兩種方式來進行sha512

 3. 根據evp.h提供的內部可知:

   上述使用的是EVP_512();那么其他的還有:

const EVP_MD *EVP_md2(void);
const EVP_MD *EVP_md4(void);
const EVP_MD *EVP_md5(void);
const EVP_MD *EVP_md5_sha1(void);
const EVP_MD *EVP_blake2b512(void);
const EVP_MD *EVP_blake2s256(void);
const EVP_MD *EVP_sha1(void);
const EVP_MD *EVP_sha224(void);
const EVP_MD *EVP_sha256(void);
const EVP_MD *EVP_sha384(void);
const EVP_MD *EVP_sha512(void);

 定義的hash算法的計算長度  

# define SHA224_DIGEST_LENGTH    28
# define SHA256_DIGEST_LENGTH    32
# define SHA384_DIGEST_LENGTH    48
# define SHA512_DIGEST_LENGTH    64

4. 如果不用EVP提供的,還可以直接使用openssl提供的其他接口

   md5.h, sha.h

   如sha.h 中關於 sha512提供的接口

int SHA384_Init(SHA512_CTX *c);
int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA384_Final(unsigned char *md, SHA512_CTX *c);
unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md);
int SHA512_Init(SHA512_CTX *c);
int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA512_Final(unsigned char *md, SHA512_CTX *c);
unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md);

 調用的時候同樣有兩種方式;如下示例

    //初始化
    SHA512_CTX ctx;
    SHA512_Init(&ctx);
    char *data = (char *)"hello";
    unsigned int len = strlen(data);
    unsigned char result[SHA512_DIGEST_LENGTH] = {0};
    //計算哈希
    SHA512_Update(&ctx, data, len);
    //取結果
    SHA512_Final(result, &ctx);
    hex_print("sha512", result, SHA512_DIGEST_LENGTH);
    
    
    //一個函數調用
    unsigned char resultT[SHA512_DIGEST_LENGTH] = {0};
    SHA512("hello", 5, resultT);
    hex_print("sha512", resultT, SHA512_DIGEST_LENGTH);

5. 最后附上,上述例子中的hex_print代碼

static void hex_print(const char *name, const unsigned char *buf, size_t len)
{
    size_t i;
    fprintf(stderr, "%s ", name);
    for (i = 0; i < len; i++)
        fprintf(stderr, "%02X", buf[i]);
    fputs("\n", stderr);
}

 

參考:

測試使用 openssl 1.1.0c 

  

 

  


免責聲明!

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



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