数据集

名称 内容
ASCAD 60 000条能量迹, 700个特征
AES_HD 500 000条能量迹, 1250个特征
AES_RD 50 000条能量迹, 3500个特征

数据预处理

由于本论文中作者在每条能量迹都打上八个标签,因此要把原来的label划分为8bit,写了个简单的poc。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
in_file = h5py.File('../yourdatasets/ASCAD.h5', "r")
X_profiling = np.array(in_file['Profiling_traces/traces'], dtype=np.int8)
# Load profiling labels
Y_profiling = np.array(in_file['Profiling_traces/labels'])
new_y_profiling = []
for i in range(len(Y_profiling)):
bin_y = f"{Y_profiling[i]:08b}"
bin_y = list(bin_y)
bin_y = list(map(float, bin_y))
new_y_profiling.append(bin_y)
new_y_profiling = np.reshape(new_y_profiling, (len(new_y_profiling), -1))
# Load attacking traces
X_attack = np.array(in_file['Attack_traces/traces'], dtype=np.int8)
# Load attacking labels
Y_attack = np.array(in_file['Attack_traces/labels'])
print(type(Y_attack[0]))
new_y_attack = []
for i in range(len(Y_attack)):
bin_y = f"{Y_attack[i]:08b}"
bin_y = list(bin_y)
bin_y = list(map(float, bin_y))
new_y_attack.append(bin_y)
new_y_attack = np.reshape(new_y_attack, (len(new_y_attack), -1))

神经网络架构

目前还是不会用api来写,先将就一下一步到底

ASCAD Nmax=0

图1 未加入对抗措施的能量迹数据集对应的NN模型

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
data_input = keras.layers.Input(shape=(700, 1))
output_left = layers.Conv1D(4, 1, activation='selu', padding='same')(data_input)
output_middle = layers.Conv1D(4, 7, activation='selu', padding='same')(data_input)
output_right = layers.Conv1D(4, 11, activation='selu', padding='same')(data_input)
concatenated_output = keras.layers.concatenate([output_left, output_middle, output_right])

conv_1 = keras.layers.Conv1D(4, 1, activation='selu')(concatenated_output)
bn_1 = keras.layers.BatchNormalization()(conv_1)
ave_pool = keras.layers.AvgPool1D(2, 2)(bn_1)
flatten = keras.layers.Flatten()(ave_pool)
fc_1 = keras.layers.Dense(10, activation='selu')(flatten)
fc_2 = keras.layers.Dense(10, activation='selu')(fc_1)
fc_3 = keras.layers.Dense(8, activation='sigmoid')(fc_2)
model = Model(inputs=data_input, outputs=fc_3)

这里output_left、output_middle、output_right分别代表了大小为1、7、11的卷积核,个数都为4,在经过一个连接层concatenate将得到的结果全部拼接起来,这里可以看出来大小为1的卷积核确实没起什么作用,既没有扩大感受野也没有起到减少复杂度的作用,后边就是正常的四个大小为1的卷积核,这里的作用确实是在BN层之前减少了计算的复杂度,(在这里测试了一下去掉这四个卷积盒后模型的复杂度为4w+,而加上之后为14364),之后就是正常的展平全连接,只是在最后将softmax函数改为sigmoid。

模型summary如图2所示。

图2 模型结构以及参数量

**优化器(**opt)采用adamax(Adam也可以, 作者这里没有说用哪个,我用了俩效果相差不大), 学习率(lr)0.005,loss选择二元交叉熵,epochs=100,batch_size=256

训练代码如下:

1
2
3
model.compile(optimizer=keras.optimizers.Adamax(0.005) , loss=tf.keras.losses.BinaryCrossentropy(), metrics=['accuracy'])

history = model.fit(X_profiling, new_y_profiling, epochs=100, batch_size=256, verbose=1, validation_split=0.2)

测试代码如下:

1
test_loss, test_accuracy = model.evaluate(X_attack, new_y_attack, verbose=2)

成功率以及损失如图3、图4所示,暂时应该是没有复现成功。

图3	N0成功率 图4	N0损失

汇总

其实在复现的时候发现,自己的数据跟作者的老是对不上号,猜测可能是数据预处理或者优化器选的不是特别好,但最让我不解的是复现的模型复杂度有的跟作者的相同,但是有的少了1k,感觉是padding或者哪里小细节有问题,模型的代码全部传到github上了链接