CN / EN
CN / EN

提问

获得支持

您的项目私密技术问题如需获得一对一支持,请点击下方联系我们。

AES CBC加密解密数据与工具上的结果不一致 GR551x

lia****com

2022-09-21 13:56

我用参考app_aes的例程,尝试使用AES加解密。发现与工具上的数据不一致。请问是哪个地方没有配置好?

GR551x_SDK_V1.7.0\projects\peripheral_app\aes\app_aes

/*******************************************************************************************************************************/
/**********************************************************
g_seed主要用于随机数mask,作用于DPA(Differential Power Analysis)模式,防止差分功耗分析攻击。
当DPA模式为ENABLE时,如果g_seed指针为NULL则会返回错误码。当DPA模式为DISABLE时,可以将g_seed置为NULL。CBC模式暂时不支持DPA模式。  
**********************************************************/

char MyIv[16] = "0123456789012345";
const char AES128_KEY[16] = "0123456789012345";

#define AES_CBC_PARAM   {                                                                               \
                            APP_AES_TYPE_INTERRUPT, APP_AES_MODE_CBC,                                   \
                            {                                                                           \
                                AES_KEYSIZE_128BITS, AES_OPERATION_MODE_ENCRYPT, AES_CHAININGMODE_CBC , \
                                (uint32_t *)AES128_KEY, (uint32_t *)MyIv, DISABLE, NULL             		\
                            }                                                                           \
                        }


/*************************************************************
**AES加解密
**OperationMode 加密:AES_OPERATION_MODE_ENCRYPT  解密:AES_OPERATION_MODE_DECRYPT
**key:秘钥;  src:需要加密或者解密的数据   dst输出加密或者解密后的数据
**len: 加解密数据的长度,应该是16的整数倍,如果不是则调用PKCS5Padding补齐。
*************************************************************/
void GenerteAES128CBC(uint32_t OperationMode, uint8_t *key, uint8_t *src, uint8_t *dst, uint32_t len)
{	
    app_aes_params_t params = AES_CBC_PARAM;
		
		params.init.p_key = (uint32_t *)key;

    app_aes_init(¶ms, app_aes_event_handler);
	
		g_int_done_flag = 0;
		if(OperationMode == AES_OPERATION_MODE_ENCRYPT)
		{
			app_aes_encrypt_async((uint32_t *)src, len, (uint32_t *)dst);
			while(g_int_done_flag == 0);
		}
		else if(OperationMode == AES_OPERATION_MODE_DECRYPT)
		{
			app_aes_decrypt_async((uint32_t *)src, len, (uint32_t *)dst);
			while(g_int_done_flag == 0);
		}
		else
		{
			printf("error OperationMode %d\r\n",OperationMode);
		}			
		printf("\r\nkey:");
		APP_LOG_HEX_DUMP((uint8_t*)params.init.p_key , 16);
		printf("\r\nIV:");
		APP_LOG_HEX_DUMP((uint8_t*)params.init.p_init_vector , 16);
}

uint8_t test_data_buf[32];
uint8_t test_endata_buf[32];
int main(void)
{
    bsp_log_init();

    printf("\r\n");
    printf("******************************************************\r\n");
    printf("*                 AES App example.                   *\r\n");
    printf("*                                                    *\r\n");
    printf("* This sample code will show how AES work, and print *\r\n");
    printf("* results of calculate.                              *\r\n");
    printf("******************************************************\r\n");
    printf("\r\n");

//    aes_interrupt();
			memset(test_data_buf,0x31,16);		//16个'1'
			GenerteAES128CBC(AES_OPERATION_MODE_ENCRYPT, (uint8_t*)AES128_KEY, test_data_buf, test_endata_buf, 16);				
			printf("\r\n加密前:");
			APP_LOG_HEX_DUMP(test_data_buf, 16);				
			printf("\r\n加密后:");
			APP_LOG_HEX_DUMP(test_endata_buf, 16);

			printf("\r\nThis example demo end.\r\n");

    while(1);
}

对比网站: http://tool.chacuo.net/cryptaes

0收藏

0赞成

lia****com

2022-09-26 09:46

调整大小端之后正常了。但是还有两个问题。

1、如果更换了key之后再次加密出来的数据就不正确了。我用了一个for循环去不断更换key,发现第一个key正确,第二个是错误的。更换key需要做什么特殊处理吗?

uint8_t test_data_buf[32];
uint8_t test_endata_buf[32];
uint8_t AES128_KEY_temp[16];
uint8_t symbolKey[10] = "1234[].*()";
int main(void)
{
	uint8_t i;
    bsp_log_init();

    printf("\r\n");
    printf("******************************************************\r\n");
    printf("*                 AES App example.                   *\r\n");
    printf("*                                                    *\r\n");
    printf("* This sample code will show how AES work, and print *\r\n");
    printf("* results of calculate.                              *\r\n");
    printf("******************************************************\r\n");
    printf("\r\n");

//    aes_interrupt();

	for(i=1; i<10; i++)
	{
			memset(AES128_KEY_temp, symbolKey[i], 16);		
			memset(test_data_buf,0x31,16);		//16个'1'
			GenerteAES128CBC(AES_OPERATION_MODE_ENCRYPT, (uint8_t*)AES128_KEY_temp, test_data_buf, test_endata_buf, 16);		
			printf("\r\n加密前:");
			APP_LOG_HEX_DUMP(test_data_buf, 16);				
			printf("\r\n加密后:");
			APP_LOG_HEX_DUMP(test_endata_buf, 16);
			sys_delay_ms(100);
	}
	printf("\r\nThis example demo end.\r\n");

    while(1);
}

2、当key上有多个符号时候,输出的加密信息好像也有问题。

char MyIv[16] = "0123456789012345";				//3210765410985432
//const char AES128_KEY[16] = "0123456789012345";
const char AES128_KEY[16] = "[?').;(Yf%*12345";		//)'?[Y(;.1*�432

0条评论

0赞成

0收藏

您的评论

Darren

2022-09-22 20:10

GR551x_SDK_V1.7.0中的AES加解密计算模式为小端,若为大端输入,则需要将输入、输出调整端序,例如如下截图:

2条评论

0赞成

0收藏

您的评论

lia****com

2022-09-21 13:59

这里打印的库函数做了小修改:

void app_log_hex_dump(uint8_t *p_data, uint16_t length)
{
    uint16_t log_length  = 0;
    uint16_t convert_idx = 0;
    char     dump_str[8] = {0};

    APP_LOG_LOCK();

    for (convert_idx = 0; convert_idx < length; convert_idx++)
    {
        if (log_length >= APP_LOG_LINE_BUF_SIZE)
        {
            log_length = APP_LOG_LINE_BUF_SIZE;
            break;
        }
/*
        if (p_data[convert_idx] < ' ')
        {
            s_log_encode_buf[log_length] = '.';
            log_length++;
        }
        else*/
        {
            snprintf(dump_str, 8, "X ", p_data[convert_idx]);
            log_length += app_log_strcpy(log_length, s_log_encode_buf, dump_str);
        }
    }

    app_log_data_trans(s_log_encode_buf, log_length);

    APP_LOG_UNLOCK();
}


0条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注