matlab中的函数返回向量

时间:2017-06-11 21:11:57

标签: matlab vector unsigned-integer

我有一个函数在MatLab中返回一个向量,问题是函数应该返回一个无符号整数值,我已经调试了我的代码,我意识到当我做一个变量galois_value变成一个向量bitandbitxor操作。我试图用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

1 个答案:

答案 0 :(得分:1)

问题在于galois_mul2函数的第3行 temp = typecast(value,'int8'); 因为值类型为uint16,所以输出的类型是两个元素。 例如类型转换的输出(uint16(5),'int8')是5 0 如果将主线3,8,13,18中的所有类型和galois_mul2函数的3,6行中的所有类型都更改为uint8,则问题将得到解决。