个人学习笔记,侧信道攻击,从喊666到入门之——差分能量攻击初探

前言算法


最近在作老师留的翻译做业的时候。发现了不少有关于侧信道攻击的文章。目前,在国内的安全圈子中不多看到与侧信道有关的内容,但愿这篇能够作一个补充。spring

我先挖个坑,但愿会写3篇,这是第一篇,差分能量攻击(DPA),第二篇多是cache攻击,第三篇TEMPEST攻击,我但愿我会写完。安全

学习一项技能最好的办法就是亲手操做一下,斯普林格出版社出版的侧信道攻击年刊里的一篇文章,做者使用DPA攻击了一个没有设防的IC卡,而且给出了完整的数据集;www.dpabook.org 上也有可有完整的能量轨迹和matlab代码示例,这样就给了咱们动手练习的基础,我也加入了其余我读到的一些内容,这篇文章是个人一个总结,若是有错误,但愿各位前辈提醒指正。架构

 

I.背景知识ide


芯片在运行的时候,因为数据或者逻辑的不一样,内部的晶体管通断是有区别的,经过这个区别来肯定程序内部的数据或者指令,就是侧信道攻击。获取这个区别有不少方法,好比在芯片的GND引脚处获取电压,经过探针去截取芯片辐射的变化等等。函数

咱们的身边有不少密码学设备,好比你们的银行卡,门禁卡手机卡等等,侧信道攻击原来主要是针对这些设备的,但是随着人们对侧信道攻击的重视,密码学设备都增长了对侧信道攻击的防御,(固然,有一些没有防御),侧信道攻击和信息安全的其余技术同样,都是一个动态发展的过程。学习

侧信道攻击近几年也在智能硬件的攻击上被使用,好比2016年,就有人使用SPA(另外一种侧信道攻击方法)攻击了一个智能保险箱。总之,侧信道攻击对于运算单一,时钟频率低(时钟频率低这点很重要)的设备中的加密攻击是颇有效的。测试

在本文的第二部分,我会简单介绍一下攻击的流程,给你们创建起一个思惟架构;第三部分,我会先使用网站上和书中的能量轨迹结合攻击的使用的算法开展一个真实的攻击,第四部分,我会说一些多样话的攻击方法和能量轨迹的获取。最后,我会给你们推荐一些有关于这个方面的书和文档。ps:怎么有写论文的感受。优化

 

II.攻击流程网站


针对与全部的侧信道攻击(包括DPA,TEMPSET,cache泄露等)主要就是两个思路,第一个就是侧信道泄露的截取,第二个是信息的恢复。本节我会主要介绍这两点(只针对这种小设备中的密码学攻击的状况)。

1.信息的截取

设备上,示波器是必须的,不管如何,示波器必定要有把数据传输给电脑的能力,由于以后的处理都是使用matlab进行的。根据《能量分析攻击》这本书中的介绍,针对芯片,主要有如下几种获取泄露的方法。

在GND引脚处串联一个小电阻,大概是1~50欧姆,以后使用示波器测量电阻上的电压。

使用电场探针或者磁场探针获取芯片的电磁泄露。

还有不少其余的方法,好比什么表面扫面法,工做台法拉第笼法等等,这仍是要根据具体状况去具体分析。在这里,咱们将使用《能量分析攻击》这本书里配套的能量轨迹,这个训练集是使用小电阻耦合获得的。

2.信息的恢复

这种类型的侧信道攻击,主要有简单能量分析攻击差分能量分析攻击等。

简单能量分析攻击:

简单一点说,就是把能量轨迹显示出来以后用眼睛“看”,固然,也有不少辅助看的方法,好比模板碰撞。SPA的有点是须要的能量轨迹少,缺点是须要泄露比较明显,对噪音的敏感性大。这不是咱们的重点,就不说了,有兴趣的师傅能够看我后面推荐的书。ps:主要是我不太熟悉,逃。。。。

差分能量攻击:

和模板相似,咱们要使用已知的明文或者密文对加密算法的一个步骤进行匹配。能够说成只针对一个步骤的密钥的爆破。DPA的优势是,即便泄露较小,也能够有效识别,有自然的对噪音的过滤,缺点是须要的能量轨迹不少。

DPA的基本想法就是,经过大量的能量轨迹计算能量轨迹和数据的依赖性。

获取能量轨迹:

首先,咱们要肯定一个中间值f(d,k),这个f通常是密码学算法的一个中间值,d必须是已知的,咱们整个DPA的目的就是求k,k多是密钥的一部分,或者密钥派生出来的值。接下来,使用示波器去接受对应的能量轨迹。完成以后咱们有两个矩阵,第一个矩阵是一个只有一列的矩阵(或许应该叫向量),内容是咱们已知的或者是可控的d值,长度是len(d),咱们叫他大D。第二个矩阵T是一个len(d)*T的矩阵,T是采样的点数,也就是能量轨迹的长度。每个d对应矩阵C的一行。这里牵扯到能量轨迹对齐的问题,咱们会在第四节讨论这个问题。

计算假设的中间值:

接下来,咱们须要一个向量大K,大K应该包含全部小k,即遍历全部k的密钥空间。以后,使用矩阵D和矩阵大K生成矩阵V,使用以下的伪代码进行解释。

 

for i = 1:1:len(D)
for n = 1:1:len(K)
V(i,n) = f(D[i],K[n]); 
    end
end

 

 

这样,咱们就获得了矩阵V,矩阵V的每一行是已知值d相同,密钥K不一样,每一列是密钥值k相同,已知值不一样。

生成能量模型:

这一步,咱们使用上文的V矩阵生成一个对应的矩阵H,矩阵H的名字叫假设能量消耗模型,其中的值就是咱们假设的能量消耗值。

有不少方法去得到这个能量的消耗值,好比使用器件级别甚至晶体管级别的仿真,但是这样就须要对芯片的结构有很深的了解,牵扯到了“芯片逆向”这门武林绝学。实际上,有不少简易的方法能够作到一样的效果。好比汉明距离和汉明重量。

看一串二进制:00111010,10001110,汉明距离是两个二进制数中,0到1或者1到0的转换的个数,在这里,就是4,由于第1,3,4,6位有转换。汉明重量是二进制数中1的个数,这两个二进制数的汉明重量都是4。

一样的,还有不少方法能够,咱们会在第四节继续讨论。

比较两个能量轨迹

这个比较有不少种模型和方法,咱们只说一种最经常使用的,基于相关系数的攻击。在这一步,咱们参与运算的矩阵是测量的矩阵C和咱们生成能量的模型V。计算方法以下。

 

[d1,k] = size(H);
[d2,t] = size(T);
for i = 1:1:k
for j = 1:1:t
ans = corrcoef(H(:,i),T(:,j));
R(i,j) = ans(1,2); 
    end
end

 

 

以后,咱们就能够获得相关系数矩阵R,每一行表明真实的密钥值和咱们假设的密钥值的相关系数,最大的哪条,就是咱们要找的密钥值,对应的T时刻,就是这一步中间函数执行的时刻。

 

III.演示实例


咱们先来回忆一下数学符号的问题:

f(d,k)函数:这是密码学计算的一个中间步骤,d是咱们已知的明文或者密文,k是咱们要获取的部分密钥。

D,一个向量,里面储存着咱们已知的明文或者密文d。

K,一个向量,遍历全部可能的密钥值k。

T,一个矩阵,每一行是随时间变化而变化的能量值,行数是已知的明文或密文d的数量。

V,一个矩阵,是使用f函数计算了全部可能D,K以后的值。

H,把矩阵V的每一位使用生成能量模型计算以后的值,大小与V相同。

我使用网站上的能量轨迹进行测试,它包含了3个能量轨迹,ws1-3,我使用最通常化的ws3能量轨迹。

什么叫最通常化呢,就是实际状况中,攻击者能够相对轻松获取的轨迹。好比,获取到的能量轨迹是失调的。失调的缘由多是在获取矩阵T的时候,原本要求的是全部的采样点数应该是与芯片内部执行的时间对齐的,但是这在现实中是不太可能彻底对齐的,由于这须要很当心的去设置示波器的触发。或者是芯片使用了乱序操做来对侧信道进行防护。

我先直接给出他的代码和运行以后的结果,并使用注释对代码进行解释。

 

load('WS3.mat');
%{
  aes_plaintexts:    可知的输入值,也就是矩阵D,这里大小是1000*16,也就是有16次不一样的输入,咱们这里只对第一次进行攻击
  traces_noDummy:    能量轨迹,没有插入随机指令做为防御,1000*25000也就是矩阵T
  traces_withDummy:  能量轨迹,插入了随机指令做为侧信道攻击防御,1000*25000也就是矩阵T
  HW:                用来储存汉明重量,便于后面调用        
%}
samples = 1000;
%选择是否进行了随机插值的能量轨迹,下文会进行对比
analyzed_traces = 'traces_noDummy';
%analyzed_traces = 'traces_withDummy';
%选择哪条能量轨迹进行攻击,一共有16条
byte_to_attack = 1;
more off
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 读取存储空间中aes_plaintexts的第一列
D = aes_plaintexts(1:samples, byte_to_attack);
clear aes_plaintexts byte_to_attack
% 选择能量轨迹
eval(sprintf('traces = %s(1:samples, :);', analyzed_traces));
clear analyzed_traces
%密钥有256种可能,K的空间是256
K = uint8(0:255);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TASK 2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 计算中间值,这个就是上文中的f(d,k),这个函数的选取就是咱们须要攻击的函数,计算以后是矩阵V
V = SubBytes(bitxor(repmat(D, 1, length(K)), repmat(K, samples, 1)) + 1);
% 使用汉明重量计算假设能量值,计算以后是矩阵H
H = HW(V+1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 计算相关性
tr_length = size(traces, 2);
R = zeros(length(K), tr_length);
for key_idx = uint16(K)+1
    fprintf('Working on key guess = %d\n', K(key_idx));
     
    %下面计算相关系数矩阵
    for k = 1:tr_length
        r = corrcoef( [double(H(:,key_idx)) double(traces(:,k))] );
        R(key_idx, k) = r(1, 2);
    end
end
clear key_idx k r
%下面我改了一些,有助于快速定位攻击成功的位置
[b,c]=max(max(R'));  % c的值就是对应的正确密钥值
plot(R(c,:));

 

 咱们看下攻击的结果(运行时间比较长)。下面是TASK 2运行以后,正确密钥0x10的图。图3_1

相比于不正确的密钥,相差很大。图3_2

http://p3.qhimg.com/t01179bd511fa5ef90d.png

对于没有进行很好对对齐的能量轨迹(matlab脚本中选择analyzed_traces = 'traces_withDummy';),也有明显的相关性峰值,只不过最大值会缩小。图3_3

http://p4.qhimg.com/t015565090dcf8e8cfb.png

 

IV.尾声


1.优化

咱们先来考虑一下,有什么能够优化的。

因此先要来考虑,为何要优化。

优化,就是为了可使用更少的能量轨迹,去攻击泄露更不明显的能量轨迹。或者是绕过一些防护手段,好比掩码防御,或者针对不知到计算细节的特殊加密方案的攻击,等等。

咱们再来看一看,有什么地方值得优化,好比生成假设能量模型和对比假设能量模型和实际能量模型,可使用不一样的模型使得获取到的假设模型和比较结果更优化。咱们的示例只针对了一个中间量来进行计算,那么对于使用了掩码的能量轨迹,咱们可使用几个中间量进行高阶DPA攻击。对于不知道具体计算过程的算法,可使用旁路立方体攻击,等等。须要优化的地方还不少。

2.能量轨迹的获取

这是个很重要的问题,我没有单独拿出一章来说的缘由是我没有实际操做过,主要是由于没钱买适合的示波器。我会简单的介绍一下。

在2017年斯普林格出版的 Hardware Security and Trust 年刊第四篇 Practical Session: Differential Power Analysis for Beginners中,介绍了做者获取IC卡能量轨迹的方法,具备很强的通用性,能够借鉴一下。待我有钱买示波器以后,我也会本身动手作一遍。

diy一个板子,引出IC卡的接触引脚,如图4_1

http://p1.qhimg.com/t01971b6b7d32a69a83.png

以后按以下的方法接线,一路测量数据,另一路测量功率图4_2

http://p0.qhimg.com/t0110525ed5d84f46f7.png

使用JSmartCard Explorer经过一个读卡器与接触式IC卡进行交互,使用 PicoScope 6 GUI读取能量轨迹。4.4

http://p6.qhimg.com/t01484e8c13bf94a389.png

图4_3

http://p7.qhimg.com/t019530e38a9b751861.png

 

V.参考


《能量分析攻击》(奥地利)Stefan Mangard、Elisabeth Oswald、Thomas Popp,冯登国,周永彬,刘继业 译 科学出版社。以及配套网站,www.dpabook.org(入门好书)

《密码旁路分析原理与方法》郭世泽 王韬 赵新杰 科学出版社 (进阶必备)

N本斯普林格出版社(springer)年刊 Constructive Side-Channel Analysis and Secure Design

N本斯普林格出版社年刊 Hardware Security and Trust

文件下载

连接:https://pan.baidu.com/s/1hrSJkf6   密码:qgh8

相关文章
相关标签/搜索