Implement IDEA algorithm in MATLAB
Show older comments
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
on 18 Apr 2018
found error in line 66 plz help me by providing an appropirate code
Answers (0)
Categories
Find more on Digital Input and Output 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!