zoukankan      html  css  js  c++  java
  • 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("
    ", stderr);
    }

    参考:

    测试使用 openssl 1.1.0c 

      

      

  • 相关阅读:
    super返回不过来
    对象与内存控制
    java数组学习
    careercup-递归和动态规划 9.8
    careercup-递归和动态规划 9.7
    careercup-递归和动态规划 9.6
    careercup-递归和动态规划 9.5
    careercup-递归和动态规划 9.4
    careercup-递归和动态规划 9.3
    careercup-递归和动态规划 9.2
  • 原文地址:https://www.cnblogs.com/cocoajin/p/6119832.html
Copyright © 2011-2022 走看看