【技术】超低功耗32位MCU EFM32之硬件AES加密引擎
EFM32是SILICON LABS公司推出的32位超低功耗的MCU系列,其不仅有很多低功耗的特性,在安全性上也是非常出色。EFM32 Classic系列(包含ZG、HG、TG、LG、GG和WG)具有硬件加密引擎支持AES加密,而Gemstone系列(包含JG和PG)不仅支持硬件AES还支持硬件ECC和SHA加密。在针对一些对信息比较敏感的场合,特别是针对一些数据流信息,如果先采用数据加密,然后在进行传输,则可以增加信息的保密程度。本文档为大家详细介绍EFM32硬件AES加密引擎。
一、AES算法介绍
AES是Advanced Encryption Standard的简称,它是一种被广泛应用的对称密钥加密标准(NIST 标准 FIPS-197),由三部分组成:AES-128(128位密钥),AES-192 (192位密钥)和AES-256(256位密钥)。AES算法是硬件友好的,需要很少的资源并且速度快。它是一种分组密码,也就是说它运行在128位(16字节)固定长度的数据块中。输入块被称为明文(Plain Text),加密后的输出称为密文(Cipher Text,也是128位),使用第二个输入,即密钥来控制精确的转换。AES的安全性仅仅依赖于密钥保密,而算法本身是公开的。
解密类似于加密,解密算法与密钥一起接收128位密文块,并生成原始的128位明文块。当加密或解密的数据长度不是128位的整数倍时,那么最后一块必须用0或其他数据的方法来填充。AES算法的原理是产品密码的原理,可以概括如下:
1)它是一种多步加密算法,其中初始非加密块逐渐加密,例如在每一步加密的输入数据是前一步的输出。
2)算法步骤称为轮。AES算法有10个(128位密钥),12个(192位密钥),或者14个轮(256位密钥)。
3)每一轮使用不同的密钥(例如称为轮密钥)。10/12/14轮密钥是在执行实际编码轮之前通过原始密钥计算出来的。
4)在每一轮中执行的实际操作都是简单的字节转换,例如XOR、字节替换或字节置换。
图一描述了在10轮(128位长密钥)操作情况下AES算法的总结结构。
图一,10轮AES算法结构
输入的数据(明文和密文)由4个字节一组组成的,产生32位的数据,数据被放在矩阵的第一列中,在第一行完成后,下一列启动并继续处理,直到输入数组耗尽为止。输入矩阵被转移到状态矩阵(如图二)。状态数组的每个列中的四个字节构成32位字,其中行号为每个单词中的字节提供索引,因此状态数组可以被解释为一个32位单词的一维数组。加密解密算法的输入是一个128位分组。这些分组被描述成4×4的字节方阵,这个分组被复制到state数组中,并在加密和解密的每一阶段都被修改。在字节方阵中,每一格都是一个字,包含了4字节。在矩阵中字是按列排序的。
图二,AES状态数组
基于密钥长度(128位、192位或256位),我们可以得到轮块的密钥(10,12,14个回合)。
二、密码模式
AES加密最基本的方式是ECB。以ECB模式为基础,通过不同数据块的异或处理,
产生不同的加密模式,共有如下5种加密模式。
1)ECB模式:将明文分割成几个128位的数据块,利用密钥对每个数据块进行加密
和解密。加密或解密后的结果大小完全不变,而且独立,互相之间不关联,便于并
行运算;
图三,EBC模式示意图
2)CBC模式:建立在ECB模式上使用的一种加密方法。CBC算法中,每个明文块先
与前面的秘文块相异或,然后再加密。加密的数据相互关联,不能并行处理,但破
解的难读很大;
图四,CBC模式示意图
3)CFB模式:密钥先与前一个密文块加密,之后再与当前明文块取异或。每个密文
块都与后面的步骤紧密相连,任何一个密文块损坏,都无法完成解密;
图五,CFB模式示意图
4)OFB模式:与CFB的区别在于,OFB模式下密钥与前一块加密的结果加密;
图六,OFB模式示意图
5)CTR模式:一种用明文块与一个计数器密码和一个初始化向量的值进行异或运算
的方法。这种方法的价值在于,只要知道数据块所在的位置,就可以对任何一个明
文块进行解密。
图七,CTR模式示意图
三、软件示例
本例程基于EFM32TG平台实现硬件AES的ECB 128位加解密。实验例程利用ECB加解密方式对预定明文进行加密和解密实验,然后解密完成后通过对比解密结果和原始明文验证加解密操作的正确性。
const uint8_t exampleData[] = { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,
0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,
0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,
0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,
0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,
0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,
0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10};
//加密数据
const uint8_t expectedEncryptedData[] =
{ 0x3A, 0xD7, 0x7B, 0xB4, 0x0D, 0x7A, 0x36, 0x60,
0xA8, 0x9E, 0xCA, 0xF3, 0x24, 0x66, 0xEF, 0x97,
0xF5, 0xD3, 0xD5, 0x85, 0x03, 0xB9, 0x69, 0x9D,
0xE7, 0x85, 0x89, 0x5A, 0x96, 0xFD, 0xBA, 0xAF,
0x43, 0xB1, 0xCD, 0x7F, 0x59, 0x8E, 0xCE, 0x23,
0x88, 0x1B, 0x00, 0xE3, 0xED, 0x03, 0x06, 0x88,
0x7B, 0x0C, 0x78, 0x5E, 0x27, 0xE8, 0xAD, 0x3F,
0x82, 0x23, 0x20, 0x71, 0x04, 0x72, 0x5D, 0xD4}; //解密后的数据
const uint8_t exampleKey[] = { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C};
//密钥
uint8_t dataBuffer[sizeof(exampleData) / sizeof(exampleData[0])];
uint8_t decryptionKey[16];
int main(void)
{
uint32_t i;
/* Initialize error indicator */
bool error = false;
/* Chip errata */
CHIP_Init();
/* Enable AES clock */
CMU_ClockEnable(cmuClock_AES, true);
/* Calculate decryption key from original key. Only needs to be done once for each key */
AES_DecryptKey128(decryptionKey, exampleKey);
/* Copy plaintext to dataBuffer */
for (i=0; i<(sizeof(exampleData) / sizeof(exampleData[0])); i++)
{
dataBuffer[i] = exampleData[i];
}
/* Encrypt data in AES-128 ECB */
AesEcb128(exampleKey,
dataBuffer,
dataBuffer,
false,
sizeof(dataBuffer)/(sizeof(dataBuffer[0])*16));
/* Wait for AES to finish */
while(!AesFinished());
/* Check whether encrypted results are correct */
for (i = 0; i < (sizeof(dataBuffer) / sizeof(dataBuffer[0])); i++)
{
if (dataBuffer[i] != expectedEncryptedData[i])
{
error = true;
}
}
/* Decrypt data with AES-128 ECB */
AesEcb128(decryptionKey,
dataBuffer,
dataBuffer,
true,
sizeof(dataBuffer) / (sizeof(dataBuffer[0])*16));
/* Wait for AES to finish */
while(!AesFinished());
/* Check whether decrypted result is identical to the plaintext */
for (i = 0; i < (sizeof(dataBuffer) / (sizeof(dataBuffer[0])*16)); i++)
{
if (dataBuffer[i] != exampleData[i])
{
error = true;
}
}
/* Check for success */
if (error)
{
while (1) ; /* Ends here if there has been an error */
}
else
{
while (1) ; /* Ends here if all OK */
}
}
世强元件电商版权所有,转载请注明来源及链接。
- |
- +1 赞 0
- 收藏
- 评论 11
本网站所有内容禁止转载,否则追究法律责任!
评论
全部评论(11)
-
用户65102458 Lv4. 资深工程师 2018-07-26好好学习!
-
TAO Lv7. 资深专家 2018-05-25学习了
-
yingqiming Lv7. 资深专家 2018-04-10不错
-
用户18396822 Lv8 2018-03-19很好
-
小小哥布林 Lv7. 资深专家 2018-02-27不错
-
用户71664282 Lv4. 资深工程师 2018-01-09好东西
-
Anny Lv3. 高级工程师 2017-12-29学习
-
用户32653760 Lv4. 资深工程师 2017-12-26不错,长知识了
-
用户_8239 Lv7. 资深专家 2017-12-16不错
-
Paulwang Lv8. 研究员 2017-11-29好东西,学习了
相关推荐
【技术】EFM32ZG 32位MCU之灵活的时钟管理单元(CMU)
EFM32ZG是由Silicon Labs公司采用ARM Cortex-M0+内核设计出来的高性能、低功耗32位MCU,最高运行频率为24MHz。
技术探讨 发布时间 : 2018-01-10
【技术】低功耗32位MCU EFM32的能源模式可最大限度提高能源效率
Silicon Labs采用了一种“blue sky”的方法来设计它的低功耗32位MCU EFM32 Gecko微处理器,也开发了支持这个产品的软件和硬件工具。Silicon Labs 现已生产了一种装置,仅够消耗现有8位、16位和32位MCU所耗能量的四分之一, 使现有电池的寿命大大延长了。
技术探讨 发布时间 : 2016-01-21
【经验】基于EFM32JG1B200F128低功耗32位MCU中RTC在暂态录波型故障指示器无线采样三相同步设计方法
在JYL-60架空暂态录波型远传故障指示器项目开发过程中,考虑到架空线路ABC三相的特殊性,三支架空暂态录波型远传故障指示器分别挂在ABC线路上,无法提供可靠的硬件同步信号,在这样的环境下,无线三相同步技术正好提供了三相同步录波的可能。本文以EFM32JG1B200F128低功耗32位MCU中的RTC,设计了一种无线的三相同步采样方法。
设计经验 发布时间 : 2019-09-21
【经验】EFM32系列32位MCU常量定位问题的解决方法
Silicon Labs的32位MCU EFM32系列具有低功耗、集成度高的优势,在电池供电类的应用中具有非常明显的优势。开发EFM32的软件一般都是在Simplicty Studio软件下完成。介绍EFM32程序中的常量定位到FLASH的固定地址的方法。
设计经验 发布时间 : 2019-01-27
【应用】芯科科技提供内置16位ADC的低功耗32位MCU助力蓝牙耳机,主频高达80MHz
蓝牙耳机的系统设计需要选型一款MCU,要求尺寸小,效率高,待机功耗低。本文推荐SILICON LABS推出的低功耗32位MCU EFM32PG23B210F256IM48-C,主频高达80MHz,具有DSP指令和浮点单元,具有性能灵活的16位的数转换器。
应用方案 发布时间 : 2023-03-14
【经验】用STK3700评估板采集EFM32GG低功耗32位MCU外部频率信号完整周期的经验
在调试EFM32GG低功耗32位MCU,想测试外部频率信号的周期,范例程序测试的是按键按下的时间,也就是对应的是半个周期,不是完整的周期信号。针对范例程序做了如下修改(修改部分用红色字体标识),实现了用STK3700评估板对外部频率信号周期时间的计算
设计经验 发布时间 : 2019-05-03
【应用】基于低功耗32位MCU EFM32G2X的智能温控器节能解决方案
采用Silicon Labs的ARM Cortex-M3内核EFM32是全球最低功耗的32位MCU,外设丰富,5大超低模式,非常适用于智能温控器。无线WIFI模块采用WGM110,具有卓越的射频性能,并可提供远程范围的稳定无线连接和安全性。
方案 发布时间 : 2019-07-30
【应用】高算力低功耗32位MCU EFM32PG22C200F64IM32助力汽车仪表盘设计,功耗仅26μA/MHz
汽车仪表盘通过安装在车上各部位的传感器数据汇集到仪表盘上显示出来的。主要有发动机转速、车速、燃油位等相关信息,因为处理信息的复杂度及安全性的要求,对主控制芯片有较高的要求。本项目需要一款高算力低功耗的MCU,本文推荐芯科的控制器方案。
应用方案 发布时间 : 2022-12-11
【应用】低功耗32位MCU EFM32,实现低成本医疗内窥镜
电子内窥镜少不了这一款逆天MCU-- EFM32,其集成的USB-HOST接口,结合Cortex-M4内核的高效运算能力以及DSP指令和浮点运算单元,能够很轻松执行图像处理任务,EFM32具有丰富的外设,为系统扩展功能及降低成本提供了条件。
新应用 发布时间 : 2019-07-15
【应用】功耗电流仅900nA的32位MCU在GPS定位器上的应用
相对于传统的8位、16位单片机实现的GPS追踪器,基于EFM32JG实现的本方案具有超低功耗、集成度高和扩展性良好的优势。
新应用 发布时间 : 2019-09-05
【应用】低功耗32位MCU EFM32TG210作为便携式心脏监测仪的核心,可连续运行长达 14 天
Silicon Labs(亦称“芯科科技”)微处理器可作为新型动态心脏监测仪的核心,该监测仪参考案例可连续运行长达 14 天,需要高性能和相对较低的功耗。本文详细介绍了此款基于低功耗EFM32系列32位MCU设计的便携式心脏监测仪的开发考量、功能特色,以及研发团队的心得。
应用方案 发布时间 : 2022-05-27
【应用】EFM32JG1B200低功耗32位MCU在暂态录波型故障指示器中的应用
本文提出了一种基于EFM32JG1B200低功耗32位MCU的暂态录波型故障指示器,给出了暂态录波型故障指示器设计框图,并对其进行了功耗测试,满足中国电科院送检以及现场应用需求。
应用方案 发布时间 : 2019-08-17
【应用】低功耗32位MCU在智能安防无线报警系统中的应用
芯科高性能低功耗的32位微控制器EFM32非常适合于智能安防系统的应用,其EFM32JG系列内核采用运算性能突出的Cortex-M3设计,极大地缩短了智能安防应用中的算法处理时间,提高了系统的性能。
新应用 发布时间 : 2019-09-03
【应用】智能门锁方案核心处理器及电机驱动推荐:超低功耗32位MCU EFM32ZG210、H桥驱动器HR9110
本文主要是介绍基于Silicon Labs 32位MCU EFM32ZG210芯片和中科微H桥驱动器HR9110的通用智能锁方案。EFM32ZG210最大工作主频达24M,具有灵活的电源管理系统可满足智能锁低功耗的要求。HR9110可实现直流电机的驱动而且输出连续最大电流1.2A。
应用方案 发布时间 : 2020-03-10
【应用】32位低功耗MCU EFM32系列的电流数模转换器(IDAC)应用
本应用主要介绍了如何使用Silicon Labs EFM32电流数模转换器(IDAC),并通过部分示例工程来演示其功能。 IDAC常用于提供或吸收可编程电流,实用设计中可通过软件或使用PRS功能来完成IDAC的控制。
应用方案 发布时间 : 2019-02-12
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
提供全面表征产品器件耗电特征及功耗波形、快速瞬态效应、电源优化、表征和仿真测试服务,使用直流电源分析仪测量精度达50µV,8nA,波形发生器带宽100kHz,输出功率300W,示波器200kHz,512 kpts
实验室地址: 深圳/苏州 提交需求>
登录 | 立即注册
提交评论