• OpenSSL中HMAC,MD5以及对称加密算法的应用


    HMAC和MD5:

    1. HMAC的使用:
      #include <openssl/hmac.h>
      unsigned char *HMAC(const EVP_MD *evp_md, const void *key,
                     int key_len, const unsigned char *d, int n,
                     unsigned char *md, unsigned int *md_len);
      其中第一个参数指定HMAC中所使用的具体的散列算法,在这里我们使用sha1(输出是160bit),因此在调用时第一个参数应为EVP_sha1()。key和key_len顾名思义分别是密钥存储的首地址和密钥的字节数目。d和n分别指定了被散列的数据的起始地址和字节数目。md表示散列后的结果存放的目标地址,md_len指向的int被用来记录md的字节数目(在这里是160bit即20个字节)。
    2. MD5的使用:
      #include <openssl/md5.h>
      unsigned char *MD5(const unsigned char *d, unsigned long n,
                        unsigned char *md);
      
      d和n分别指定了被散列的数据的起始地址和字节数目。md存放散列结果(128bit即16个字节)。

    对称加密算法的使用(EVP通用加密接口):

    1. 函数原型说明见http://www.openssl.org/docs/crypto/EVP_EncryptInit.html#
    2. 示例代码:
      #include <stdio.h>
      #include <openssl/evp.h>
      
      #define DATA_LEN 32
      #define EVP_MAX_KEY_LENGHT 64
      
      int main()
      {
              EVP_CIPHER_CTX ctx;
              unsigned char key[EVP_MAX_KEY_LENGHT] = "xc2x86x69x6dx88x7cx9axa0x61x1bxbbx3ex20x25xa4x5a";
              unsigned char iv[EVP_MAX_KEY_LENGHT] = "x56x2ex17x99x6dx09x3dx28xddxb3xbax69x5ax2ex6fx58";
              unsigned char out[1024] = {0};
              int outl, tmp, i;
              unsigned char msg[1024] = "x00x01x02x03x04x05x06x07x08x09x0ax0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1f";
              //初始化加密上下文
              EVP_CIPHER_CTX_init(&ctx);
              //第二个参数选择了密钥长度为128bit的aes加密算法(cbc模式)第三个参数意义不明一般置为NULL,后面两个参数分别是密钥首地址和初始向量首地址
              EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(),NULL, key, iv);
              //outl存放被加密后的数据的字节数
              outl = 0;
              //out存放加密后的数据,outl存放加密后数据字节数,msg是被加密数据的首地址,DATA_LEN是被加密数据的长度
              EVP_EncryptUpdate(&ctx, out, &outl, msg, DATA_LEN);
              //加密算法默认会进行block padding 但是如果输入刚好是blocksize的整数倍则不需要进行final操作,这里aes的blocksize为16字节,所以输入有2块
              //EVP_EncryptFinal_ex(&ctx, out + outl, &tmp);
              //outl = outl + tmp;  
              //清理加密上下文
              EVP_CIPHER_CTX_cleanup(&ctx);
              //显示数据
              for(i = 0; i < DATA_LEN; i++)
                      printf("%02x ", out[i]);
              return 0;
      }
    3. 解密过程和加密类似,只是函数名字稍有区别,不再赘述。


  • 相关阅读:
    Redis Hashes 巧用sort排序
    Redis 压缩存储的配置
    计算
    关于时间大小判断的坑和网上工具类的看法
    Mysql中字段类型之时间戳大坑2
    Mysql中字段类型之时间戳大坑
    Spring和springmvc父子容器注解扫描问题详解
    JXL导出Excel工具类
    Maven学习
    MySQL之账户管理
  • 原文地址:https://www.cnblogs.com/xt2357/p/4022813.html
Copyright © 2020-2023  润新知