1. 程式人生 > 其它 >openssl aes對稱加密

openssl aes對稱加密

技術標籤:LinuxC

場景:

使用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