1495|4

32

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【极海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平台:

链接已隐藏,如需查看请登录或者注册

最新回复

讲的还不错,最近我们也在导极海的芯片,回头试试看看   详情 回复 发表于 2023-6-8 10:02
点赞 关注(1)
 
 

回复
举报

6449

帖子

10

TA的资源

版主

沙发
 

数据加密一般用在什么地方,程序自己的数据读取也要加解密吗?

点评

比如你的设备是付费授权模式,授权文件就需要加密。 或者你的设备比较高级,为防止别人分析你的通信协议,设备间通信数据也需要加密。  详情 回复 发表于 2023-6-1 11:10
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

32

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
秦天qintian0303 发表于 2023-6-1 09:03 数据加密一般用在什么地方,程序自己的数据读取也要加解密吗?

比如你的设备是付费授权模式,授权文件就需要加密。 或者你的设备比较高级,为防止别人分析你的通信协议,设备间通信数据也需要加密。

 
 
 

回复

5262

帖子

239

TA的资源

管理员

4
 

你测试的这个点,还真少有测评网友测试过

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

320

帖子

0

TA的资源

纯净的硅(初级)

5
 

讲的还不错,最近我们也在导极海的芯片,回头试试看看

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表