zoukankan      html  css  js  c++  java
  • 我的学习笔记,侧信道攻击,从喊666到入门之——波形采集

    ​在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 时的频率就是标注的模拟带宽。模拟带宽直接决定了一个示波器可以测量的最大保真频率,当然是越大越好。

    ​ 最大采样率是指信号经过模拟带宽之后,进入了模数转换的阶段,这时候,模数转换系统会以采样率为频率对波形进行采样,由连续的波形编程离散的点,只有这样,才能进行后续的数字信号处理。对于正弦波,采样频率要不小于2倍正选波频率才能不失真的恢复出波形。

    ​ 举一个极端的例子,我要测量一个波形,这个波形中,有意义的频率分量最大是10Mhz,那么我的示波器模拟带宽不能低于10Mhz,采样率不能低于20M,只有满足这两点,才有可能完整保留有意义的信息。

    滤波器

    ​ 上文中我们说“有可能完整保留”,是因为我们缺少了一个重要的部件,滤波器。我们的示波器的采样率是1G,也就是说最大只能恢复出500Mhz的正弦波。那么大于500Mhz的部分就会由于不完整的采样变成一些低频成分对信号产生干扰。虽然有模拟带宽等效滤波器进行了限制,但是如果采样时间超过了储存深度,示波器会进行采样率的主动下降。对于本文中的设备,50Mhz的低通滤波器就足可以了。

    ​ 一般来说,示波器也有带宽限制的功能,RIGOL DS1074 和 汉泰 DSO3254都有20Mhz的带宽限制,打开之后的效果可以等效为增加了低通滤波器。

    探头与匹配阻抗

    ​ 另外一个部件就是探头了,探头的作用就是把数据引入示波器。探头也是有模拟带宽的,物理原因和示波器的模拟带宽一样。选择的时候带宽不要低于示波器。探头上有一个开关,两个挡位,X1和X10,X10挡位的带宽一般大于X1挡位,但是由于衰减,信号强度也会少很多,可以通过加放大器进行改良。

    ​ 匹配阻抗是传输线理论中很重要的概念,一般情况下,通信设备的匹配阻抗都是50欧姆(广电传媒通信中是75欧姆),而示波器的阻抗都是1M,部分高端示波器也有50欧姆的输出。如果使用了放大器,那么就要进行阻抗的匹配,可以使用阻抗转换器进行阻抗的匹配。接收时候,如果阻抗不匹配,会影响信号采集的质量。

    实验设备

    硬件配置

    ​ 本实验中,我使用了一个STC15的C51单片机运行AES128,芯片的封装图如下:

    ​ 由于其内置了起振电路和复位电路,所以电路板上只有芯片排针和采样电阻,如图:

    采集方法

    GND漏电流

    ​ 这种方法需要在芯片的GND引脚和真实0电位点中间串联一个小电阻(本实验中为10欧姆),之后测量这个电阻上的电压波动。本实验中如图所示:

    获取的信号如图所示:

    ​ 这种方法获取到的信号是特别干净的,我们可以清晰的看见AES执行的九轮半结构(AES最后一轮没有MixColumns)。

    ​ 这种方法的缺点也是很大的,在实际的产品中,去除GND引脚的焊接,接入小电阻是十分困难的事情。这种方法一般用在可以直接供电的设备中,例如演示板或者各种接触式卡片。

    芯片电压

    ​ 这种方法直接测量芯片的电压波动,探头连接在芯片的VCC和GND引脚:

    ​ 这种方法可以直接焊接上去,不需要进行拆焊这种高难度动作。相应的采集到的信号信噪比也会低一些,但是还是可以清晰的看出来AES128的轮结构:

    ​ 这种方法在信噪比和连接难度上都还可以,是比较好的一种方法。但是,对于多核SOC或者使用AES协处理器进行运算的情况,信噪比就会大大降低。

    电磁波

    ​ 一个SOC中,每个核心或者协处理器是不可能做在一个位置上的,一定有物理上的距离,这样就可以使用性能优良的电磁探头进行采集。可以完成这种精度电磁采集的探头价格都在几万到几十万,同时需要微动台进行细微距离的移动(人手的精度就不用想了),由于穷,这种采集方法对我来说也就是,想一想。

    其他注意事项

    ​ 最重要的体会就是,搞硬件安全真**费钱。

    噪音控制

    ​ 在上一步的采集中,我们使用了在芯片VCC和GND引脚上的电压波动。如果仔细观察一下,就可以发现实际上测量的除了芯片上的电压,还有电源的噪音,这种情况下,电源的波纹会完整的混入采集信号中,所以要采用更好的供电设备,经过我的测试,断开充电器的笔记本电脑USB供电和稳压电源供电效果是比较好的,手机充电器USB供电和充电宝效果很差,要说电源波纹最好的,应该是iPower的电源适配器,标称可以达到1uA的波纹,但是价格也比较贵。这里有一个小窍门,如果想节约成本,可以使用干电池,它的的波纹特别小。

    ​ 对于其他方式的采集,对电源噪音的控制也要有考虑,特别是微弱信号的采集。同时,也要考虑50Hz工频噪音和日光灯镇流器的噪音。

    ​ 下图是我所在的实验室中,一个10CM左右导线上存在的干扰:

    VISA与SCIP指令

    ​ 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引脚都是相通的,如果使用多个探头的时候,不同探头的GND之间存在电压差,就会产生电流。连接的时候,要综合考虑被测电路的结构,避免出现短路影响测量甚至烧坏仪器。

    尾声

    ​ 最后给大家AES执行第一轮附近和最后一轮附近的两张图,大家可以对比AES128的算法,猜一下字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)的位置,静静聆听芯片的低声耳语。

    (AES第一轮)

    (AES最后一轮和倒数第二轮)

  • 相关阅读:
    解决:Could not resolve archetype org.apache.maven.archetypes
    Spring MVC配置MyBatis输出SQL
    Spring集成MyBatis 通用Mapper以及 pagehelper分页插件
    关于SpringMVC或Struts2接受参数接收不到的原因
    配置quartz启动时就执行一次
    ajaxFileUpload进行文件上传时,总是进入error
    spring mvc注入配置文件里的属性
    java中将一个文件夹下所有的文件压缩成一个文件
    flume failed to start agent because dependencies were not found in classpath
    ubuntu不能安装pip unable to install pip in unbuntu
  • 原文地址:https://www.cnblogs.com/backahasten/p/9756795.html
Copyright © 2011-2022 走看看