随着信息设备的普及, 密码芯片在金融、商业、医疗、教育等领域得到广泛应用, 由此引起的安全问题也日渐突出。目前, 密码算法已经十分成熟, 从数学层面上研究加密算法漏洞, 攻破算法的可能性较低, 但从物理层面上对芯片运行的时间、能量、时钟等进行采集分析, 可对密码芯片安全性造成极大威胁[1-3]。通过对密码芯片注入物理故障, 促使芯片进行非正常加密, 攻击者能够利用错误加密的密文进行差分分析获取相应密钥信息。
外界物理干扰可以通过入侵式、半入侵式或非入侵式3种形式对密码芯片进行攻击, 其中温度、射线、电压、电磁等物理变化都能成为攻击芯片加密的手段[4]。当供电电压过高或过低时, 芯片算术逻辑运算指令、存储读写指令、判断指令均可被篡改, 出现错误执行[5]。电压毛刺作为一种非入侵式攻击方式, 其隐蔽性强, 通过调试芯片供电电压, 形成电压毛刺, 为密码芯片供电段注射一段特定的毛刺电压, 密码芯片会错误执行指令, 进行错误加密, 输出错误密文。通过设置毛刺延时、幅度、宽度, 电压毛刺能够准确地对密码算法具体执行语句进行攻击, 达到注入故障的目的。由于芯片硬件结构对不同电压值敏感程度不同, 因此芯片执行不同语句所对应的有效攻击电压也不同。电压故障注入攻击需要预先明确所要攻击的语句, 并调试出能有效攻击该语句的电压值[6]。本文利用测试程序对单片机芯片运行循环判断语句的攻击电压值进行实验, 得到可使循环判断语句失效的电压值, 从而调试出能够有效攻击循环判断语句的电压毛刺, 并将其注入单片机芯片供电端, 达到注入故障的目的。
1 针对AES算法的DFA 1.1 AES算法介绍高级加密标准(Advanced Encryption Standard, AES)根据密钥长度的不同分为128位AES、192位AES、256位AES 3种类型, 加密轮次分为10轮、12轮、14轮。AES算法是分组加密算法, 明文分组长度均为128 bit。下文将以使用最普遍的128位AES算法为例进行分析。
在128位AES算法加密过程中, 前9轮流程均相同, 分别为字节替换、行移位、列混淆和轮密钥加, 算法第10轮除不执行列混淆计算外, 其余运算与前9轮相同[7]。AES算法的解密过程和加密过程不同, 由于每轮加密的每个运算都是可逆的, 因此在执行解密时, 每个步骤都是原步骤的逆运算, 但是顺序不一样, 除第10轮解密运算不包含逆列混淆外, 其余每轮解密过程的顺序分别是行移位求逆、字节代换求逆、轮密钥加、列混淆求逆。整个算法流程如图 1所示。
![]() |
Download:
|
图 1 AES算法加解密流程 |
每轮的轮密钥是由初始密钥推导得到。初始密钥长度为128 bit(16字节), 排列成一个4阶矩阵, 每列组成一个字, 初始密钥记为w[0]、w[1]、w[2]、w[3], 依次记为w[4i]、w[4i+1]、w[4i+2]、w[4i+3](i表示加密轮次的序号, 第1轮加密序号记为1, 最后1轮加密序号记为10)。AES算法在第1轮加密前会用初始密钥对明文进行异或运算, 之后每轮的轮密钥都由初始密钥通过特定函数产生, 计算公式如下:
$ w\left[ i \right] = \left\{ {\begin{array}{*{20}{c}} {w\left[ {i - 4} \right] \oplus w\left[ {i - 1} \right], \mathit{i}不是4的倍数}\\ {w\left[ {i - 4} \right] \oplus T\left( {w\left[ {i - 1} \right]} \right), \mathit{i}是4的倍数} \end{array}} \right. $ |
其中, T函数包含字循环、字节替换、轮常量异或。
1) 字循环(RotWord):一组数列[a0, a1, a2, a3]通过字节循环运算, 4个字节循环左移一个字节变成[a1, a2, a3, a0]。
2) 字节替换(SubWord):将矩阵中的每个元素对照S盒进行字节替换, 得到新的矩阵。
3) 轮常量异或:对前两步的结果同轮常量Rcon[i]进行异或, 其中轮常量由[xi-1, {00}, {00}, {00}]表示, x表示在GF(28)域中的{02}。轮常量如表 1所示。
![]() |
下载CSV 表 1 轮常量值 |
文献[8]提出一种通过注入故障减少AES加密算法轮次, 从而获取密钥的攻击方法DFA。这种DFA攻击是基于PIC16F877智能卡的电压毛刺故障注入攻击。实验的加密算法[8]与标准AES算法不同, 第10轮加密中包含了列混淆运算, 因此10轮AES加密通过“for”循环语句实现重复加密运算。实验[8]采用供电电压毛刺注入的方法, 在算法运行至目标语句时, 准确攻击了“for”循环语句, 芯片成功跳过了循环判断, 仅执行1轮加密, 导致芯片输出错误结果, 最终恢复出初始密钥。
通过攻击AES循环语句减少加密轮次的DFA, 充分验证了电压毛刺对芯片运算的威胁, 并证明了利用电压毛刺攻击算法“for”循环语句的可行性, 并且其攻击成本低, 恢复密钥速度快。但这种攻击方法仅对非标准AES算法适用, 对于标准AES算法, 只有前9轮用“for”循环进行循环加密, 最后1轮不包含列混淆, 则该方法就不再适用[8]。在实际攻击中, 加密者只要不使用循环语句进行运算, 这种针对加密轮次的DFA就能成功被防御, 而对AES密钥扩展进行攻击, 就能成功避开针对加密轮次的防御。同样使用供电电压毛刺攻击加密芯片, 攻击成本低, 隐蔽性高, 并且在恢复密钥时, 针对AES密钥扩展函数的DFA攻击恢复密钥更快, 工作量更小。
1.3 AES密钥扩展DFA分析AES算法的故障注入攻击有多种模型, 比如攻击加密轮次循环语句, 使加密系统加密次数减少, 对正确的密文输出和错误的密文输出进行DFA分析得出正确密钥[9-11]。128位AES加密算法一共有11个轮密钥, 除第1轮的初始密钥外, 其余10轮的轮密钥均由第1轮的初始密钥经过密钥扩展得到。在实际密码芯片中, 密钥扩展部分代码包含判断、赋值、异或等执行语句, 本文将故障注入到密钥扩展部分, 在目标循环语句执行时用电压毛刺攻击芯片干预语句执行[12]。
在单片机芯片上用C语言编写AES算法, 在轮密钥加过程中, 主函数需要调用密钥扩展函数来实现中间状态密文与轮密钥的异或。其中初始密钥由加密者输入, 在第1次调用密钥扩展函数时, 如图 2所示, 初始密钥通过“for”循环, 将初始密钥每次4字节赋值给形式参量。在代码运行到“for”循环时注入故障, 阻止循环继续运行, 导致函数将前4字节密钥赋值给形式参量, 参与轮密钥扩展运算, 其余12个字节并未被赋值。因此整个加密过程相当于仅前4字节参与加密, 后12字节全置为0。
![]() |
Download:
|
图 2 故障注入攻击模型 |
与现有的DFA分析方法不同, 密钥扩展故障注入攻击减少了参与加密的初始密钥长度, 降低了密钥猜测的计算难度[13]。本文只需要3次成功的攻击就能通过枚举的方法猜测出密钥。第1次攻击密钥扩展“for”循环执行一次以后, 初始密钥将前4字节的密钥赋值给密钥扩展函数形式参量, 经AES加密会得到一组错误密文。本文用计算机枚举所有可能密钥, 不断尝试计算, 直到出现和错误密文一样的结果, 说明输入的这组猜测密钥是正确的[14]。由于攻击后的初始密钥长度只有4字节(32 bit), 因此计算机只需要运算232就能猜测出前4字节密钥。同理第2次攻击“for”循环执行2次后, 得到错误密文, 然后在第1次攻击的基础上, 已知前4字节密钥, 只需用同样方法猜测出后4位密钥。依此类推, 一共猜测4次, 每次枚举运算至多232次, 一共猜测4×232次就能完全破译密钥。
2 电压故障攻击实验电压故障注入攻击是攻击者通过改变芯片外接供电电源, 例如瞬时降低电压值, 使芯片处于非正常的运行状态, 从而跳过某个运算, 达到使芯片故障运行目的的一种攻击方式[15]。通过调整电压毛刺的脉冲宽度、脉冲延时、脉冲幅度, 准确攻击指令运算, 达到跳过密钥扩展中“for”循环语句的目的。
2.1 微处理器判断指令故障测试指令是微处理器处理信息的命令。当指令读取时受到外部故障攻击, 加载数会被篡改, 例如下翻引起篡改。指令二进制码被篡改后会形成新的指令, 如“与”运算指令在被注入故障翻转后可能会变成“或”运算, 2种指令对比, “或”指令计算偏弱, 指令翻转就能泄漏许多加密信息。在密码算法中循环指令是常用的指令语句, 对密码加密复杂程度有着重要的意义, 算法一般使用条件循环语句实现多轮循环加密。条件语句在执行时, 判断条件被存储在指令操作码后缀当中, 因此在翻转过程中, 条件数值可能会被打翻发生改变, 从而造成整个循环发生错误运算。
验证AVR mega16单片机芯片在低压状态下指令的运行情况, 需要搭建指令电压检测平台。由于攻击密码算法的条件循环指令能对算法的加密力度产生极大的影响, 因此本文以攻击循环指令为例进行验证。首先, 在ATmega16单片机芯片中编写用于检测的程序, 程序主要代码如下:
if(1)
USART_Transmit(0xB5);
else
USART_Transmit(0x55);
串口助手将芯片运行数据传输到计算机串口助手显示界面, 通过界面反馈数据了解芯片内部运行情况。如图 3所示, if语句判断条件为“1”就会执行if内嵌语句形成一个死循环, 会不断向计算机串口助手输出十六进制数B5。如果在低压条件下if语句指令被打翻转, 指令条件判断下翻, if语句判断为“0”, 系统就会跳过if内嵌语句而执行else内嵌语句输出十六进制数55。
![]() |
Download:
|
图 3 低压攻击指令流程 |
指令翻转测试实验平台如图 4所示, 一台Agilent3631A数字直流电源为AVR mega16单片机芯片单独供电, 开发板用正常电压供电, 保证开发板其余区域正常运行, 避免其余区域产生故障影响实验准确度。一条RS232串口线将开发板和计算机相连接, 使计算机和开发板进行通信。单片机芯片运行结果能够通过串口助手将数据传输给计算机, 最后计算机显示单片机芯片中代码运行结果。
![]() |
Download:
|
图 4 低压攻击指令测试平台 |
实验将3.5 V芯片供电电压作为起始电压, 以1 mV为步长逐步降低电压, 寻找芯片最合适的故障电压。为确定每个电压值下芯片指令翻转概率, 每个电压值测试20次, 统计出错的次数, 最终找出最佳故障电压值。此外, 为证明每个电压值下产生故障翻转的普遍适用性, 本文对多块AVR mega16单片机开发板进行同样的故障测试实验, 去除个别误差较大的开发板数据, 取其余开发板检测数据平均值, 记录实验信息。图 5为当开发板正常运行时, 串口助手界面接收到的数据, 执行if内嵌语句循环, 向串口助手不断传输十六进制数B5, 表示指令正常执行。
![]() |
Download:
|
图 5 指令正常时反馈数据 |
图 6为指令发生错误时的反馈数据。电压降低导致if语句指令错误执行, 存储在指令操作码后缀的条件信息发生翻转, 改变了判断条件, 原本判断恒为“1”变为判断恒为“0”, 跳出了输出“B5”的无限循环, 开始输出“55”, 表示判断指令已经被打翻转。实验测试程序只包含一条判断语句, 结构简单, 有效避免了在持续电压供电下由于代码指令过多造成多条指令翻转的情况, 确保了实验结果的准确性。
![]() |
Download:
|
图 6 指令正常时反馈数据 |
如表 2所示, 当电压为3 V~3.5 V时, 芯片指令几乎不会出错; 当电压降到3 V时, 芯片执行if指令开始发生错误, 但是发生错误的次数较少; 随着电压逐渐降低, 每个电压值下指令发生错误的几率增大; 当电压值在2.85 V时指令翻转概率最大。重复进行20次条件相同的实验操作, 几乎每次都能产生指令翻转现象, 从而确定该电压值是控制ATmega16芯片判断循环指令产生翻转较为合理的电压值。随着电压值继续逐渐降低, 当电压值低于2.83 V时, 能明显发现低压导致指令发生翻转的次数减少, 且经常出现芯片无法工作的情况。
![]() |
下载CSV 表 2 不同电压值产生指令错误次数 |
上述实验证明低压会使判断指令的后缀数据发生改变, 从而改变语句的原始判断, 造成判断错误。因此, 本文将低压故障注入单片机芯片, 芯片在进行加密运算时, 利用“for”语句对初始密钥进行赋值运算, 如果对“for”循环条件判断条件错误读取, 并跳过循环赋值, 则能达到注入故障的目的。
电压故障注入实验平台如图 7所示, 一台电压毛刺信号发生器、一块单片机开发板、一台搭载串口助手的计算机、一台示波器, 电压毛刺频率、宽度、幅度等参数可以通过计算机进行调节, 也可以通过信号发生器手动设置参数。mega16单片机开发板执行一段特殊程序代码, 首先密码芯片反复执行AES算法, 同时在初始密钥第一次赋值给形式参量时, 对被赋值后的变量值进行读取, 并通过串口助传输给计算机, 通过计算机屏幕显示的返回数据能够直观地判断低压毛刺是否能造成AES算法密钥赋值的错误运行。
![]() |
Download:
|
图 7 电压故障注入攻击实验平台 |
以128位AES算法为例, 该算法一共要进行10轮加密, 每一轮加密都会用一个轮密钥对本轮加密的中间状态密文进行异或运算, 然后进行下一轮加密, 并且在明文进入第一轮加密前, 初始密钥会与明文进行异或运算。AES算法在每一轮加密结束后进行异或运算的轮密钥均由初始密钥通过密钥扩展函数运算得到, 而初始密钥是由加密者外部输入。外部输入的一组16字节密钥, 保存在密码芯片存储单元中, 当密码系统开始加密运算后, 芯片读取16字节的数据, 将数据赋值给形式参量, 参与AES加密运算。AES密钥扩展程序代码如下:
KeyExpansion(byteKey[4*NK],
wordEK[4*(Nr+1]))
{
word temp
for (i=0;i<NK; i++)
EK[i]=(Key[4*i], Key[4*i+1], Key[4*i+2],
Key[4*i+3]);
for (i=NK; i<4*(Nr+1);i++)
temp=EK[i-1];
if (i mod NK=0)
temp=SubWord(RotWord(temp))⊕Rcon[i/NK];
else if ((NK>6)and (i mod NK=4))
temp=SubWord(temp);
EK[i]=EK[i-NK]⊕temp;
}
本文设置正确密钥为“00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF”, 程序反复执行。图 8为单片机芯片正常运行AES算法代码时, 传递给串口助手的值。
![]() |
Download:
|
图 8 正常加密预算密钥值 |
上述代码有2个判断语句, 在2次判断都错误时才确认有故障出现, 避免了实验偶然性。代码一次“for”循环运算154次, 一共进行100次, 每次出现错误后串口助手就会接收到数字“63 35”。本文在程序中写入了接收初始密钥赋值给轮密钥扩展函数形式参量后的值, 通过串口助手的返回值观察故障注入是否成功[16]。将芯片中AES算法的初始密钥设定为“00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF”, 图 9为芯片正常加密时串口助手返回的赋值以后的密钥值。
![]() |
Download:
|
图 9 初始密钥赋值后的反馈值 |
本文攻击实验通过改变芯片电压值对芯片注入故障, 为了排除低压供电对开发板其余元器件影响, 实验将芯片的供电引脚用独立电源供电, 而单片机开发板使用正常的电源电压进行供电, 保证单片机芯片运行故障是由芯片供电电压异常造成的。实验将脉冲信号发生器作为单片机芯片的供电电源, 通过调节脉冲信号发生器参数设置, 产生攻击密码芯片的电压毛刺脉冲波形。芯片在电压为2.85 V时运行指令最容易出错, 因此本文设置一组电压值为3.85 V的直流电压, 电压毛刺幅度设为1V的电压脉冲, 信号发生器在极短的时间内降低电压值, 形成一个电压拉低的低压毛刺尖峰。图 10为脉冲信号发生器的参数设置, 电压毛刺时间宽度为1.11 μs。
![]() |
Download:
|
图 10 脉冲信号发生器参数设置 |
根据实验要求对参数进行设置后, 脉冲信号发生器显示屏上出现的电压毛刺波形如图 11所示, 一组频率为9 kHz的电压脉冲信号, 电压在正常输入直流供电电压后, 突然将低压降低至2.85 V, 整个低压持续时间约为1.11 μs。9 kHz的电压脉冲不是固定值, 此值只要比整个加密算法运行的频率小即可, 确保每个加密过程只注入一次电压毛刺。脉冲宽度1.11 μs是设备能够调试出的最窄脉冲宽度, 时间宽度越窄越能保证单语句注入故障, 而不影响其他语句的正常运行。
![]() |
Download:
|
图 11 电压毛刺波形 |
芯片在低压状态下逻辑算术运算操作、内存读取和判断指令均会发生故障, 同时不同故障类型对电压值大小的要求又不同, 因此实验将电压值降到判读指令出错的电压值, 实施攻击实验。攻击结果如图 12所示, 芯片在赋值结束后返回的密钥值发生了变化, 执行第一次“for”循环内部语句的值被赋值给形式参量, 即设定的前4字节的初始密钥值“00 11 22 33”, 而后12字节的密钥由于没有具体数值赋值进去, 读出值全为“00”, 说明电压毛刺成功攻击了AES算法密钥扩展函数中的初始密钥赋值部分, 造成初始密钥的错误赋值。如果别的位置产生随机故障, 那么系统会返回随机故障引起的密钥值, 返回的密钥不是后12字节为全“0”, 因此没有攻击到正确目标位置, 放弃此次攻击结果, 再重新攻击。单片机芯片在产生实验理想故障后, 原16字节的初始密钥变成了4字节的密钥, 有限次猜测就能获取这4字节的密钥值, 为穷举猜测密钥提供了可能。再通过类似的攻击就能依靠有限次猜测获取完整的16字节初始密钥值, 利用已知的密钥扩展函数就能推导出每一轮加密的轮密钥值。
![]() |
Download:
|
图 12 攻击后密钥返回值 |
本文提出一种针对128位AES算法密钥扩展运算的差分故障分析方法, 在芯片供电电压中注入电压毛刺, 使芯片在执行密钥扩展语句时发生错误执行, 将算法程序的4次初始密钥赋值变为1次, 且未进行赋值的变量全置为0, 使未知密钥空间从128 bit变为32 bit, 从而可枚举恢复密钥。实验结果表明, 该方法攻击注入故障的次数少, 恢复密钥计算方法简单, 计算耗时短。以普通计算机AES算法运行一次的时间约为2.87×10-8s来计算, 完成16字节密钥的枚举耗时为1.44 h, 可在有限时间内攻击成功。
[1] |
苑志刚.抗功耗攻击的AES密码算法硬件设计[D].西安: 西安电子科技大学, 2014. http://cdmd.cnki.com.cn/Article/CDMD-10701-1014331048.htm
( ![]() |
[2] |
KOCHER P C.Timing attack on implementation of Diffe-Hellman, RSA, DSS and other systems[C]//Proceedings of Advances in Cryptology'96.Berlin, Germany: Springer-Verlag, 1996: 104-113.
( ![]() |
[3] |
KOCHER P C, JAFFE J, JUN B.Differential power analysis[C]//Proceedings of Advances in Cryptology'99.Berlin, Germany: Springer-Verlag, 1999: 388-397.
( ![]() |
[4] |
黄显明. 智能卡攻击技术分析及安全防范策略综述[J]. 金卡工程, 2008, 12(4): 49-52. ( ![]() |
[5] |
董礼玲.基于AES算法的抗功耗分析密码芯片的优化设计研究[D].南京: 南京航空航天大学, 2016. http://cdmd.cnki.com.cn/Article/CDMD-10287-1016925835.htm
( ![]() |
[6] |
SKOROBOGATOV S.Local heating attacks on Flash memory devices[C]//Proceedings of 2009 IEEE International Workshop on Hardware-Oriented Security and Trust.Washington D.C., USA: IEEE Press, 2009: 1-6.
( ![]() |
[7] |
PARK J H, MOON S J, CHOI D H, et al. Differential fault analysis for round-reduced AES by fault injection[J]. ETRI Journal, 2011, 33(3): 434-442. DOI:10.4218/etrij.11.0110.0478 ( ![]() |
[8] |
CHOUKRI H, TUNSTALL M.Round reduction using faults[C]//Proceedings of FDTC'05.Washington D.C., USA: IEEE Press, 2005: 13-24.
( ![]() |
[9] |
BIHAM E, SHAMIR A.Differential fault analysis of secret key cryptosystems[C]//Proceedings of Annual International Cryptology Conference.Berlin, Germany: Springer, 1997: 513-525.
( ![]() |
[10] |
LUO Pei, FEI Yunsi, ZHANG Liwei, et al.Differential fault analysis of SHA3-224 and SHA3-256[C]//Proceedings of 2016 Workshop on Fault Diagnosis and Tolerance in Cryptography.Washington D.C., USA: IEEE Press, 2016: 4-15.
( ![]() |
[11] |
BARENGHI A, BREVEGLIERI L, KOREN I, et al. Fault injection attacks on cryptographic devices:theory, practice, and countermeasures[J]. Proceedings of the IEEE, 2012, 100(11): 3056-3076. DOI:10.1109/JPROC.2012.2188769 ( ![]() |
[12] |
RAJA T, AGRAWAL V D, BUSHNELL M L.Minimum dynamic power CMOS circuit design by a reduced constraint set linear program[C]//Proceedings of the 16th International Conference on VLSI Design.Washington D.C., USA: IEEE Press, 2003: 527-532.
( ![]() |
[13] |
DEY P, CHAKRABORTY A, ADHIKARI A, et al.Improved practical differential fault analysis of Grain-128[C]//Proceedings of the 2015 Design, Automation and Test in Europe Conference and Exhibition.New York, USA: ACM Press, 2015: 459-464.
( ![]() |
[14] |
ZHANG Boliang, LI Dong.Differential fault analysis about feistel block cipher[C]//Proceedings of the 6th International Conference on Machinery, Materials, Environment, Biotechnology and Computer.Paris, France: Atlantis Press, 2016.
( ![]() |
[15] |
BENINI L, DE MICHELI G, MACⅡ A, et al.Glitch power minimization by gate freezing[C]//Proceedings of Design, Automation and Test in Europe Conference and Exhibition.Washington D.C., USA: IEEE Press, 1999: 163-167.
( ![]() |
[16] |
韦晓茹, 蔡志坚, 居戬之. AVR单片机ATmega16与计算机串行通信的实现[J]. 微型机与应用, 2012, 31(14): 30-33. DOI:10.3969/j.issn.1674-7720.2012.14.011 ( ![]() |