lia****com
我用参考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);
}
lia****com
调整大小端之后正常了。但是还有两个问题。
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
Darren
GR551x_SDK_V1.7.0中的AES加解密计算模式为小端,若为大端输入,则需要将输入、输出调整端序,例如如下截图:
lia****com
这里打印的库函数做了小修改:
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();
}
打开微信,使用“扫一扫”即可关注