функция, возвращающая вектор в Matlab

У меня есть функция, возвращающая вектор в MatLab, проблема в том, что функция должна возвращать целочисленное значение без знака, я отладил свой код и понял, что переменная galois_value превращается в вектор, когда я выполняю операцию bitand и bitxor. Я пытался сделать typecast, чтобы превратить вектор в беззнаковое значение, но не работает. Я пытался заставить литье, но тоже не работает. Под функцией:

function galois_value = galois_mul2( value )
    hex = uint8(hex2dec('1B')); 
    temp = typecast(value, 'int8');
    temp = bitshift(temp,-7); 
    temp = bitand(typecast(temp,'uint8'),hex); 
    galois_value =  bitxor(bitshift(value,1),uint16(temp)); 
end

Правильный вывод этой функции должен быть (этот вывод исходит из работающего кода C):

96
210
97
224
119
194
192
156
196
195
102
10
10
117
235
213
49
57
235
79
172
5
23
62
111
188
223
128
113
133
128
102
30
238
226
31

Вывод, который я получаю с помощью функции MatLab:

96     96

210    210

353    378

224    224

375    364

194    194

192    192

156    156

196    196

451    472

102    102

 10     10

 10     10

373    366

491    496

469    462

305    298

313    290

491    496

335    340

172    172

261    286

279    268

 62     62

367    372

188    188

479    452

128    128

369    362

389    414

128    128

102    102

 30     30

238    238

226    226

287    260

Код для отображения и отладки функции:

%Key
key = {'00','01','02','03','04','05','06','07','08','09','0a','0b','0c','0d','0e','0f'};
for n = 1 : 16
   keyU(n)=uint16(hex2dec(key(n)));
end
%State
state = {'00','11','22','33','44','55','66','77','88','99','aa','bb','cc','dd','ee','ff'};
for n = 1 : 16
   stateU(n)=uint16(hex2dec(state(n)));
end
%Sbox
sbox = {'63','7c','77','7b','f2','6b','6f','c5','30','01','67','2b','fe','d7','ab','76','ca','82','c9','7d','fa','59','47','f0','ad','d4','a2','af','9c','a4','72','c0','b7','fd','93','26','36','3f','f7','cc','34','a5','e5','f1','71','d8','31','15','04','c7','23','c3','18','96','05','9a','07','12','80','e2','eb','27','b2','75','09','83','2c','1a','1b','6e','5a','a0','52','3b','d6','b3','29','e3','2f','84','53','d1','00','ed','20','fc','b1','5b','6a','cb','be','39','4a','4c','58','cf','d0','ef','aa','fb','43','4d','33','85','45','f9','02','7f','50','3c','9f','a8','51','a3','40','8f','92','9d','38','f5','bc','b6','da','21','10','ff','f3','d2','cd','0c','13','ec','5f','97','44','17','c4','a7','7e','3d','64','5d','19','73','60','81','4f','dc','22','2a','90','88','46','ee','b8','14','de','5e','0b','db','e0','32','3a','0a','49','06','24','5c','c2','d3','ac','62','91','95','e4','79','e7','c8','37','6d','8d','d5','4e','a9','6c','56','f4','ea','65','7a','ae','08','ba','78','25','2e','1c','a6','b4','c6','e8','dd','74','1f','4b','bd','8b','8a','70','3e','b5','66','48','03','f6','0e','61','35','57','b9','86','c1','1d','9e','e1','f8','98','11','69','d9','8e','94','9b','1e','87','e9','ce','55','28','df','8c','a1','89','0d','bf','e6','42','68','41','99','2d','0f','b0','54','bb','16'}; 
for n = 1 : 256
   sboxU(n)=uint16(hex2dec(sbox(n)));
end
%Rcon
rcon = {'01','02','04','08','10','20','40','80','1b','36'};
for n = 1 : 10
   rconU(n)=uint16(hex2dec(rcon(n)));
end
%Main AES Data Loop
for round = 1 : 10
%Add key + sbox 
    for i = 1 : 16
        stateU(i)= sboxU(bitxor(stateU(i),keyU(i))+1);
    end
%Shift Rows
    buf1 = stateU(2);
    stateU(2) = stateU(6);
    stateU(6) = stateU(10);
    stateU(10) = stateU(14);
    stateU(14) = buf1;

    buf1 = stateU(3);
    buf2 = stateU(7);
    stateU(3) = stateU(11);
    stateU(7) = stateU(15);
    stateU(11) = buf1;
    stateU(15) = buf2;

    buf1 = stateU(16);
    stateU(16) = stateU(12);
    stateU(12) = stateU(8);
    stateU(8) = stateU(4);
    stateU(4) = buf1;
%Process mixcolumn for all rounds but the last one
    if round < 10
        for j = 0 : 3
%Compute the current index
            buf4 = (bitshift(j,2));
            %buf1
            aux1 = bitxor(stateU(buf4+1),stateU(buf4+2));
            aux2 = bitxor(stateU(buf4+3),stateU(buf4+4));
            buf1 = bitxor(aux1,aux2);
            %buf2
            buf2 = stateU(buf4+1);
            %buf3
            buf3 = bitxor(stateU(buf4+1),stateU(buf4+2));
           buf3 = galois_mul2(buf3);
            disp(buf3);
        end
    end

end

person Community    schedule 11.06.2017    source источник


Ответы (1)


Проблема в строке 3 функции galois_mul2
temp = typecast(value, 'int8'); поскольку значение имеет тип uint16, вывод typecast состоит из двух элементов. например вывод typecast(uint16(5), 'int8') равен 5 0 Если вы измените все типы в строках 3,8,13,18 функции main и строках 3,6 функции galois_mul2 на uint8, проблема будет решена.

person M.Khd    schedule 11.06.2017