首页 文章

matlab中的函数返回向量

提问于
浏览
1

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

  • 1

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

相关问题