zoukankan      html  css  js  c++  java
  • 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. 解密过程和加密类似,只是函数名字稍有区别,不再赘述。


  • 相关阅读:
    poj 3280 Cheapest Palindrome(区间DP)
    POJ 2392 Space Elevator(多重背包)
    HDU 1285 定比赛名次(拓扑排序)
    HDU 2680 Choose the best route(最短路)
    hdu 2899 Strange fuction (三分)
    HDU 4540 威威猫系列故事――打地鼠(DP)
    HDU 3485 Count 101(递推)
    POJ 1315 Don't Get Rooked(dfs)
    脱离eclipse,手动写一个servlet
    解析xml,几种方式
  • 原文地址:https://www.cnblogs.com/xt2357/p/4022813.html
Copyright © 2011-2022 走看看