AEC加解密算法c语言实现

来源:互联网 发布:比基尼激光脱毛知乎 编辑:程序博客网 时间:2024/06/05 15:00

利用openssl对字符串进行AES加解密,代码如下
环境:需要在linux下搭建openssl开发环境。

#include <stdio.h>#include <openssl/aes.h>#include <stdlib.h>#include <string.h>int encrypt(char *input_string, char **encrypt_string){    AES_KEY aes;    unsigned char key[AES_BLOCK_SIZE];        // AES_BLOCK_SIZE = 16    unsigned char iv[AES_BLOCK_SIZE];        // init vector    unsigned int len;        // encrypt length (in multiple of AES_BLOCK_SIZE)    unsigned int i;    // set the encryption length    len = 0;    if ((strlen(input_string) + 1) % AES_BLOCK_SIZE == 0)     {        len = strlen(input_string) + 1;    }     else     {        len = ((strlen(input_string) + 1) / AES_BLOCK_SIZE + 1) * AES_BLOCK_SIZE;    }    // Generate AES 128-bit key    for (i=0; i<16; ++i) {        key[i] = 32 + i;    }    // Set encryption key    for (i=0; i<AES_BLOCK_SIZE; ++i) {        iv[i] = 0;    }    if (AES_set_encrypt_key(key, 128, &aes) < 0) {        fprintf(stderr, "Unable to set encryption key in AES\n");        exit(0);    }    // alloc encrypt_string    *encrypt_string = (char*)calloc(len, sizeof(unsigned char));        if (*encrypt_string == NULL) {        fprintf(stderr, "Unable to allocate memory for encrypt_string\n");        exit(-1);    }    // encrypt (iv will change)    AES_cbc_encrypt((unsigned char *)input_string, (unsigned char *)*encrypt_string, len, &aes, iv, AES_ENCRYPT);    return len;}void decrypt(char *encrypt_string, char **decrypt_string,int len){    unsigned char key[AES_BLOCK_SIZE];        // AES_BLOCK_SIZE = 16    unsigned char iv[AES_BLOCK_SIZE];        // init vector    AES_KEY aes;    int i;    // Generate AES 128-bit key    for (i=0; i<16; ++i) {        key[i] = 32 + i;    }    // alloc decrypt_string    *decrypt_string = ( char*)calloc(len, sizeof(unsigned char));    if (*decrypt_string == NULL) {        fprintf(stderr, "Unable to allocate memory for decrypt_string\n");        exit(-1);    }    // Set decryption key    for (i=0; i<AES_BLOCK_SIZE; ++i) {        iv[i] = 0;    }    if (AES_set_decrypt_key(key, 128, &aes) < 0) {        fprintf(stderr, "Unable to set decryption key in AES\n");        exit(-1);    }    // decrypt    AES_cbc_encrypt((unsigned char *)encrypt_string,(unsigned char *) *decrypt_string, len, &aes, iv,  AES_DECRYPT);}int main(void){    char *buffer = "libinbin";    char *encrypt_string = NULL;    char *decryto_string = NULL;                          //add    //进行加密处理    int encrypt_length = encrypt(buffer, &encrypt_string);    printf("encrypt_length = %d,encrypt_string-->%s\n",encrypt_length,encrypt_string);    //进行解密处理    decrypt(encrypt_string, &decryto_string, encrypt_length);    printf("decryto_string-->%s\n",decryto_string);    return 0;}
0 0