89 lines
2.5 KiB
C
89 lines
2.5 KiB
C
|
|
#include <stdio.h>
|
|||
|
|
#include <stdlib.h>
|
|||
|
|
#include <string.h>
|
|||
|
|
#include "mbedtls/aes.h"
|
|||
|
|
|
|||
|
|
#define RAWDATALEN 16
|
|||
|
|
// uint8_t rawData[RAWDATALEN];
|
|||
|
|
uint8_t aes_iv[16];
|
|||
|
|
|
|||
|
|
// aes key,加密和解密要用同样的key
|
|||
|
|
uint8_t aes_key[16] = {0xFE, 0x63, 0x96, 0xF9, 0x5C, 0xEF, 0xB8, 0xF4, 0x07, 0x05, 0xD1, 0xB6, 0xEB, 0xAB, 0xEA, 0x07};
|
|||
|
|
uint8_t aes_iv_original[16] = {0x3D, 0x27, 0x4E, 0x83, 0x43, 0x5D, 0x30, 0xEC, 0x62, 0xEB, 0x90, 0x3A, 0xAC, 0x60, 0x12, 0xF5};
|
|||
|
|
|
|||
|
|
mbedtls_aes_context aes;
|
|||
|
|
|
|||
|
|
void sb_aes_init()
|
|||
|
|
{
|
|||
|
|
// 初始化aes上下文
|
|||
|
|
mbedtls_aes_init(&aes);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void reset_iv()
|
|||
|
|
{
|
|||
|
|
// 该函数用于每次加密、解密前,重置iv值,iv值的内容是随意定的,只要起到不是随便就能猜中的IV值即可。
|
|||
|
|
// 加、解密所用的iv值必须相同。此处把iv值设置为0~15
|
|||
|
|
memcpy(aes_iv, aes_iv_original, 16);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int sb_aes_encrypt(uint8_t *crypt_data, int crypt_len, uint8_t *output_data)
|
|||
|
|
{
|
|||
|
|
int ret;
|
|||
|
|
// 设置加密的key
|
|||
|
|
mbedtls_aes_setkey_enc(&aes, aes_key, 128);
|
|||
|
|
reset_iv(); // 因为调用mbedtls_aes_crypt_cbc后传入的iv值会有变化,重置iv值会有变化
|
|||
|
|
ret = mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, crypt_len, aes_iv, crypt_data, output_data);
|
|||
|
|
if (ret)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return crypt_len;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int sb_aes_decrypt(uint8_t *crypt_data, int crypt_len, uint8_t *output_data)
|
|||
|
|
{
|
|||
|
|
int ret;
|
|||
|
|
|
|||
|
|
// 设置解密的key
|
|||
|
|
mbedtls_aes_setkey_dec(&aes, aes_key, 128);
|
|||
|
|
reset_iv(); // 因为调用mbedtls_aes_crypt_cbc后传入的iv值会有变化,重置iv值会有变化
|
|||
|
|
ret = mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_DECRYPT, crypt_len, aes_iv, crypt_data, output_data);
|
|||
|
|
if (ret)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return crypt_len;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// void app_main(void)
|
|||
|
|
//{
|
|||
|
|
// uint8_t encData[RAWDATALEN] = { 0 };
|
|||
|
|
// uint8_t decData[RAWDATALEN] = { 0 };
|
|||
|
|
|
|||
|
|
// sb_aes_init(); // 初始化aes上下文
|
|||
|
|
|
|||
|
|
// // 打印原始数据
|
|||
|
|
// printf("rawData:\t");
|
|||
|
|
// for (int i = 0; i < RAWDATALEN; i++) {
|
|||
|
|
// printf("%02x, ", rawData[i]);
|
|||
|
|
// }
|
|||
|
|
// printf("\n");
|
|||
|
|
|
|||
|
|
// // 加密
|
|||
|
|
// int encresult = sb_aes_encrypt(rawData, sizeof(rawData), encData);
|
|||
|
|
// printf("enc data(%d):\t", encresult);
|
|||
|
|
// for (int i = 0; i < RAWDATALEN; i++) {
|
|||
|
|
// printf("%02x, ", encData[i]);
|
|||
|
|
// }
|
|||
|
|
// printf("\n");
|
|||
|
|
|
|||
|
|
// // 解密
|
|||
|
|
// int decresult = sb_aes_decrypt(encData, RAWDATALEN, decData);
|
|||
|
|
// printf("dec data(%d):\t", decresult);
|
|||
|
|
// for (int i = 0; i < RAWDATALEN; i++) {
|
|||
|
|
// printf("%02x, ", decData[i]);
|
|||
|
|
// }
|
|||
|
|
// printf("\n");
|
|||
|
|
//}
|