歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> 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 64

int main()
{
        EVP_CIPHER_CTX ctx;
        unsigned char key[EVP_MAX_KEY_LENGHT] = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0\x61\x1b\xbb\x3e\x20\x25\xa4\x5a";
        unsigned char iv[EVP_MAX_KEY_LENGHT] = "\x56\x2e\x17\x99\x6d\x09\x3d\x28\xdd\xb3\xba\x69\x5a\x2e\x6f\x58";
        unsigned char out[1024] = {0};
        int outl, tmp, i;
        unsigned char msg[1024] = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f";
   
        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 :-----------\n");
        for(i = 0; i < DATA_LEN; i++)
                printf("%02x ", out[i]);
        printf("\r\n");
        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 b1

OpenSSL 的詳細介紹:請點這裡
OpenSSL 的下載地址:請點這裡

推薦閱讀:

通過OpenSSL提供FTP+SSL/TLS認證功能,並實現安全數據傳輸 http://www.linuxidc.com/Linux/2013-05/84986.htm

Copyright © Linux教程網 All Rights Reserved