Error in storing variable values with size 8bits (uint8) in Matlab

1
I'm implementing a 128-bit AES encryption algorithm in Matlab, I'm implementing this code based on a functional code in C, the big problem is that in C code all variables are set to unsigned char making it easier to In MatLab I declared all variables as uint8 (unsingned integer 8 bits), the encryption part is almost ready, however I came across a problem, I was running the code and realized that some values were being returned wrong from the vector S-box , debugging the codes I found the problem, there is a moment in the code that the function below returns me the value 255 :

 for i = 1 : 16
        stateU(i)= sboxU(bitxor(stateU(i),keyU(i))+1);
 end

This function is responsible for changing the values of the naked data by the corresponding value of S-box, in C the same function is used to make this change, but the vector in C starts at index 0 going to 255, in matlab vectors start at index 1 and go up to 256, and that's where the problem is, when my function returns 255 as the index value is always added +1 due to this difference of indicies in relation from C to MatLab, but like all variables are set to 8-bit size, it is not possible to store the value of 256 in the variable, so the code stores 255, resulting in a wrong value in the variable.

The expected output would be (this is the correct output of the code in C, after the second iteration of the for loop ranging from 1-16):

State[0] before shift: 207
State[1] before shift: 0
State[2] before shift: 152
State[3] before shift: 115
State[4] before shift: 237
State[5] before shift: 77
State[6] before shift: 148
State[7] before shift: 123
State[8] before shift: 22
State[9] before shift: 182
State[10] before shift: 122
State[11] before shift: 190
State[12] before shift: 130
State[13] before shift: 198
State[14] before shift: 29
State[15] before shift: 155

Note that position [8] is 22, this value is obtained through a bit-a-bit XOR of the variable state with the variable key , as spoken at the beginning of this post, in C the variables are defined as unsigned char , so there are no problems with the size of the values. In Matlab already I have the following output:

State[0] before shift: 207
State[1] before shift: 0
State[2] before shift: 152
State[3] before shift: 115
State[4] before shift: 237
State[5] before shift: 77
State[6] before shift: 148
State[7] before shift: 123
State[8] before shift: 187
State[9] before shift: 182
State[10] before shift: 122
State[11] before shift: 190
State[12] before shift: 130
State[13] before shift: 198
State[14] before shift: 29
State[15] before shift: 155

Notice that the position [8] of the vector in MatLab has a different value, it is 187 because since the type of the variable is defined as uint8 in MatLab, it can only store values up to 255, theoretically it should get the value of position 256 of the S-box, but as the type is uint8 it takes the value of a position less (255 - 1111 1111), that maximum that 8 bits can store.

Below the two codes for analysis.

MatLab (function galois_mul2):

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

MatLab (main function):

%Chave
key = {'00','01','02','03','04','05','06','07','08','09','0a','0b','0c','0d','0e','0f'};
for n = 1 : 16
   keyU(n)=uint8(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)=uint8(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)=uint8(hex2dec(sbox(n)));
end
%Rcon
rcon = {'01','02','04','08','10','20','40','80','1b','36'};
for n = 1 : 10
   rconU(n)=uint8(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);
            %%%%%%%%%%%%%%%%%%%
            aux = bitxor(stateU(buf4+1),buf3);
            stateU(buf4+1) = bitxor (aux,buf1); 
        end
    end
end

It is worth mentioning that when I found the error I stopped debugging in the second iteration of the for loop, that is, the correct output that is shown above is the output after the second iteration of the for loop that goes from 0-16 that was posted up there as well. In the first iteration it works because the bit-to-bit XOR function returns no value greater than 255 (1111 1111). I've tried to change all variables to uint16 but the code does not work, it says that the types should be scalar or multiples of 2. Someone would know how to solve this problem.     

asked by anonymous 15.06.2017 / 18:11

0 answers