我试图用两个不同的密文文件测试相关功率分析攻击:第一个文件Ciphertexts.mat已经使用这行代码从numpy转换为matlab:
import scipy.io
import numpy as np
tab_Obs = np.load('C:\\Users\\My_Test_Traces\\Ciphertexts.npy')
scipy.io.savemat('C:\\Users\\My_Test_Traces\\Ciphertexts.mat', {
"tab_Obs":tab_Obs}
)
结果是:
load 'C:/Users/cpa/data/Ciphertexts.mat';
S =
{
ciph_dec =
163 20 11 228 7 53 249 241 134 90 166 177 179 43 86 103
35 22 125 217 16 82 174 101 197 242 118 33 214 232 86 162
77 116 29 212 76 7 155 18 255 101 126 86 235 155 46 11
...........
}
第二个文件是parsed_cipher_0cm.mat:
load 'C:/Users/cpa/data/parsed_cipher_0cm.mat';
S =
{
ciph_dec =
67 70 185 254 55 71 60 118 165 27 247 120 31 106 154 24
24 51 124 37 190 187 208 55 32 224 134 214 49 173 224 209
192 86 229 54 24 216 91 9 136 132 131 82 44 170 234 33
.......
}
首先,我认为我有相同类型的两个文件相同,之后,当我尝试执行第二个文件时,我给出了最佳解决方案,但是通过第二个文件的执行给了我这个结果:
error: binary operator `*' not implemented for `int32 matrix' by `matrix' operations
error: evaluating binary operator `*' near line 57, column 10
我的错误是第一个文件的类型,错误在于计算h1。 我在matlab中试用这段代码:
load 'C:/Users/cpa/data/Ciphertexts.mat';
%load 'C:/Users/cpa/data/parsed_cipher_0cm.mat';
% truncate measurements
n_measures = 999
tab_Obs = tab_Obs(1:n_measures,:);
ciph_dec = ciph_dec(1:n_measures,:);
K=0:255;
disp (length(K));
Y_i = ciph_dec(:,sbox_n)
F = ones(1,length(K))
sbox_n = 2
disp (size(Y_i))
disp (size(F))
h1=(Y_i*ones(1,length(K)))
disp (size(h1))
我做了这个测试以了解每个文件的类型: 我发现:
Ciphertexts.mat---------> type: int32
parsed_cipher_0cm.mat---> type: float64
我需要有文件Ciphertexts.mat的type = float64,请问如何解决问题?
答案 0 :(得分:1)
MATLAB通常不允许涉及整数数据类型的矩阵乘法,除非其中一个操作数是标量。我们可以通过一个简单的例子看到这一点:
ones(2, 'int8')*ones(2, 'int8')
会抛出错误:
Error using *
MTIMES is not fully supported for integer classes. At least one input must be scalar.
To compute elementwise TIMES, use TIMES (.*) instead.
这可能导致integer overflow安全,但可能还有其他我不熟悉的原因。虽然错误消息并不准确,但问题可能与此有关。
立即MATLAB修复是将ciph_dec
转换为double
,这应解决乘法问题:
load 'C:/Users/cpa/data/Ciphertexts.mat';
% load 'C:/Users/cpa/data/parsed_cipher_0cm.mat';
% truncate measurements
n_measures = 999;
tab_Obs = tab_Obs(1:n_measures, :);
ciph_dec = double(ciph_dec(1:n_measures, :)); % Force floating point
K = 0:255;
disp(length(K));
Y_i = ciph_dec(:, sbox_n);
F = ones(1, length(K));
sbox_n = 2;
disp(size(Y_i))
disp(size(F))
h1 = (Y_i*ones(1, length(K)));
disp (size(h1))
答案 1 :(得分:0)
尝试简单地转换为加倍 - ciph_dec = double(ciph_dec)
。 Matlab更喜欢那些,只要你在int32中,double就拥有所有这些数字,所以你不会失去精确度。