这两个文件的类型有什么区别?

时间:2017-03-17 14:49:43

标签: python matlab numpy

我试图用两个不同的密文文件测试相关功率分析攻击:第一个文件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,请问如何解决问题?

2 个答案:

答案 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就拥有所有这些数字,所以你不会失去精确度。