侧信道实验实验二 S盒DPA侧信道攻击

本文介绍S盒侧信道攻击的基本原理与方法,重点讲解汉明重量攻击模型及DPA攻击的应用,通过实例演示如何利用汉明重量差异确定正确密钥。

---------------------------------------202/12/19 更新---------------------------------------
在输入时除了密钥的遍历范围因为DES的S盒的“6进4出“机制导致范围限定在0-63以外,明文在作为S盒输入的时候也是被限制在每组长度为64。我将明文数组长度从1000更新为64后的猜测正确率也是100%。
-------------------------------------------起始内容-------------------------------------------

实验目的

  1. 掌握S盒侧信道攻击的基本原理;
  2. 掌握汉明重量攻击模型;
  3. 掌握DPA攻击基本原理和方法。

实验人数

每组1人

系统环境

Windows

实验原理

  1. 测量阶段,选取随机数量明文和设定好的正确密钥进行异或,得到的6bit结果作为S盒的输入,S盒的输出需统计二进制中1的个数,作为汉明重量,所有输出得到一个汉明重量数组。
  2. 攻击阶段,需要遍历密钥的所有可能,每次遍历都需经历测量阶段,最后得到所有猜测密钥的汉明重量数组,且每个都需要计算数组元素中间值,作为划分正确密钥得到的汉明重量数组的依据,正确密钥得到的汉明重量数组划分成两个集合,分别计算 x H ‾ = 1 ∣ H ∣ ∑ i ∈ H x i \overline{x_H}=\frac{1}{\lvert H \rvert}\sum_{i\in H}^{}{x_i} xH=H1iHxi x L ‾ = 1 ∣ L ∣ ∑ i ∈ L x i \overline{x_L}=\frac{1}{\lvert L \rvert}\sum_{i\in L}^{}{x_i} xL=L1iLxi,其中 ∣ ∣ || 表示集合元素大小,得到差值求均值差 D p a V a l u e = x H ‾ − x L ‾ DpaValue=\overline{x_H}-\overline{x_L} DpaValue=xHxL,最后选择所有差值最大的所对应的猜测密钥为正确密钥。

实验内容

  1. 完成Sboxdpa仿真-student.py程序中的空缺部分

    • 补充n、plaintext、keyTrue

    • 补充HWfun函数,返回输入的汉明重量

    • 补充主函数,得到输出相应的汉明重量向量

  2. 完成Sboxdpa-student.py文件中的空缺部分,即

    • 补充plaintext、power_std

    • 补充DPAfun函数,计算汉明差值

    • 补充主函数,求正确猜测密钥

  3. 实验测试2组数据

实验步骤

完善Sboxdpa仿真-student.py程序

补充变量

补充n、plaintext、keyTrue三个变量

n = 9	#数组长度
plainlist = [41, 35, 62, 4, 33, 44, 22, 46, 18]	#明文数组
keyTrue = 43	#加密所用密钥
完善HWfun函数

本质上是计算十进制数转换成二进制后含1的数量,则可以采用快速法计算。这种方法运算次数与输入n的大小无关,只与n中1的个数有关。如果n的二进制表示中有k个1,那么这个方法只需要循环k次即可。其原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0。

补充代码如下:

def HWfun(num):
    # 统计输入num的汉明重量并返回
    ans = 0
    if num == 0:
        return 0
    while num > 0:
        num &= (num - 1)
        ans += 1
    return ans

为什么n &= (n – 1)能清除最右边的1呢?因为从二进制的角度讲,n相当于在n - 1的最低位加上1。举个例子,8(1000)= 7(0111)+ 1(0001),所以8 & 7 = (1000)&(0111)= 0(0000),清除了8最右边的1(其实就是最高位的1,因为8的二进制中只有一个1)。再比如7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110),清除了7的二进制表示中最右边的1(也就是最低位的1)。

完善主函数

使用表格美化库完善输出。

补充代码如下:

if __name__ == "__main__":
    # 补充:S盒输出对应汉明重量列表
    table = pt.PrettyTable()
    hw_std = []
    HWout = sboxout(n, plainlist, keyTrue)
    for i in range(n):
        hw_std.append(HWfun(HWout[i]))
    table.add_column('序号',[i for i in range(1,n+1)])
    table.add_column('明文-十进制',[index for index in plainlist])
    table.add_column('S盒输出-十进制', [index for index in HWout])
    table.add_column('S盒输出-汉明重量', [index for index in hw_std])
    print(table)
程序运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

图6.1     程序Sboxdpa仿真-student.py的表格输出

完善Sboxdpa-student.py程序

补充变量

我在此程序中采用的plaintlist数组(明文数组)是由plainlist = list(np.random.randint(64, size=1000))函数生成的1000长度的数组,模拟教材上的运行基数。同理,power_std数组(正确密钥处理得到的汉明重量数组)同样长度1000,数组内的元素展示位置在8.4数据统计中,“明文数组长度为1000”那里。

完善DPAfun函数

Meanfun函数我有所改动:

def Meanfun(num):
    total = 0
    length = len(num)
    if length == 0:
        return 0
    for i in range(length):
        total = total + num[i]
    return total / length

函数思想是取使用猜测密钥处理的汉明重量数组的中间值作为划分使用正确密钥处理的汉明重量数组的依据,随后,函数返回划分后集合的差值。

补充代码如下:

def DPAfun(n, pstd, ptest):
    # 以2为界,计算不同汉明重量的集合差值
    L_list = []
    H_list = []
    med = median(ptest)
    for i in range(n):
        if ptest[i] <= med:
            L_list.append(pstd[i])
        else:
            H_list.append(pstd[i])
    return Meanfun(H_list) - Meanfun(L_list)
完善主函数

运行逻辑&思路为遍历所有密钥——64个,将明文和每个密钥异或后的结果作为S盒的输入,得到S盒的输出(模拟DES处理流程),并求得64个汉明重量数组,将64个汉明重量数组带入DPAfun函数进行运算,取DPAfun函数返回值中的最大值对应的密钥,即为正确密钥。

因为DES的

侧信道攻击中,S是一个关键部分,以下为你介绍S侧信道攻击实验的相关信息。 ### 原理 S是分组密码中的一种非线性变换组件,在很多加密算法如AES等中广泛使用。侧信道攻击通过收集加密过程中泄露的物理信息,像功耗、电磁辐射、执行时间等,来推断出加密密钥。在针对S侧信道攻击中,主要是利用S操作时产生的侧信道信息,因为不同的输入会使得S的输出不同,进而导致侧信道信息有差异,攻击者可以利用这些差异来推测密钥。 ### 实验方法 - **功耗分析**:在加密过程中,芯片的功耗会随着操作的不同而变化。不同的S输入会让芯片产生不同的功耗曲线,通过对大量功耗曲线进行统计分析,就能找出与密钥相关的信息。常见的功耗分析方法有简单功耗分析(SPA)和差分功耗分析(DPA)。SPA直接观察功耗曲线的特征来推断密钥;DPA则是对大量功耗曲线进行差分处理,增强与密钥相关的信号,抑制噪声。 - **电磁分析**:芯片在工作时会产生电磁辐射,不同的S操作会产生不同的电磁信号。通过使用电磁探头收集电磁信号,再进行分析,也可以推断出密钥信息。 ### 操作步骤 1. **实验准备** - **硬件方面**:准备目标加密设备(如开发板、智能卡等)、侧信道采集设备(如示波器、电磁探头等)、电源模块等。 - **软件方面**:安装好用于控制采集设备的软件、数据分析软件(如MATLAB、Python等)以及目标加密算法的实现代码。 2. **数据采集** - 给目标加密设备输入不同的明文,同时使用侧信道采集设备记录每次加密过程中的侧信道信息(如功耗曲线、电磁信号等)。通常需要采集大量的数据,以提高分析的准确性。 - 对采集到的数据进行初步处理,如去除噪声、归一化等。 3. **分析模型建立** - 选择合适的分析模型,例如汉明重量模型或汉明距离模型。这些模型用于描述S输出与侧信道信息之间的关系。 - 根据选择的分析模型,计算不同密钥假设下的理论侧信道信息。 4. **统计分析** - 将采集到的实际侧信道信息与理论侧信道信息进行比较。可以使用相关系数分析、互信息分析等方法,找出实际侧信道信息与哪个密钥假设的理论侧信道信息最匹配。 - 不断调整密钥假设,重复进行比较,直到找出最可能的密钥。 5. **密钥验证** - 使用推测出的密钥对已知明文进行加密,将加密结果与实际的密文进行比较。如果结果一致,则说明推测的密钥是正确的。 以下是一个简单的Python示例代码,用于模拟差分功耗分析的部分过程: ```python import numpy as np # 模拟采集到的功耗曲线 power_traces = np.random.rand(100, 1000) # 100条功耗曲线,每条曲线1000个采样点 # 模拟不同的明文 plaintexts = np.random.randint(0, 256, (100, 16)) # 100个明文,每个明文16字节 # 假设的S sbox = np.random.randint(0, 256, 256) # 计算汉明重量 def hamming_weight(x): return bin(x).count('1') # 差分功耗分析 key_guess = [] for byte_index in range(16): max_correlation = -1 best_key = 0 for key in range(256): # 计算中间值 intermediate_values = [sbox[plaintexts[i][byte_index] ^ key] for i in range(100)] hamming_weights = [hamming_weight(val) for val in intermediate_values] # 计算相关系数 correlation = np.corrcoef(hamming_weights, power_traces[:, byte_index])[0, 1] if correlation > max_correlation: max_correlation = correlation best_key = key key_guess.append(best_key) print("推测的密钥:", key_guess) ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值