Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 使用OpenSSL中的EVP通用加密算法接口

/*********************************************************************
 * Author  : Samson
 * Date    : 01/22/2014
 * Test platform:
 *              3.6.10-4.fc18.i686.PAE
 *              GNU bash, version 4.2.39
 * *******************************************************************/此测试例子是使用的openssl库中提供的EVP系列函数对数据进行加密的一个测试,选择的算法为:AES128,加密模式为:CBC,此加密算法模式下需要的参数为:16字节的加密key,16字节的IV(初始化向量),数据的长度根据需要对宏DATA_LEN进行修改。若是要选择其它的算法,请自己man一下相关的函数接口是否存在。例如要使用的算法为AES192 CBC的算法的话,那么在下面加红的那句中把    rv = EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(),NULL, key, iv); 中的EVP_aes_128_cbc修改为EVP_aes_192_cbc,但是对应的参数也要进行相应长度的值的输入,EVP_aes_192_cbc算法的加密key的长度应该为24字节,IV的长度还是16字节,这个具体算法要根据具体算法进行参数的输入,进行举一反三。#include <stdio.h>#include <string.h>
#include <errno.h>
#include <resolv.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/x509.h>#define DATA_LEN 32
#define EVP_MAX_KEY_LENGHT 64int 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";
   
        int rv;
        OpenSSL_add_all_algorithms();
        EVP_CIPHER_CTX_init(&ctx);
   
        rv = EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(),NULL, key, iv);
        if(rv != 1)
        { 
                printf("Error");
                return -1;
        } 
        outl = 0;
        rv = EVP_EncryptUpdate(&ctx, out, &outl, msg, DATA_LEN);
        if(rv != 1)
        { 
                printf("Error");
                return -1;
        } 
        rv = EVP_EncryptFinal_ex(&ctx, out + outl, &tmp);
        outl = outl + tmp;   
    printf("----cipher_algo is AES128 cipher_mode is CBC  enc outdata is :----------- ");
        for(i = 0; i < DATA_LEN; i++)
                printf("%02x ", out[i]);
        printf(" ");
        return 0;
}编译:[ufo@localhost fuck]$ gcc testenc_evp.c -Wall -g -lssl -lcrypto -o testenc测试结果
[ufo@localhost fuck]$ ./testenc
----cipher_algo is AES128 cipher_mode is CBC  enc outdata is :-----------
d2 96 cd 94 c2 cc cf 8a 3a 86 30 28 b5 e1 dc 0a 75 86 60 2d 25 3c ff f9 1b 82 66 be a6 d6 1a b1OpenSSL 的详细介绍:请点这里
OpenSSL 的下载地址:请点这里推荐阅读:通过OpenSSL提供FTP+SSL/TLS认证功能,并实现安全数据传输 http://www.linuxidc.com/Linux/2013-05/84986.htm