【极海APM32F407 Tiny Board】数据加密:AES & MD5 & SHA1
[复制链接]
在需要数据安全的应用场景,数据加密和数据校验是必不可少的组件。
加密常用DES、AES、RSA等,校验通常使用CRC、MD5、SHA1、SHA256、SHA512。
APM32的两个特色外设:
加密外设,支持AES和DES加密算法,支持ECB、CBC和CTR模式。
校验外设,支持MD5和SHA1摘要算法。
今天测试一下两个外设的使用方法及计算性能。
运算速度这一块,使用mbedtls作为对比,优化等级采用最常用的blance。
对于APM32的两个外设使用十分简单,打开时钟,调用官方库函数即可。下面将测试方法及结果分享出来:
所有测试代码均分为两部分,分别为mbedtls和APM32的计算,程序加了时间测量代码,方便对比计算速度。
测试时通过串口命令行调用指定接口即可,具体操作参加贴尾视频。
1、MD5测试:对1KB数据计算摘要
clk_start = bsp_cpu_clks_get();
// mbedtls_md5 = init + start + update + finish + free
mbedtls_md5(src, 1024, out);
dbg_print("mbedtls MD5 time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
dbg_u8_print("MD5 OUT: ", out, 16, 20);
dbg_puts(SYMBOL_LINE_ADD PTCR);
clk_start = bsp_cpu_clks_get();
HASH_ComputeMD5((uint8_t*)src, 1024, out);
dbg_print("APM32 MD5 time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
dbg_u8_print("MD5 OUT: ", out, 16, 20);
结果:
mbedtls MD5 time: 152 us
APM32 MD5 time: 31 us
速度明显不在一个量级,APM32硬件计算速度约为mbedtls的5倍之多。
2、SHA1测试:对1KB数据计算摘要
clk_start = bsp_cpu_clks_get();
mbedtls_sha1(src, 1024, out);
dbg_print("mbedtls SHA1 time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
dbg_u8_print("SHA1 OUT: ", out, 20, 32);
dbg_puts(SYMBOL_LINE_ADD PTCR);
clk_start = bsp_cpu_clks_get();
HASH_ComputeSHA1((uint8_t*)src, 1024, out);
dbg_print("APM32 SHA1 time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
dbg_u8_print("SHA1 OUT: ", out, 20, 32);
结果:
mbedtls SHA1 time: 304 us
APM32 SHA1 time: 33 us
这个差距就大了,居然有将近10倍的速度。
3、AES ECB,加密解密数据块256字节
clk_start = bsp_cpu_clks_get();
mbedtls_aes_init(aes_enc);
mbedtls_aes_setkey_enc(aes_enc, (void *)ase_key_src, 128);
loop(16)
mbedtls_aes_crypt_ecb(aes_enc, MBEDTLS_AES_ENCRYPT, src+index*16, enc+index*16);
dbg_print("mbedtls AES ECB encode time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
clk_start = bsp_cpu_clks_get();
mbedtls_aes_init(aes_dec);
mbedtls_aes_setkey_dec(aes_dec, (void *)ase_key_src, 128);
loop(16)
mbedtls_aes_crypt_ecb(aes_dec, MBEDTLS_AES_DECRYPT, enc+index*16, dec+index*16);
dbg_print("mbedtls AES ECB decode time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
// 显示
//dbg_u8_print("src: \n", src, 256, 32);
dbg_u8_print("enc: \n", enc, 256, 32);
dbg_u8_print("dec: \n", dec, 256, 32);
dbg_puts(SYMBOL_LINE_ADD PTCR);
/* AES 128 */
/* Encrypt the plaintext message*/
dat_buff_init();
clk_start = bsp_cpu_clks_get();
CRYP_Reset();
CRYP_AES_ECB(CRYP_MODE_ENCRYPT, (uu8*)ase_key_src, 128, src, 256, enc);
dbg_print("APM32 AES ECB encode time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
clk_start = bsp_cpu_clks_get();
CRYP_Reset();
CRYP_AES_ECB(CRYP_MODE_DECRYPT, (uu8*)ase_key_src, 128, enc, 256, dec);
dbg_print("APM32 AES ECB decode time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
// 显示
//dbg_u8_print("src: \n", src, 256, 32);
dbg_u8_print("enc: \n", enc, 256, 32);
dbg_u8_print("dec: \n", dec, 256, 32);
结果:
mbedtls AES ECB encode time: 273 us
mbedtls AES ECB decode time: 301 us
APM32 AES ECB encode time: 15 us
APM32 AES ECB decode time: 16 us
这个速度差又上了一个层级,接近20倍的速度。
4、AES CBC,加密解密数据块256字节
clk_start = bsp_cpu_clks_get();
mbedtls_aes_init(aes_enc);
mbedtls_aes_setkey_enc(aes_enc, (void *)ase_key_src, 128);
mbedtls_aes_crypt_cbc(aes_enc, MBEDTLS_AES_ENCRYPT, 256, iv, src, enc);
dbg_print("mbedtls AES CBC 256 : enc time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
memset(iv, 0xFF, 16);
clk_start = bsp_cpu_clks_get();
mbedtls_aes_init(aes_dec);
mbedtls_aes_setkey_dec(aes_dec, (void *)ase_key_src, 128);
mbedtls_aes_crypt_cbc(aes_dec, MBEDTLS_AES_DECRYPT, 256, iv, enc, dec);
dbg_print("mbedtls AES CBC 256 : dec time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
// 显示
dbg_u8_print("enc: \n", enc, 256, 32);
dbg_u8_print("dec: \n", dec, 256, 32);
// APM32 CBC
dbg_puts(SYMBOL_LINE_ADD PTCR);
dat_buff_init();
memset(iv, 0xFF, 16);
clk_start = bsp_cpu_clks_get();
CRYP_Reset();
CRYP_AES_CBC(CRYP_MODE_ENCRYPT, (uu8*)ase_key_src, 128, iv, src, 256, enc);
dbg_print("APM32 AES CBC 256 : enc time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
memset(iv, 0xFF, 16);
clk_start = bsp_cpu_clks_get();
CRYP_Reset();
CRYP_AES_CBC(CRYP_MODE_DECRYPT, (uu8*)ase_key_src, 128, iv, enc, 256, dec);
dbg_print("APM32 AES CBC 256 : dec time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
// 显示
dbg_u8_print("enc: \n", enc, 256, 32);
dbg_u8_print("dec: \n", dec, 256, 32);
结果:
mbedtls AES CBC 256 : enc time: 301 us
mbedtls AES CBC 256 : dec time: 328 us
APM32 AES CBC 256 : enc time: 16 us
APM32 AES CBC 256 : dec time: 16 us
结果和ECB模式接近,略有提升。
综合来看,算法越复杂提升越大。对于数据量较大的应用场景,加密速度将直接影响用户体验,硬件加速外设可以明显提升设备使用体验,同时能够释放CPU算力负担。
enc
测试代码托管在gitee平台:
|