鉴权aes加密算法
authorp15692025051 <846603105@qq.com>
Wed, 7 May 2025 08:30:02 +0000 (16:30 +0800)
committerp15692025051 <846603105@qq.com>
Wed, 7 May 2025 08:30:02 +0000 (16:30 +0800)
2.code/aicos/app/AI_AMP_2_5/dev_authentication.c

index 2abe635..63e2e57 100644 (file)
 #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 <stdio.h>
+#include <string.h>
+#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