openssl - EVP之对称加密篇



该部分主要用到了EVP_CIPHER和EVP_CIPHER_CTX两个数据结构。其中,EVP_CIPHER包含了用到的加密算法标识、
密钥长度、IV长度和算法的函数指针等信息;EVP_CIPHER_CTX则包含了一个EVP_CIPHER指针、使用的ENGINE以及
需要操作的数据等信息。

用到的主要函数则包括以下一些(如果返回值为int类型,则返回1表示成功,返回0表示失败):
// 初始化及释放相应数据结构

// 初始化EVP_CIPHER_CTX结构体
void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a);
// 清除EVP_CIPHER_CTX结构体
int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);

// 分配空间,并初始化EVP_CIPHER_CTX结构体
EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void);
// 释放EVP_CIPHER_CTX结构体
void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *a);

// 执行加密操作的函数

// 初始化一个加密操作
// enc为1表示加密,0表示解密,-1表示保持不变
int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx,
                      const EVP_CIPHER *cipher,
                      ENGINE *impl,
                      const unsigned char *key,
                      const unsigned char *iv,
                      int enc);

// 添加并加密
int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl);

// 完成块填充(经过测试,解密需要用EVP_CipherFinal,用EVP_CipherFinal_ex得不到正确的值,不知道什么原因。)
int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);
int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);

对于其他的辅助函数,也不再一一介绍。且看下面的例子。



#include <openssl/evp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv)
{
  EVP_CIPHER* evp_cipher = NULL;
  EVP_CIPHER_CTX evp_cipher_ctx;
  char buffer[1024];
  int len = 0;
  int i = 0;

  if (4 != argc)
  {
     printf("usage: cipher \n");
     exit(EXIT_FAILURE);
  }

  // 将加密函数添加到内部表
  OpenSSL_add_all_ciphers();

  // 根据名称获取加密算法,如AES-192-OFB等
  evp_cipher = EVP_get_cipherbyname(argv[1]);
  if (NULL == evp_cipher)
  {
     printf("no such algorithm: %s\n", argv[1]);
     exit(EXIT_FAILURE);
  }

   // 初始化加密上下文
   EVP_CIPHER_CTX_init(&evp_cipher_ctx);

   // 初始化加密算法
   if (0 == EVP_CipherInit_ex(&evp_cipher_ctx, evp_cipher, NULL, argv[2], NULL, 1))
   {
       printf("EVP_CipherInit_ex() failed!\n");
       exit(EXIT_FAILURE);
   }

   // 加密
   if (0 == EVP_CipherUpdate(&evp_cipher_ctx, buffer, &len, argv[3], strlen(argv[3])))
   {
       printf("EVP_CipherUpdate() failed!\n");
       exit(EXIT_FAILURE);
    }

   //这边还需要EVP_CipherFinal_ex,原作者忽视了.可以参考我的另外一篇<< 利用OpenSSL中EVP封装调用对称加密算法的通用代码>>
   // 显示加密结果
   // int nLastBufLen = 0;
   // EVP_CipherFinal(&evp_cipher_ctx,buffer+len,&nLastBufLen);
   // len += nLastBufLen;


   // 清除加密上下文
   EVP_CIPHER_CTX_cleanup(&evp_cipher_ctx);

    EVP_cleanup();

    return EXIT_SUCCESS;
}


你可能感兴趣的:(openssl - EVP之对称加密篇)