在N久以前的上篇文章中,咱们讨论了如何对已经采集好的能量轨迹进行侧信道攻击,可是,有个问题我挖了一个坑,就是如何对芯片的能量轨迹进行采集。今天我会讨论这个问题。前端
本文会先介绍采集设备和相应的示波器使用和通讯上的一些知识,以后介绍三种进行能量轨迹采集的方法和注意事项,并对比他们的优缺点,最后说一下我在采集中的噪音控制问题。算法
目前,我可使用的有三台示波器,一台USRP和一个Chipwhisperer,三台示波器的性能分别是:编程
品牌型号 | 模拟带宽 | 最大采样率 | 价格 |
---|---|---|---|
梦源实验室 dscope20 | 50Mhz | 200M | 499 |
RIGOL DS1074 | 70Mhz | 1G | 2800 |
汉泰 DSO3254 | 250Mhz | 1G | 2400 |
其中,dscope和汉泰dso3254是虚拟示波器,没有屏幕,须要使用usb或者网线链接电脑,使用电脑屏幕显示,而RIGOL DS1074是传统的示波器。USRP 型号是B210,因为超外差接收机结构,USRP有很大的频率覆盖范围。安全
解释一下模拟带宽和采样率的问题。电路板和接口,因为物理缘由,不可能容纳全部频率的信号,频率越高,在电路板上的衰减和失真程度越大。这样的话,示波器的模拟前端就等效为一个低通滤波器,当正弦波输入信号幅度衰减到 -3dB 时的频率就是标注的模拟带宽。模拟带宽直接决定了一个示波器能够测量的最大保真频率,固然是越大越好。ide
最大采样率是指信号通过模拟带宽以后,进入了模数转换的阶段,这时候,模数转换系统会以采样率为频率对波形进行采样,由连续的波形编程离散的点,只有这样,才能进行后续的数字信号处理。对于正弦波,采样频率要不小于2倍正选波频率才能不失真的恢复出波形。函数
举一个极端的例子,我要测量一个波形,这个波形中,有意义的频率份量最大是10Mhz,那么个人示波器模拟带宽不能低于10Mhz,采样率不能低于20M,只有知足这两点,才有可能完整保留有意义的信息。post
上文中咱们说“有可能完整保留”,是由于咱们缺乏了一个重要的部件,滤波器。咱们的示波器的采样率是1G,也就是说最大只能恢复出500Mhz的正弦波。那么大于500Mhz的部分就会因为不完整的采样变成一些低频成分对信号产生干扰。虽然有模拟带宽等效滤波器进行了限制,可是若是采样时间超过了储存深度,示波器会进行采样率的主动降低。对于本文中的设备,50Mhz的低通滤波器就足能够了。性能
通常来讲,示波器也有带宽限制的功能,RIGOL DS1074 和 汉泰 DSO3254都有20Mhz的带宽限制,打开以后的效果能够等效为增长了低通滤波器。测试
另一个部件就是探头了,探头的做用就是把数据引入示波器。探头也是有模拟带宽的,物理缘由和示波器的模拟带宽同样。选择的时候带宽不要低于示波器。探头上有一个开关,两个挡位,X1和X10,X10挡位的带宽通常大于X1挡位,可是因为衰减,信号强度也会少不少,能够经过加放大器进行改良。3d
匹配阻抗是传输线理论中很重要的概念,通常状况下,通讯设备的匹配阻抗都是50欧姆(广电传媒通讯中是75欧姆),而示波器的阻抗都是1M,部分高端示波器也有50欧姆的输出。若是使用了放大器,那么就要进行阻抗的匹配,可使用阻抗转换器进行阻抗的匹配。接收时候,若是阻抗不匹配,会影响信号采集的质量。
本实验中,我使用了一个STC15的C51单片机运行AES128,芯片的封装图以下:
因为其内置了起振电路和复位电路,因此电路板上只有芯片排针和采样电阻,如图:
这种方法须要在芯片的GND引脚和真实0电位点中间串联一个小电阻(本实验中为10欧姆),以后测量这个电阻上的电压波动。本实验中如图所示:
这种方法获取到的信号是特别干净的,咱们能够清晰的看见AES执行的九轮半结构(AES最后一轮没有MixColumns)。
这种方法的缺点也是很大的,在实际的产品中,去除GND引脚的焊接,接入小电阻是十分困难的事情。这种方法通常用在能够直接供电的设备中,例如演示板或者各类接触式卡片。
这种方法直接测量芯片的电压波动,探头链接在芯片的VCC和GND引脚:
这种方法能够直接焊接上去,不须要进行拆焊这种高难度动做。相应的采集到的信号信噪比也会低一些,可是仍是能够清晰的看出来AES128的轮结构:
这种方法在信噪比和链接难度上都还能够,是比较好的一种方法。可是,对于多核SOC或者使用AES协处理器进行运算的状况,信噪比就会大大下降。
一个SOC中,每一个核心或者协处理器是不可能作在一个位置上的,必定有物理上的距离,这样就可使用性能优良的电磁探头进行采集。能够完成这种精度电磁采集的探头价格都在几万到几十万,同时须要微动台进行细微距离的移动(人手的精度就不用想了),因为穷,这种采集方法对我来讲也就是,想想。
最重要的体会就是,搞硬件安全真**费钱。
在上一步的采集中,咱们使用了在芯片VCC和GND引脚上的电压波动。若是仔细观察一下,就能够发现实际上测量的除了芯片上的电压,还有电源的噪音,这种状况下,电源的波纹会完整的混入采集信号中,因此要采用更好的供电设备,通过个人测试,断开充电器的笔记本电脑USB供电和稳压电源供电效果是比较好的,手机充电器USB供电和充电宝效果不好,要说电源波纹最好的,应该是iPower的电源适配器,标称能够达到1uA的波纹,可是价格也比较贵。这里有一个小窍门,若是想节约成本,可使用干电池,它的的波纹特别小。
对于其余方式的采集,对电源噪音的控制也要有考虑,特别是微弱信号的采集。同时,也要考虑50Hz工频噪音和日光灯镇流器的噪音。
下图是我所在的实验室中,一个10CM左右导线上存在的干扰:
VISA(Virtual Instrument Software Architecture,简称为”Visa”),即虚拟仪器软件结构,是VXI plug&play联盟制定的I/O接口软件标准及其规范的总称。VISA提供用于仪器编程的标准I/O函数库,称为VISA库。VISA函数库驻留在计算机系统内,是计算机与仪器的标准软件通讯接口,计算机经过它来控制仪器。
可编程仪器标准命令(英语:Standard Commands for Programmable Instruments,缩写:SCPI)定义了一套用于控制可编程测试测量仪器的标准语法和命令。
(以上两段抄的百度百科)
总的来讲,这两种功能提供了计算机程控示波器的接口,对于支持SCPI示波器,都有各自的SCPI指令。
程控的好处就是,能够自动化的获取波形,便于后续的攻击操做,对于某些上位机写的实在太丑的虚拟示波器(就是说你呢,DSO3254),能够本身魔改。
因为每一个示波器的指令或者协议不一样,有些是本身的协议,因此在此不展开。我倾向于使用通用协议的示波器,这样对于之后的移植很方便。
采集中,因为示波器以极快的速度进行采集,分析全部的数据找到咱们感兴趣的区间,不管在空间复杂度仍是运算复杂度上都是不可能的。这个时候,就须要告诉示波器,在何时开始采集。本例中,我编写的程序的时候,人工设置了一个触发信号,在执行AES计算的时候,把P0.0引脚拉高,执行以后,把P0.0引脚拉低。
在真实的物联网设备中,是不可能存在这种触发信号的,因此,须要采用波形触发或者指令触发。指令触发有两种,主动触发和被动触发。主动触发就是主动发出指令,让芯片运行关键代码,发出指令的同时给示波器触发信号;被动触发是指经过前期的观察,获得芯片运行关键代码以前的指令流,并记录,使用一个独立硬件,在状态机捕获了相同或类似逻辑的时候直接给示波器触发信号,通常这种硬件都是独立于PC的以保证速度,例如Riscure的spider。
通常来讲,示波器的全部GND引脚都是相通的,若是使用多个探头的时候,不一样探头的GND之间存在电压差,就会产生电流。链接的时候,要综合考虑被测电路的结构,避免出现短路影响测量甚至烧坏仪器。
最后给你们AES执行第一轮附近和最后一轮附近的两张图,你们能够对比AES128的算法,猜一下字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)的位置,静静聆听芯片的低声耳语。
(AES第一轮)
(AES最后一轮和倒数第二轮)