0%

侧信道攻击学习笔记3-汉明重量

简介

  • 本篇将继续跟随chipwhisperer-jupyter sca101的教程来学习了解能量分析中的常用模型 汉明重量
  • 汉明重量:简单来说就是一个数的二进制包含'1'的个数,如0x00的HM为0,0xFF的HM为8,0x1和0x2的HM都为1

开始

  • 如下图,同样选择复制HARDWARE的代码至MAIN中

    image-20220814160505408

  • 同样地根据提示信息选择平台,这里需要注意的是:XMEGA平台的CRYPTO_TARGET既可以使用默认值'TINYAES128C'(全平台通用)也可以使用'AVRCRYPTOLIB'(仅限XMEGA)

    image-20220814160747457

  • 前几行代码,依旧是初始化一些参数和编译并上传合适的固件到目标板中

    image-20220814161509014

  • 接着就是提示信息和相应的代码,大意是说为了查看不同汉明重量的数据对能量消耗的影响,这里生成两种极端数据'0x00'(00000000)和'0xff'(11111111),100个traces就足够查看两者的差异

    image-20220814161708972

  • 接着往下运行,可以看到如下提示信息,大意是指:查看HM大的0xFF和HM小的0x00数据对运行AES时的能量消耗差异,由于这些数据是混合在一起的,所以首先需要对抓取的数据进行分组,分为one_list和zero_list

    image-20220814181733701

  • 按照提示修改代码将数据分为两组,并将结果转为numpy array类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    zero_list=[]
    one_list=[]
    for i in range(len(trace_array)):
    if textin_array[i][0] == 0x00:
    zero_list.append(trace_array[i])

    else:
    one_list.append(trace_array[i])

    1
    2
    3
    4
    5
    6

    one_list=np.array(one_list)
    zero_list=np.array(zero_list)

    assert len(one_list) > len(zero_list)/2
    assert len(zero_list) > len(one_list)/2
  • 接着可以看到如下提示信息,大意是:使用np.mean分别对上面两组数据的trace求平均值,得到zero_avg和one_avg的数据,其中'axis'参数可用来指定求均值的方向(按行或者按列求)

    image-20220814182345329

  • 按照提示信息,修改代码,求两组数据的平均值,

    1
    2
    3
    4
    5
    6
    7
    trace_length = len(one_list[0])
    print("Traces had original sample length of %d"%trace_length)

    one_avg=np.mean(one_list, axis=0)

    if len(one_avg) != trace_length:
    raise ValueError("Average length is only %d - check you did correct dimensions!"%one_avg)
    1
    2
    3
    4
    5
    6
    7
    trace_length = len(zero_list[0])
    print("Traces had original sample length of %d"%trace_length)

    zero_avg=np.mean(zero_list, axis=0)

    if len(zero_avg) != trace_length:
    raise ValueError("Average length is only %d - check you did correct dimensions!"%zero_avg)
  • 最后就是画出两组的差异图

    1
    2
    3
    4
    5
    6
    7
    %matplotlib notebook
    import matplotlib.pyplot as plt

    diff = one_avg[:1000] - zero_avg[:1000]

    plt.plot(abs(diff))
    plt.show()

    image-20220814183217485

  • 往下可以看到如下提示信息,大意是说:在前面的位置你可以看到一个明显的差异,这个代表着数据的差异也可以在能量图中体现出来。对比上图确实如此,在200的位置可以看到一个明显的峰值,其余部分的差异都非常小

    image-20220814183255221

  • 接下来尝试不同的数据与'0x00'的对比,下图'0x01'与'0x00'的对比,可以看到,两者差异并不明显,不能识别出差异数据所在位置

    image-20220814194658702

  • 出现上图原因是,抓取的数据太少,将前面的N=100改为N=1000,重新运行,并画图,可以看到同样可以看到一个明显的

    image-20220814194940481

    image-20220814194555668

总结

  • 除了代码会对能量消耗产生影响外,代码所处理的数据同样会对能量消耗产生影响
  • 有时为了区分出数据的细微差异,往往需要抓取更多的数据才能保证出现预期的结果