openssl aes對稱加密
阿新 • • 發佈:2020-12-29
場景:
使用aes結合base64對資料進行加解密。
原始碼:
/*aesEncDec.h*/ #ifndef _AESENCDEC_H_ #define _AESENCDEC_H_ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <openssl/aes.h> #define MINLEN 128 #define MIDLEN 1024 #define MAXLEN 4096 /*aes加解密key*/ const char AES_KEY_VALUE[MINLEN] = "123456"; int Base64Encode(const char* encoded, int encodedLength, char* decoded); int Base64Decode(const char* encoded, int encodedLength, char* decoded); void AesEncrypt(const char* original_data, char* base64_encode); void AesDecrypt(const char* original_data, char* decrypt_data); #endif // !_AESENCDEC_H_
//aesEncDec.c #include "aesEncDec.h" /**************************************************************** * function name : Base64Encode * functional description : base64編碼 * input parameter : encoded:原始資料;encodedLength:資料長度;decoded:編碼後的資料 * output parameter : None * return value: None * history : *****************************************************************/ int Base64Encode(const char* encoded, int encodedLength, char* decoded) { return EVP_EncodeBlock((unsigned char*)decoded, (const unsigned char*)encoded, encodedLength); } /**************************************************************** * function name : Base64Decode * functional description : base64解碼 * input parameter : encoded:原資料;encodedLength:資料長度;decoded:解碼後的資料 * output parameter : None * return value: None * history : *****************************************************************/ int Base64Decode(const char* encoded, int encodedLength, char* decoded) { return EVP_DecodeBlock((unsigned char*)decoded, (const unsigned char*)encoded, encodedLength); } /**************************************************************** * function name : AesEncrypt * functional description : aes加密 * input parameter : original_data:初始資料;base64_encode:加密並進行編碼後的資料 * output parameter : None * return value: None * history : *****************************************************************/ void AesEncrypt(const char* original_data, char* base64_encode) { AES_KEY key; /*設定加密key及金鑰長度*/ AES_set_encrypt_key(AES_KEY_VALUE, AES_BLOCK_SIZE * 8, &key); char encrypt_data[MIDLEN] = ""; int len = 0; /*迴圈加密,每次只能加密AES_BLOCK_SIZE長度的資料*/ while (len < strlen(original_data)) { AES_encrypt(original_data + len, encrypt_data + len, &key); len += AES_BLOCK_SIZE; } //printf("encrypt_data:%s\n", encrypt_data); Base64Encode(encrypt_data, strlen(encrypt_data), base64_encode); //printf("base64_encode:%s\n", base64_encode); } /**************************************************************** * function name : AesDecrypt * functional description : aes解密 * input parameter : original_data:初始資料;decrypt_data:解密、解碼後的資料 * output parameter : None * return value: None * history : *****************************************************************/ void AesDecrypt(const char* original_data, char* decrypt_data) { /*先解碼*/ char base64_decode[MIDLEN] = ""; Base64Decode(original_data, strlen(original_data), base64_decode); //printf("base64_decode:%s\n", base64_decode); AES_KEY key; /*設定加密key及金鑰長度*/ AES_set_decrypt_key(AES_KEY_VALUE, AES_BLOCK_SIZE * 8, &key); int len = 0; /*迴圈解密*/ while (len < MIDLEN) { AES_decrypt(base64_decode + len, decrypt_data + len, &key); len += AES_BLOCK_SIZE; } //printf("decrypt:%s\n", decrypt_data); } int main() { char buf[MIDLEN] = "helloworld"; /*加密*/ char base64_encode[MIDLEN] = ""; AesEncrypt(buf, base64_encode); printf("base64_encode:%s\n", base64_encode); /*解密*/ char decrypt_data[MIDLEN] = ""; AesDecrypt(base64_encode, decrypt_data); printf("decrypt_data:%s\n", decrypt_data); return 0; }
編譯:
gcc -o aesEncDec aesEncDec.c -lcrypto -lssl -I /root/openssl/openssl/include/ -L /root/openssl/openssl/
以上程式碼需要openssl的標頭檔案及動態庫。
openssl官網:https://www.openssl.org/
參考:
openssl提供的AES加解密演算法的api:
https://blog.csdn.net/whatday/article/details/97277567
openssl aes加解密演算法演示:
https://blog.csdn.net/yexiangCSDN/article/details/79220722