Implement IDEA algorithm in MATLAB
3 views (last 30 days)
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
Answers (0)
See Also
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!