From: p15692025051 <846603105@qq.com> Date: Wed, 7 May 2025 08:30:02 +0000 (+0800) Subject: 鉴权aes加密算法 X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=11acfca86eb520b9d54078ba34562c9da4ebcf46;p=mirrors%2FFX01.git 鉴权aes加密算法 --- diff --git a/2.code/aicos/app/AI_AMP_2_5/dev_authentication.c b/2.code/aicos/app/AI_AMP_2_5/dev_authentication.c index 2abe635..63e2e57 100644 --- a/2.code/aicos/app/AI_AMP_2_5/dev_authentication.c +++ b/2.code/aicos/app/AI_AMP_2_5/dev_authentication.c @@ -15,8 +15,15 @@ #include "AI_AMP_2_5.h" #include "mbedtls/base64.h" #include "mbedtls/md5.h" -static char * dev_key = "uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" ; -static char * dev_pid = "cqxJZi5CNgzjS3mX21Zw"; +#include +#include +#include "mbedtls/aes.h" +#include "mbedtls/cipher.h" +#define kb_malloc aic_malloc +#define bk_free aic_free +// static char * dev_key = "uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" ; +// static char * dev_pid = "cqxJZi5CNgzjS3mX21Zw"; +void ase_encrypt_dome(void); //激活用的md5签名 static int active_md5_sign(const char *dev_id,const char *pid,const char *timestamp,const char *productSecret,char*md5_str) { @@ -29,7 +36,7 @@ static int active_md5_sign(const char *dev_id,const char *pid,const char *timest if(strlen(timestamp)>256) return -4; char md5_buf[16]={0}; - char *sign_buf = malloc(1024); + char *sign_buf = kb_malloc(1024); if(!sign_buf) return -10; @@ -68,7 +75,7 @@ static int active_md5_sign(const char *dev_id,const char *pid,const char *timest } md5_str[32] = '\0'; - free(sign_buf); + bk_free(sign_buf); return 0; } @@ -81,4 +88,187 @@ void active_md5_sign_demo(void) char md5_buf[33]={0}; active_md5_sign(dev_id,pid,timestamp,productSecret,md5_buf); bk_printf("md5_buf:%s",md5_buf); + ase_encrypt_dome(); +} +#define AES_BLOCK_SIZE 16 +// PKCS5填充 +void pkcs5_padding(unsigned char *data, size_t data_len, size_t block_size) { + size_t padding_len = block_size - (data_len % block_size); + for (size_t i = 0; i < padding_len; i++) { + data[data_len + i] = (unsigned char)padding_len; + } +} +// 移除PKCS5填充 +size_t pkcs5_unpadding(unsigned char *data, size_t data_len,size_t block_size) { + size_t padding_len = data[data_len - 1]; + if (padding_len > 0 && padding_len <= block_size) { + for (size_t i = 0; i < padding_len; i++) { + if (data[data_len - 1 - i] != (unsigned char)padding_len) { + return data_len; + } + } + return data_len - padding_len; + } + return data_len; +} + +//登录用的aes256加密 +int aes_cbc_pkcs5_encrypt(const char *input,int input_len,const char* str_key,const char* str_iv,char *Base64_output,int *Base64_output_len) +{ + + mbedtls_cipher_context_t ctx; + int ret; + unsigned char *aes_data =NULL; + unsigned char *padded_plaintext=NULL; + size_t aes_data_len = 0; + // 初始化上下文 + mbedtls_cipher_init(&ctx); + + // 设置加密算法 + ret = mbedtls_cipher_setup(&ctx, mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_256_CBC)); + if (ret != 0) { + bk_printf("mbedtls_cipher_setup failed: -0x%04x\n", -ret); + goto exit; + } + + // 设置密钥和IV + ret = mbedtls_cipher_setkey(&ctx, str_key, strlen(str_key) * 8, MBEDTLS_ENCRYPT); + if (ret != 0) { + bk_printf("mbedtls_cipher_setkey failed: -0x%04x\n", -ret); + goto exit; + } + + ret = mbedtls_cipher_set_iv(&ctx, str_iv, strlen(str_iv)); + if (ret != 0) { + bk_printf("mbedtls_cipher_set_iv failed: -0x%04x\n", -ret); + goto exit; + } + //bk_printf("aes_cbc_pkcs5_encrypt2"); + // 计算填充后的长度 + size_t padded_len = input_len; + if (padded_len % AES_BLOCK_SIZE != 0) { + padded_len += AES_BLOCK_SIZE - (padded_len % AES_BLOCK_SIZE); + }else + padded_len+=AES_BLOCK_SIZE; + //bk_printf("aes_cbc_pkcs5_encrypt3"); + // 复制明文并进行填充 + padded_plaintext = (unsigned char *)kb_malloc(padded_len); + if (padded_plaintext == NULL) { + ret = MBEDTLS_ERR_CIPHER_ALLOC_FAILED; + bk_printf("Memory allocation failed\n"); + goto exit; + } + //bk_printf("aes_cbc_pkcs5_encrypt4 padded_len :%d,input_len:%d",padded_len,input_len); + aes_data = (unsigned char *)kb_malloc(padded_len); + if (aes_data == NULL) { + ret = MBEDTLS_ERR_CIPHER_ALLOC_FAILED; + bk_printf("Memory allocation failed\n"); + goto exit; + } + //bk_printf("aes_cbc_pkcs5_encrypt5"); + memcpy(padded_plaintext, input, input_len); + pkcs5_padding(padded_plaintext, input_len, AES_BLOCK_SIZE); + bk_printf("aes_cbc_pkcs5_encrypt6"); + // 加密 + ret = mbedtls_cipher_update(&ctx, padded_plaintext, padded_len, aes_data, &aes_data_len); + if (ret != 0) { + bk_printf("mbedtls_cipher_update failed: -0x%04x\n", -ret); + + goto exit; + } + //bk_printf("aes_cbc_pkcs5_encrypt7"); + mbedtls_base64_encode(Base64_output, *Base64_output_len, Base64_output_len, aes_data, aes_data_len); + Base64_output[*Base64_output_len] = 0; + //bk_printf("aes_cbc_pkcs5_encrypt8."); + bk_free(padded_plaintext); + //bk_printf("aes_cbc_pkcs5_encrypt9"); + bk_free(aes_data); + + // 清理上下文 + mbedtls_cipher_free(&ctx); + return 0; + +exit: + mbedtls_cipher_free(&ctx); + if(aes_data) + bk_free(aes_data); + if(padded_plaintext) + bk_free(padded_plaintext); + return ret; +} +// AES/CBC/PKCS5Padding解密 +int aes_cbc_pkcs5_decrypt(const char *Base64_str_input,const char* str_key,const char* str_iv,char *output,int *output_len) + // const unsigned char *key, size_t key_len, + // const unsigned char *iv, size_t iv_len, + // const unsigned char *ciphertext, size_t ciphertext_len, + // unsigned char *plaintext, size_t *plaintext_len) +{ + mbedtls_cipher_context_t ctx; + int ret; + char *input_buf = NULL; + // 初始化上下文 + mbedtls_cipher_init(&ctx); + + // 设置加密算法 + ret = mbedtls_cipher_setup(&ctx, mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_256_CBC)); + if (ret != 0) { + bk_printf("mbedtls_cipher_setup failed: -0x%04x\n", -ret); + goto exit; + } + + // 设置密钥和IV + ret = mbedtls_cipher_setkey(&ctx, str_key, strlen(str_key) * 8, MBEDTLS_DECRYPT); + if (ret != 0) { + bk_printf("mbedtls_cipher_setkey failed: -0x%04x\n", -ret); + goto exit; + } + + ret = mbedtls_cipher_set_iv(&ctx, str_iv, strlen(str_iv)); + if (ret != 0) { + bk_printf("mbedtls_cipher_set_iv failed: -0x%04x\n", -ret); + goto exit; + } + size_t input_buf_len = strlen(Base64_str_input)+1; + input_buf = kb_malloc(input_buf_len); + memset(input_buf,0,input_buf_len); + mbedtls_base64_decode(input_buf, input_buf_len, &input_buf_len, Base64_str_input, strlen(Base64_str_input)); + // 解密 + ret = mbedtls_cipher_update(&ctx, input_buf, input_buf_len, output, output_len); + if (ret != 0) { + bk_printf("mbedtls_cipher_update failed: -0x%04x\n", -ret); + goto exit; + } + + // 清理上下文 + mbedtls_cipher_free(&ctx); + + // 移除填充 + *output_len = pkcs5_unpadding(output, *output_len,AES_BLOCK_SIZE); + output[*output_len] = 0; + if(input_buf) + bk_free(input_buf); + return 0; + + exit: + if(input_buf) + bk_free(input_buf); + mbedtls_cipher_free(&ctx); + return ret; +} + +void ase_encrypt_dome(void) +{ + const char *data = "11111111222222223333333344444444"; + size_t Base64_data_len = strlen(data)*3+32; + char *Base64_data = kb_malloc(Base64_data_len); + memset(Base64_data,0,Base64_data_len); + aes_cbc_pkcs5_encrypt(data,strlen(data),"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX","5555555566666666",Base64_data,&Base64_data_len); + bk_printf("ase_encrypt_dome:aes_cbc_pkcs5_encrypt:len:%d,Base64_data:%s",Base64_data_len,Base64_data); + char *decrypt_data = kb_malloc(Base64_data_len); + aes_cbc_pkcs5_decrypt(Base64_data,"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX","5555555566666666",decrypt_data,&Base64_data_len); + bk_printf("ase_encrypt_dome:aes_cbc_pkcs5_decrypt:len:%d,decrypt_data:%s",Base64_data_len,decrypt_data); + if(Base64_data) + bk_free(Base64_data); + if(decrypt_data) + bk_free(decrypt_data); } \ No newline at end of file