%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Copyright: 2010 Integrated Sytems Laboratory, ETH Zurich
%%            http://www.iis.ee.ethz.ch/~sha3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear; clc;

g =[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 3, 0, 0, 3, 3, 3, 3, 0, 0, 2, 0, 0, 3, 0, 2, 3, 2, 2, 1, 0, 2, 2, 3, 0, 3, 0, 0, 1, 0, 2, 1, 2, 3, 3, 3, 1, 2, 3, 3, 0, 1, 1, 1, 3, 1, 1, 1, 1, 0, 0, 3, 0, 0, 0, 3, 1, 3, 3, 2, 2, 2, 3, 0, 0, 2, 2, 3, 0, 1, 1, 2, 0, 1, 2, 1, 3, 0, 1, 2, 3, 1, 0, 1, 2, 1, 3, 3, 3, 3, 3, 2, 1, 1, 0, 2, 3, 2, 1, 0, 2, 3, 1, 1, 0, 2, 3, 3, 2, 0, 2, 0];
    [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 3, 0, 2, 1, 1, 1, 3, 0, 1, 2, 0, 2, 3, 1, 0, 2, 3, 1, 1, 1, 3, 0, 3, 2, 3, 0, 3, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 3, 3, 2, 2, 3, 0, 2, 2, 2, 1, 0, 2, 3, 0, 0, 2, 0, 3, 1, 2, 3, 3, 0, 3, 0, 1, 3, 0, 3, 3, 2, 0, 2, 3, 0, 1, 3, 3, 3, 0, 0, 0, 1, 3, 0, 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 0, 2, 1, 1, 1, 0, 0, 2, 1, 1, 0, 1, 1, 2, 1, 2];
    [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 3, 3, 2, 0, 3, 3, 1, 3, 1, 1, 2, 2, 2, 2, 3, 1, 3, 0, 1, 0, 0, 1, 0, 1, 2, 3, 3, 3, 0, 2, 0, 2, 2, 3, 2, 1, 2, 2, 1, 0, 0, 1, 0, 2, 3, 1, 1, 2, 1, 2, 2, 3, 0, 2, 1, 2, 1, 0, 3, 2, 1, 0, 3, 1, 0, 1, 0, 0, 0, 3, 0, 1, 2, 3, 3, 3, 0, 2, 2, 3, 0, 2, 2, 3, 3, 1, 3, 3, 3, 0, 1, 2, 2, 0, 3, 1, 1, 1, 0, 3, 3, 3, 2, 0, 3, 2, 0, 1, 2, 3];
    [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 3, 3, 2, 0, 3, 3, 1, 3, 1, 1, 2, 2, 2, 2, 3, 1, 3, 0, 1, 0, 0, 1, 0, 1, 2, 3, 3, 3, 0, 2, 0, 2, 2, 3, 2, 1, 2, 2, 1, 0, 0, 1, 2, 2, 3, 1, 1, 2, 1, 2, 2, 3, 0, 2, 1, 2, 1, 0, 3, 2, 1, 0, 3, 1, 0, 1, 0, 0, 0, 3, 0, 1, 2, 3, 3, 3, 0, 2, 2, 3, 0, 2, 2, 3, 3, 1, 3, 3, 3, 0, 1, 2, 2, 0, 3, 1, 1, 1, 0, 3, 3, 3, 2, 0, 3, 1, 0, 0, 1];
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 2, 0, 0, 0, 1, 3, 3, 3, 3, 3, 1, 2, 2, 0, 1, 0, 1, 0, 3, 2, 3, 3, 0, 2, 0, 1, 3, 3, 1, 2, 2, 1, 3, 1, 3, 1, 1, 2, 2, 3, 0, 1, 3, 2, 3, 3, 2, 1, 1, 1, 1, 2, 2, 0, 1, 1, 2, 0, 3, 2, 0, 2, 1, 2, 1, 2, 0, 0, 1, 2, 0, 2, 2, 0, 1, 3, 2, 1, 3, 3, 2, 2, 2, 3, 1, 0, 0, 2, 0, 1, 2, 1, 1, 0, 1, 2, 2, 1, 3, 2, 1, 2, 3, 1, 1, 3, 3, 1, 3, 1];
    [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 2, 0, 1, 2, 0, 2, 3, 1, 3, 2, 2, 0, 2, 3, 2, 2, 3, 0, 3, 1, 2, 2, 3, 3, 2, 1, 0, 3, 3, 0, 1, 0, 0, 2, 1, 3, 1, 1, 2, 0, 3, 3, 3, 3, 1, 2, 0, 0, 2, 0, 3, 3, 2, 3, 3, 0, 2, 3, 3, 1, 2, 1, 0, 3, 3, 0, 3, 1, 3, 1, 1, 3, 2, 2, 0, 1, 2, 1, 1, 0, 2, 0, 1, 2, 0, 1, 1, 2, 2, 2, 3, 3, 2, 3, 3, 2];
    [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 2, 1, 0, 0, 0, 0, 3, 3, 2, 2, 3, 1, 3, 3, 1, 3, 1, 2, 2, 1, 3, 1, 1, 1, 2, 2, 3, 2, 2, 1, 3, 1, 2, 1, 2, 3, 0, 1, 3, 1, 2, 3, 1, 0, 3, 2, 3, 0, 2, 3, 3, 1, 1, 0, 3, 1, 1, 2, 2, 0, 0, 0, 0, 3, 1, 1, 3, 1, 0, 2, 0, 1, 2, 0, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 3, 3, 1, 0, 0, 1, 2, 1, 1, 0, 2, 3, 3, 1, 3, 2, 2, 2, 2, 3, 0, 1, 2, 2, 1, 1];
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 1, 0, 2, 2, 3, 3, 3, 0, 3, 1, 2, 2, 0, 1, 1, 0, 3, 1, 0, 2, 0, 3, 0, 1, 2, 1, 2, 3, 3, 0, 3, 3, 0, 2, 1, 0, 0, 0, 3, 1, 2, 0, 3, 0, 0, 1, 2, 3, 3, 0, 1, 3, 3, 1, 2, 1, 0, 2, 3, 0, 0, 3, 0, 0, 2, 1, 2, 1, 2, 0, 2, 2, 1, 3, 3, 3, 3, 3, 0, 2, 0, 0, 1, 2, 1, 3, 0, 0, 2, 3, 2, 0, 3, 1, 3, 3, 0, 2, 3, 3, 0, 3, 3, 2, 0, 0, 3, 0, 2, 2, 0];
    [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 1, 0, 2, 2, 3, 3, 3, 0, 3, 1, 2, 2, 0, 1, 1, 0, 3, 1, 0, 2, 0, 3, 0, 1, 2, 1, 2, 3, 3, 0, 3, 3, 0, 2, 1, 0, 0, 0, 3, 1, 2, 0, 3, 3, 0, 1, 2, 3, 3, 0, 1, 3, 3, 1, 2, 1, 0, 2, 3, 0, 0, 3, 0, 0, 2, 1, 2, 1, 2, 0, 2, 2, 1, 3, 3, 3, 3, 3, 0, 2, 0, 0, 1, 2, 1, 3, 0, 0, 2, 3, 2, 0, 3, 1, 3, 3, 0, 2, 3, 3, 0, 3, 3, 2, 0, 0, 3, 0, 1, 2];
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 3, 1, 2, 3, 1, 2, 0, 0, 1, 3, 3, 1, 3, 1, 0, 2, 1, 3, 0, 1, 0, 1, 1, 3, 2, 3, 2, 1, 2, 2, 2, 2, 0, 1, 1, 1, 2, 1, 0, 2, 2, 0, 0, 2, 1, 2, 3, 0, 3, 2, 2, 3, 1, 0, 1, 3, 1, 2, 0, 3, 1, 3, 2, 2, 0, 3, 1, 1, 0, 1, 1, 2, 3, 0, 1, 3, 2, 1, 3, 0, 2, 1, 3, 2, 3, 1, 2, 0, 3, 1, 2, 2, 3, 0, 1, 0, 2, 3, 2, 0, 0, 3, 1, 0, 3, 3, 2, 0, 2, 3, 3, 3, 3];
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, 3, 1, 0, 2, 3, 0, 3, 1, 1, 1, 3, 0, 1, 3, 0, 0, 1, 0, 0, 3, 3, 0, 2, 2, 2, 2, 2, 2, 1, 0, 2, 1, 0, 3, 0, 0, 0, 0, 2, 1, 3, 2, 2, 2, 0, 0, 0, 1, 2, 1, 2, 2, 2, 1, 0, 1, 2, 3, 3, 1, 0, 2, 0, 3, 2, 0, 0, 2, 0, 0, 3, 3, 1, 3, 2, 2, 1, 3, 1, 1, 3, 3, 3, 3, 0, 0, 3, 3, 1, 2, 0, 3, 1, 1, 2, 1, 3, 3, 0, 0, 0, 3, 2, 3, 2, 3, 0, 3, 1, 1, 3, 2, 0];
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, 3, 1, 0, 2, 3, 0, 3, 1, 1, 1, 3, 0, 1, 3, 0, 0, 1, 0, 0, 3, 3, 0, 2, 2, 2, 2, 2, 2, 1, 0, 2, 1, 0, 3, 0, 0, 0, 0, 2, 1, 3, 2, 2, 2, 0, 1, 0, 1, 2, 1, 2, 2, 2, 1, 0, 1, 2, 3, 3, 1, 0, 2, 0, 3, 2, 0, 0, 2, 0, 0, 3, 3, 1, 3, 2, 2, 1, 3, 1, 1, 3, 3, 3, 3, 0, 0, 3, 3, 1, 2, 0, 3, 1, 1, 2, 1, 3, 3, 0, 0, 0, 3, 2, 3, 2, 3, 0, 3, 1, 1, 2, 2];
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, 3, 1, 0, 2, 3, 0, 3, 1, 1, 1, 3, 0, 1, 3, 0, 0, 1, 0, 0, 3, 3, 0, 2, 2, 2, 2, 2, 2, 1, 0, 2, 1, 0, 3, 0, 0, 0, 0, 2, 1, 3, 2, 2, 2, 3, 1, 0, 1, 2, 1, 2, 2, 2, 1, 0, 1, 2, 3, 3, 1, 0, 2, 0, 3, 2, 0, 0, 2, 0, 0, 3, 3, 1, 3, 2, 2, 1, 3, 1, 1, 3, 3, 3, 3, 0, 0, 3, 3, 1, 2, 0, 3, 1, 1, 2, 1, 3, 3, 0, 0, 0, 3, 2, 3, 2, 3, 0, 0, 1, 1, 0];
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 2, 2, 2, 3, 1, 1, 3, 2, 1, 3, 1, 2, 1, 3, 1, 1, 0, 1, 3, 2, 2, 0, 0, 0, 1, 2, 3, 2, 2, 0, 2, 2, 2, 1, 0, 1, 2, 2, 3, 1, 1, 2, 3, 1, 0, 3, 2, 1, 3, 2, 1, 2, 0, 2, 2, 2, 0, 2, 0, 3, 0, 0, 2, 1, 2, 0, 0, 1, 1, 0, 0, 2, 3, 3, 1, 2, 1, 3, 2, 3, 0, 0, 3, 3, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1, 1, 2, 3, 2, 1, 3, 3, 1, 2, 1, 2, 0, 3, 2, 1, 0, 0, 1];
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 2, 3, 3, 3, 1, 0, 1, 3, 0, 2, 1, 1, 1, 0, 2, 0, 2, 1, 2, 1, 1, 2, 1, 0, 3, 2, 1, 0, 3, 1, 3, 3, 2, 3, 1, 3, 1, 3, 1, 1, 0, 2, 2, 1, 1, 2, 0, 2, 1, 0, 0, 2, 2, 0, 3, 0, 2, 2, 1, 1, 0, 1, 2, 1, 1, 3, 1, 3, 3, 3, 3, 0, 0, 1, 3, 3, 1, 2, 2, 3, 3, 0, 0, 3, 3, 3, 3, 0, 0, 1, 2, 1, 1, 0, 0, 2, 1, 1, 2, 1, 2, 1, 1, 3, 2, 1, 0, 1, 0, 1];
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 2, 0, 0, 2, 2, 2, 2, 0, 0, 1, 0, 0, 2, 0, 1, 2, 1, 1, 3, 0, 1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 3, 1, 2, 2, 2, 3, 1, 2, 2, 0, 3, 3, 3, 2, 3, 3, 3, 3, 0, 0, 2, 0, 0, 0, 2, 3, 2, 2, 1, 1, 1, 2, 0, 0, 1, 1, 2, 0, 3, 3, 1, 0, 3, 1, 3, 2, 0, 3, 1, 2, 3, 0, 3, 1, 3, 2, 2, 2, 2, 2, 1, 3, 3, 0, 1, 2, 1, 3, 0, 1, 2, 3, 3, 0, 1, 2, 2, 3, 0, 0, 1, 1]];

msg=ones(1,16)*2;

msg=round(rand(1,16)*3);
d=zeros(1,128);

for k=1:128
    for i=1:16
        if g(i,k)==0
            t=0;
        elseif g(i,k)==1
            t=msg(i);
        elseif g(i,k)==2
            t=bitshift(msg(i),1);
        else
            t=bitxor(bitshift(msg(i),1), msg(i));
        end
        
        if t > 3
            d(k)=bitxor(bitxor(bitand(t,3),3), d(k));
        else
           d(k)=bitxor(d(k),t) ;
        end
        
    end
end

e=zeros(1,128);
for k=1:128
    for i=1:16
        if g(i,k)==0
            s=0;
        elseif g(i,k)==1
            s=msg(i);
        elseif g(i,k)==2
            if msg(i)==0 || msg(i)==1
                s=bitshift(msg(i),1);
            elseif msg(i)==2
                s=3;
            else
                s=1;
                         
            end
            
        else
            if msg(i)==0 || msg(i)==1
                s=bitxor(bitshift(msg(i),1), msg(i));
            elseif msg(i)==2
                s=1;
            else
                s=2;
            end
        end
        
        e(k)=bitxor(e(k),s) ;
       
    end
end



T0 = zeros(8,16);
T1 = zeros(8,16);
M0 = zeros(8,32);
for i=1:8
    T0(i,:) = d(16*(i-1)+1:(16*i));
    T1(i,:) = e(16*(i-1)+1:(16*i));
    for j=1:16
        M0(i,2*j-1:2*j)=dec2bin(T0(i,j),2);
        M1(i,2*j-1:2*j)=dec2bin(T1(i,j),2);
    end
                
end
M0=uint8(M0-48);
M1=uint8(M1-48);

q=4;
m0=zeros(8,32,'uint8');
m1=zeros(8,32,'uint8');
for i=1:q
    for j=1:16
        m0(i,j) = M0(i,2*j-1);
        m0(i,16+j) = M0(q+i,2*j-1);
        m0(q+i,j) = M0(i,2*j);
        m0(q+i,16+j) = M0(q+i, 2*j);
        m1(i,j) = M1(i,2*j-1);
        m1(i,16+j) = M1(q+i,2*j-1);
        m1(q+i,j) = M1(i,2*j);
        m1(q+i,16+j) = M1(q+i, 2*j);
        
    end
end
isequal(m0, m1)


m0=num2str(m0);

m1=num2str(m1);
%disp('Expansion Matrix :');
%disp(m0);

%expansion lut
tmp=zeros(1,32);
for i=1:16
    tmp(1, 2*i-1:2*i) = dec2bin(msg(i),2);
end
tmp = uint8(tmp-48);

b=zeros(1,4);
for i=1:4
    b(i)=bin2dec(num2str(tmp(8*(i-1)+1:8*i)));
    
end

b=b+1;

s = zeros(8,1);
for i=1:8
    s(i) = Exp256(i, b);
end
s=dec2bin(s, 32);
%disp('Expansion Matrix using LUT:');
%disp(s '\n');

%compare results
isequal(s,m1);
 
%reverse calc
MRev = zeros(8,32);
for i=1:q
    for j=1:16
        MRev(i,2*j-1) = s(i,j);
        MRev(q+i,2*j-1) = s(i,16+j);
        MRev(i,2*j) = s(q+i,j);
        MRev(q+i, 2*j) = s(q+i,16+j);
                
    end
end
MRev = MRev-48;
sum(sum(MRev))
sum(sum(M0))
MRev=num2str(MRev)
M0=num2str(M0)




% %m0=zeros(8,32);
% for i=1:q
%     for j=1:16
%         m0(i,j) = MRev(i,2*j-1);
%         m0(i,16+j) = MRev(q+i,2*j-1);
%         m0(q+i,j) = MRev(i,2*j);
%         m0(q+i,16+j) = MRev(q+i, 2*j);
%         
%     end
% end












Generated on Fri Sep 24 10:39:12 CEST 2010
Home