mardi 3 février 2015

Implementation of IDEA algorithm in MATLAB



I need to implement IDEA (international-data-encryption-algorithm) in MATLAB. I have thoroughly searched in different pages and forums but couldn't find the implementation details. I also tried to make the MATLAB version by looking at the C++ version, but it was not helpful. Recently, I found an algorithm by Ridho Bustami on mathworks which has 4 functions. The MATLAB files can be downloaded from here as mathworks has removed those files:

http://goo.gl/Fw8mmE

http://goo.gl/QKjjjk




  1. Encryption: function [outputciph_idea] = enkripsi_idea(inputplain_idea, kunci_idea)



    function [outputciph_idea] = enkripsi_idea(inputplain_idea, kunci_idea)
    % clc, clear all
    %
    % KKEY1=['0001' '0002' '0003' '0004' '0005' '0006' '0007' '0008'];
    % for i=1:32
    % KKEY(1,i*4-3:i*4)=de2bi(hex2dec(KKEY1(i)),4,'left-msb');
    % end

    %pembuatan sub key
    % kunci=KKEY;
    kunci=kunci_idea;
    % kunci=ones(1,128);

    subkeyrot(1,:)=kunci;

    for i=2:13
    subkeyrot(i,:) = circshift(subkeyrot(i-1,:),[0 -25]);
    end


    1%
    for i=1:6
    Z(i,:,1)=subkeyrot(1,16*i-15:16*i);
    end

    2%
    for i=7:8
    Z(i-6,:,2)=subkeyrot(1,16*i-15:16*i);
    end
    for i=1:4
    Z(i+2,:,2)=subkeyrot(2,16*i-15:16*i);
    end

    3%
    for i=5:8
    Z(i-4,:,3)=subkeyrot(2,16*i-15:16*i);
    end

    for i=1:2
    Z(i+4,:,3)=subkeyrot(3,16*i-15:16*i);
    end

    4%
    for i=3:8
    Z(i-2,:,4)=subkeyrot(3,16*i-15:16*i);
    end

    5%
    for i=1:6
    Z(i,:,5)=subkeyrot(4,16*i-15:16*i);
    end

    6%
    for i=7:8
    Z(i-6,:,6)=subkeyrot(4,16*i-15:16*i);
    end

    for i=1:4
    Z(i+2,:,6)=subkeyrot(5,16*i-15:16*i);
    end

    7%
    for i=5:8
    Z(i-4,:,7)=subkeyrot(5,16*i-15:16*i);
    end
    for i=1:2
    Z(i+4,:,7)=subkeyrot(6,16*i-15:16*i);
    end

    8%
    for i=3:8
    Z(i-2,:,8)=subkeyrot(6,16*i-15:16*i);
    end

    9%
    for i=1:4
    Z(i,:,9)=subkeyrot(7,16*i-15:16*i);
    end

    %key scedule selesai........

    % bit_masuk=[de2bi(0,16,'left-msb') de2bi(1,16,'left-msb') de2bi(2,16,'left-msb') de2bi(3,16,'left-msb')]
    bit_masuk=inputplain_idea;
    for i=1:4
    X(i,:)=bit_masuk(1,16*i-15:16*i);
    end

    for i=1:4
    Xde(i,1)=bi2de(X(i,:),'left-msb');
    end

    for r=1:8
    for i=1:6
    Zde(i,:,r)=bi2de(Z(i,:,r),'left-msb');
    end
    end

    for round=1:8
    for j=1:6
    if Zde(j,:,round)==0
    Zde(j,:,round)=2^16;
    else
    Zde(j,:,round)=Zde(j,:,round);
    end
    end
    end

    for round=1:8
    %a
    Xde(1,:)=mod(Xde(1,:)*Zde(1,:,round),2^16+1);
    Xde(4,:)=mod(Xde(4,:)*Zde(4,:,round),2^16+1);


    Xde(2,:)=mod(Xde(2,:)+Zde(2,:,round),2^16);
    Xde(3,:)=mod(Xde(3,:)+Zde(3,:,round),2^16);

    %b
    t0=mod(Zde(5,:,round)*double(bitxor(uint16(Xde(1,:)),uint16(Xde(3,:)))),2^16+1);

    t1=mod(Zde(6,:,round)*(mod(t0+double(bitxor(uint16(Xde(2,:)),uint16(Xde(4,:)))),2^16)),2^16+1);

    t2=mod(t0+t1,2^16);
    %c
    Xde(1,:)=double(bitxor(uint16(Xde(1,:)),uint16(t1)));
    Xde(4,:)=double(bitxor(uint16(Xde(4,:)),uint16(t2)));

    a=double(bitxor(uint16(Xde(2,:)),uint16(t2)));

    Xde(2,:)=double(bitxor(uint16(Xde(3,:)),uint16(t1)));

    Xde(3,:)=a;

    end


    for i=1:6
    Zde(i,:,9)=bi2de(Z(i,:,9),'left-msb');
    end


    Yde(1,:)=mod(Xde(1,:)*Zde(1,:,9),2^16+1);

    Yde(4,:)=mod(Xde(4,:)*Zde(4,:,9),2^16+1);

    Yde(2,:)=mod(Xde(3,:)+Zde(2,:,9),2^16);

    Yde(3,:)=mod(Xde(2,:)+Zde(3,:,9),2^16);

    if Yde(1,:)==65536
    Yde(1,:)=0;
    end

    if Yde(2,:)==65536
    Yde(2,:)=0;
    end

    if Yde(3,:)==65536
    Yde(3,:)=0;
    end

    if Yde(4,:)==65536
    Yde(4,:)=0;
    end
    de2bi(Yde(1,:),16,'left-msb');
    de2bi(Yde(2,:),16,'left-msb');
    de2bi(Yde(3,:),16,'left-msb') ;
    de2bi(Yde(4,:),16,'left-msb');
    ciphbiner=[de2bi(Yde(1,:),16,'left-msb') de2bi(Yde(2,:),16,'left-msb') de2bi(Yde(3,:),16,'left-msb') de2bi(Yde(4,:),16,'left-msb')];

    outputciph_idea=ciphbiner;

    save hasil_idea outputciph_idea



  2. Decryption: function [outputplain_idea] = dekripsi_idea(inputciph_idea, kunci_idea)



    % clc, clear all
    %
    % KKEY1=['0001' '0002' '0003' '0004' '0005' '0006' '0007' '0008'];
    % for i=1:32
    % KKEY(1,i*4-3:i*4)=de2bi(hex2dec(KKEY1(i)),4,'left-msb');
    % end
    function [outputplain_idea] = dekripsi_idea(inputciph_idea, kunci_idea)
    %pembuatan sub key

    % kunci=KKEY;
    % kunci=ones(1,128);
    kunci=kunci_idea;
    subkeyrot(1,:)=kunci;

    for i=2:13
    subkeyrot(i,:) = circshift(subkeyrot(i-1,:),[0 -25]);
    end


    1%
    for i=1:6
    Z(i,:,1)=subkeyrot(1,16*i-15:16*i);
    end

    2%
    for i=7:8
    Z(i-6,:,2)=subkeyrot(1,16*i-15:16*i);
    end
    for i=1:4
    Z(i+2,:,2)=subkeyrot(2,16*i-15:16*i);
    end

    3%
    for i=5:8
    Z(i-4,:,3)=subkeyrot(2,16*i-15:16*i);
    end

    for i=1:2
    Z(i+4,:,3)=subkeyrot(3,16*i-15:16*i);
    end

    4%
    for i=3:8
    Z(i-2,:,4)=subkeyrot(3,16*i-15:16*i);
    end

    5%
    for i=1:6
    Z(i,:,5)=subkeyrot(4,16*i-15:16*i);
    end

    6%
    for i=7:8
    Z(i-6,:,6)=subkeyrot(4,16*i-15:16*i);
    end

    for i=1:4
    Z(i+2,:,6)=subkeyrot(5,16*i-15:16*i);
    end

    7%
    for i=5:8
    Z(i-4,:,7)=subkeyrot(5,16*i-15:16*i);
    end
    for i=1:2
    Z(i+4,:,7)=subkeyrot(6,16*i-15:16*i);
    end

    8%
    for i=3:8
    Z(i-2,:,8)=subkeyrot(6,16*i-15:16*i);
    end

    9%
    for i=1:4
    Z(i,:,9)=subkeyrot(7,16*i-15:16*i);
    end

    for r=1:8
    for i=1:6
    Zde(i,:,r)=bi2de(Z(i,:,r),'left-msb');
    end
    end
    for i=1:6
    Zde(i,:,9)=bi2de(Z(i,:,9),'left-msb');
    end

    %bikin Z_aksen

    %round 1
    r1=1;
    Zde_aksen(1,:,r1)=invers_kali(Zde(1,:,10-r1));
    Zde_aksen(2,:,r1)=invers_tambah(Zde(2,:,10-r1));
    Zde_aksen(3,:,r1)=2^16-Zde(3,:,10-r1);
    Zde_aksen(4,:,r1)=invers_kali(Zde(4,:,10-r1));
    Zde_aksen(5,:,r1)=Zde(5,:,9-r1);
    Zde_aksen(6,:,r1)=Zde(6,:,9-r1);

    %round 2 sampe 8
    for rx=2:8
    Zde_aksen(1,:,rx)=invers_kali(Zde(1,:,10-rx));
    Zde_aksen(2,:,rx)=invers_tambah(Zde(3,:,10-rx));
    Zde_aksen(3,:,rx)=2^16-Zde(2,:,10-rx);
    Zde_aksen(4,:,rx)=invers_kali(Zde(4,:,10-rx));
    Zde_aksen(5,:,rx)=Zde(5,:,9-rx);
    Zde_aksen(6,:,rx)=Zde(6,:,9-rx);
    if Zde(5,:,9-rx)==0
    Zde_aksen(5,:,rx)=2^16;
    else
    Zde_aksen(5,:,rx)=Zde(5,:,9-rx);
    end
    if Zde(6,:,9-rx)==0
    Zde_aksen(6,:,rx)=2^16;
    else
    Zde_aksen(6,:,rx)=Zde(6,:,9-rx);
    end
    end

    r9=9;
    Zde_aksen(1,:,r9)=invers_kali(Zde(1,:,10-r9));
    Zde_aksen(2,:,r9)=invers_tambah(Zde(2,:,10-r9));
    Zde_aksen(3,:,r9)=2^16-Zde(3,:,10-r9);
    Zde_aksen(4,:,r9)=invers_kali(Zde(4,:,10-r9));

    % ronde=2;

    % key scedule selesai........

    % bit_masuk=[de2bi(4603,16,'left-msb') de2bi(60715,16,'left-msb') de2bi(408,16,'left-msb') de2bi(28133,16,'left-msb')]
    bit_masuk=inputciph_idea;
    for i=1:4
    X(i,:)=bit_masuk(1,16*i-15:16*i);
    end

    for i=1:4
    Xde(i,1)=bi2de(X(i,:),'left-msb');
    end


    % for round=1:8
    % for j=1:6
    % if Zde_aksen(j,:,round)==0
    % Zde_aksen(j,:,round)=2^16;
    % else
    % Zde_aksen(j,:,round)=Zde(j,:,round);
    % end
    % end
    % end


    % for ronde=1:8
    % kunci_hex(1,:,ronde)=dec2hex(Zde_aksen(1,:,ronde),4);
    % kunci_hex(2,:,ronde)=dec2hex(Zde_aksen(2,:,ronde),4);
    % kunci_hex(3,:,ronde)=dec2hex(Zde_aksen(3,:,ronde),4);
    % kunci_hex(4,:,ronde)=dec2hex(Zde_aksen(4,:,ronde),4);
    % kunci_hex(5,:,ronde)=dec2hex(Zde_aksen(5,:,ronde),4);
    % kunci_hex(6,:,ronde)=dec2hex(Zde_aksen(6,:,ronde),4);
    % end

    for round=1:8

    % round=1
    %a
    Xde(1,:)=mod(Xde(1,:)*Zde_aksen(1,:,round),2^16+1);
    Xde(4,:)=mod(Xde(4,:)*Zde_aksen(4,:,round),2^16+1);


    Xde(2,:)=mod(Xde(2,:)+Zde_aksen(2,:,round),2^16);
    Xde(3,:)=mod(Xde(3,:)+Zde_aksen(3,:,round),2^16);

    %b
    t0=mod(Zde_aksen(5,:,round)*double(bitxor(uint16(Xde(1,:)),uint16(Xde(3,:)))),2^16+1);

    t1=mod(Zde_aksen(6,:,round)*(mod(t0+double(bitxor(uint16(Xde(2,:)),uint16(Xde(4,:)))),2^16)),2^16+1);

    t2=mod(t0+t1,2^16);

    %c
    Xde(1,:)=double(bitxor(uint16(Xde(1,:)),uint16(t1)));
    Xde(4,:)=double(bitxor(uint16(Xde(4,:)),uint16(t2)));

    a=double(bitxor(uint16(Xde(2,:)),uint16(t2)));

    Xde(2,:)=double(bitxor(uint16(Xde(3,:)),uint16(t1)));

    Xde(3,:)=a;

    end
    % %
    % % %
    % % %
    % % %
    % % hasil(1,:)=dec2hex(Xde(1,:),4);
    % % hasil(2,:)=dec2hex(Xde(2,:),4);
    % % hasil(3,:)=dec2hex(Xde(3,:),4);
    % % hasil(4,:)=dec2hex(Xde(4,:),4)
    %
    for i=1:6
    Zde(i,:,9)=bi2de(Z(i,:,9),'left-msb');
    end


    Yde(1,:)=mod(Xde(1,:)*Zde_aksen(1,:,9),2^16+1);

    Yde(4,:)=mod(Xde(4,:)*Zde_aksen(4,:,9),2^16+1);

    Yde(2,:)=mod(Xde(3,:)+Zde_aksen(2,:,9),2^16);

    Yde(3,:)=mod(Xde(2,:)+Zde_aksen(3,:,9),2^16);



    ciphbiner=[de2bi(Yde(1,:),16,'left-msb') de2bi(Yde(2,:),16,'left-msb') de2bi(Yde(3,:),16,'left-msb') de2bi(Yde(4,:),16,'left-msb')];
    outputplain_idea=ciphbiner;



  3. Inverse: function [kunci_aksen] = invers_tambah(kunci_de)



    function [kunci_aksen] = invers_tambah(kunci_de)
    if kunci_de==0
    kunci_aksen=2^16;
    else
    kunci_aksen=2^16-kunci_de;
    end



  4. Inverse: function [kunci_aksen] = invers_kali(kunci_de)



    function [kunci_aksen] = invers_kali(kunci_de);

    [g,c,d]=gcd(2^16+1,kunci_de);
    if d<0
    d=2^16+1+d;
    elseif d==0
    d=2^16;
    else
    d=d;
    end
    kunci_aksen=d;



So, I created another MATLAB script to call the encryption and decryption function using different value for the arguments (inputplain_idea and kunchi_idea). However, most of the time I got the same error.



clc;

disp('Implementation of idea Encryption Algorithm');

clear all;
close all;

inputplain_idea = input('\nEnter data: ','s'); %SHOULD BE THERE
%inputplain_idea = 5546745
%kunci_idea = input('\nEnter 8 digit key: ');

%kunci_idea = de2bi([1 2 3 4 5 6 7 8],16)
%kunci_idea = vpi(2);
kunci_idea = [1,0,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1,1,0,0,0,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,0,0,0,1,1,0,0,1,0,1,0,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0,1,0,1,1,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,0,0,0,0,0,1,0,1,0,1,1,0,0,1,0]
%kunci_idea =[10110101,10010101,10110000,10110001,10110001,10010101,10111000,10111001,10110101,10010101,10110000,10110001,10110001,10010101,10111000,10111001]
%kunci_idea = [1;0;1;1;1;0;1;0;1;0;1;1;1;0;1;1;1;0;0;0;1;0;1;0;1;0;1;1;0;0;1;0;1;0;1;1;1;0;0;0;1;0;1;1;1;0;1;1;1;0;0;0;1;0;1;0;0;0;1;1;0;0;1;0;1;0;1;1;1;0;1;0;1;0;1;1;1;0;1;1;1;0;0;0;1;0;1;0;1;0;1;1;0;0;1;0;1;1;1;1;1;0;1;0;1;0;1;1;1;0;1;1;1;0;0;0;0;0;1;0;1;0;1;1;0;0;1;0]
%kunci_idea = [1;0;1;1;1;0;1;0;1;0;1;1;1;0;1;0]
%kunci_idea = [0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x11, 0xFB, 0xED, 0x2B, 0x01, 0x98, 0x6D, 0xE5, 0x11, 0xFB, 0xED, 0x2B, 0x01, 0x98, 0x6D, 0xE5, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x11, 0xFB, 0xED, 0x2B, 0x01, 0x98, 0x6D, 0xE5, 0x11, 0xFB, 0xED, 0x2B, 0x01, 0x98, 0x6D, 0xE5, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x11, 0xFB, 0xED, 0x2B, 0x01, 0x98, 0x6D, 0xE5, 0x11, 0xFB, 0xED, 0x2B, 0x01, 0x98, 0x6D, 0xE5, 0x11, 0xFB, 0xED, 0x2B, 0x01, 0x98, 0x6D, 0xE5]
%kunci_idea = [0x00; 0x01; 0x00; 0x02; 0x00; 0x03; 0x00; 0x04; 0x00; 0x05; 0x00; 0x06; 0x00; 0x07; 0x00; 0x08; 0x00; 0x05; 0x00; 0x06; 0x00; 0x07; 0x00; 0x08; 0x11; 0xFB; 0xED; 0x2B; 0x01; 0x98; 0x6D; 0xE5; 0x11; 0xFB; 0xED; 0x2B; 0x01; 0x98; 0x6D; 0xE5; 0x00; 0x01; 0x00; 0x02; 0x00; 0x03; 0x00; 0x04; 0x00; 0x05; 0x00; 0x06; 0x00; 0x07; 0x00; 0x08; 0x00; 0x05; 0x00; 0x06; 0x00; 0x07; 0x00; 0x08; 0x11; 0xFB; 0xED; 0x2B; 0x01; 0x98; 0x6D; 0xE5; 0x11; 0xFB; 0xED; 0x2B; 0x01; 0x98; 0x6D; 0xE5; 0x00; 0x01; 0x00; 0x02; 0x00; 0x03; 0x00; 0x04; 0x00; 0x05; 0x00; 0x06; 0x00; 0x07; 0x00; 0x08; 0x00; 0x05; 0x00; 0x06; 0x00; 0x07; 0x00; 0x08; 0x11; 0xFB; 0xED; 0x2B; 0x01; 0x98; 0x6D; 0xE5; 0x11; 0xFB; 0xED; 0x2B; 0x01; 0x98; 0x6D; 0xE5; 0x11; 0xFB; 0xED; 0x2B; 0x01; 0x98; 0x6D; 0xE5]

[outputciph_idea] = enkripsi_idea(inputplain_idea, kunci_idea);

disp('Encrypted:');
disp(outputciph_idea);

[outputplain_idea] = dekripsi_idea(inputciph_idea, kunci_idea)

disp('Decrypted:');
disp(outputplain_idea);


The error:



??? Index exceeds matrix dimensions.
Error in ==> enkripsi_idea at 86
X(i,:)=bit_masuk(1,16*i-15:16*i);
Error in ==> ideaenc at 24
[outputciph_idea] = enkripsi_idea(inputplain_idea, kunci_idea);




Aucun commentaire:

Enregistrer un commentaire