Implement IDEA algorithm in MATLAB

3 views (last 30 days)
Ajay Porwal
Ajay Porwal on 4 Feb 2015
Commented: shivam singh on 18 Apr 2018
Hey, 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);
  1 Comment
shivam singh
shivam singh on 18 Apr 2018
found error in line 66 plz help me by providing an appropirate code

Sign in to comment.

Answers (0)

Categories

Find more on Encryption / Cryptography in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!