📄 md5.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This program applies Message Digest5 (MD5) Hashing Algorithm %
% Developed by Maimouna Al-ammar %
% 5th Year, Computer Engineering Department, University of Damascus %
% Information and Network Security Material %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Remove all variables, functions in the matlab Workspace to forbid any
% conflicts in values
clear all;
% Clear command window
clc;
% opening the file being ciphered
f1=fopen('Plain.txt','r+');
% reading file for the first time to know number of bytes
[Data1,count1]=fread(f1);
% ---------------------------------------------------------------
% Appending length in bits
% ---------------------------------------------------------------
b=count1;
b=b*8;
b=de2bi(b,64);
len=[b(1:32)' b(33:64)'];
b=[b(1:8); b(9:16); b(17:24); b(25:32);b(33:40);b(41:48);b(49:56);b(57:64)];
b=bi2de(b);
cnt=fwrite(f1,b);
% ---------------------------------------------------------------
% Appending Padding Bits so that message length is a multiple of 512 bits
% ---------------------------------------------------------------------
a=mod(count1+8,64);
if a~=0
dif=64-a-1;
ext=[1 0 0 0 0 0 0 0];
ext=bi2de(ext);
ext=[ext zeros(1,dif)];
cnt=fwrite(f1,ext);
end
fclose(f1);
% ---------------------------------------------------------------
% Processing Message in 16-Word Blocks
% ---------------------------------------------------------------
% We first define four auxiliary functions that each take as input
% three 32-bit words and produce as output one 32-bit word.
% F(X,Y,Z) = XY v not(X) Z
% G(X,Y,Z) = XZ v Y not(Z)
% H(X,Y,Z) = X xor Y xor Z
% I(X,Y,Z) = Y xor (X v not(Z))
% We use a 64-element table T[1 ... 64] constructed from the
% sine function
% note: 2^32=4294967296 and i argument is in radians
T=[];
for i=1:64
t(i)=fix(4294967296*abs(sin(i)));
end
for i=1:64
T(:,i)=de2bi(t(i),32)';
end
% ---------------------------------------------------------------
% Reading to know the new length after padding if any
% ---------------------------------------------------------------
f1=fopen('Plain.txt');
[Data1,count2]=fread(f1);
fclose(f1);
f1=fopen('Plain.txt');
% ---------------------------------------------------------------
% Reading whole message into 512 bits-blocked array.
% ---------------------------------------------------------------
for i=1:count2/64
data=fread(f1,64);
data=de2bi(data,8);
data=data';
block(:,i)=data(:);
end
fclose(f1);
% ---------------------------------------------------------------
% Empty array to store Message Digest
MessageDigst=[];
% ---------------------------------------------------------------
% Initializing MD Buffer, values given in Hex
% ---------------------------------------------------------------
A='67452301';
B='efcdab89';
C='98badcfe';
D='10325476';
% ---------------------------------------------------------------
% Save A as AA, B as BB, C as CC, and D as DD.
%----------------------------------------------------------------
AA = de2bi(hex2dec(A),32);
AA=AA';
BB = de2bi(hex2dec(B),32);
BB=BB';
CC = de2bi(hex2dec(C),32);
CC=CC';
DD = de2bi(hex2dec(D),32);
DD=DD';
A=AA;
B=BB;
C=CC;
D=DD;
% First for loop processes all 16-word (512 bits) blocks
for i=1:count2/64
w=1;
% Second for loop processes each block
for j=1:16
% Copy block i into X
X(:,j)=block(w:w+31,i);
w=w+32;
end
%--------------------------------------------------------
% Round 1.
% Let [abcd k s i] denote the operation ...
% a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)
%--------------------------------------------------------
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Ffunction(BB,CC,DD)),X(:,1)),T(:,1)),7)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Ffunction(AA,BB,CC)),X(:,2)),T(:,2)),12)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Ffunction(DD,AA,BB)),X(:,3)),T(:,3)),17)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Ffunction(CC,DD,AA)),X(:,4)),T(:,4)),22)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Ffunction(BB,CC,DD)),X(:,5)),T(:,5)),7)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Ffunction(AA,BB,CC)),X(:,6)),T(:,6)),12)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Ffunction(DD,AA,BB)),X(:,7)),T(:,7)),17)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Ffunction(CC,DD,AA)),X(:,8)),T(:,8)),22)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Ffunction(BB,CC,DD)),X(:,9)),T(:,9)),7)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Ffunction(AA,BB,CC)),X(:,10)),T(:,10)),12)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Ffunction(DD,AA,BB)),X(:,11)),T(:,11)),17)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Ffunction(CC,DD,AA)),X(:,12)),T(:,12)),22)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Ffunction(BB,CC,DD)),X(:,13)),T(:,13)),7)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Ffunction(AA,BB,CC)),X(:,14)),T(:,14)),12)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Ffunction(DD,AA,BB)),X(:,15)),T(:,15)),17)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Ffunction(CC,DD,AA)),X(:,16)),T(:,16)),22)));
%--------------------------------------------------------
% Round 2.
% Let [abcd k s i] denote the operation ...
% a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s)
%--------------------------------------------------------
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Gfunction(BB,CC,DD)),X(:,2)),T(:,17)),5)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Gfunction(AA,BB,CC)),X(:,7)),T(:,18)),9)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Gfunction(DD,AA,BB)),X(:,12)),T(:,19)),14)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Gfunction(CC,DD,AA)),X(:,1)),T(:,20)),20)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Gfunction(BB,CC,DD)),X(:,6)),T(:,21)),5)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Gfunction(AA,BB,CC)),X(:,11)),T(:,22)),9)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Gfunction(DD,AA,BB)),X(:,16)),T(:,23)),14)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Gfunction(CC,DD,AA)),X(:,5)),T(:,24)),20)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Gfunction(BB,CC,DD)),X(:,10)),T(:,25)),5)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Gfunction(AA,BB,CC)),X(:,15)),T(:,26)),9)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Gfunction(DD,AA,BB)),X(:,4)),T(:,27)),14)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Gfunction(CC,DD,AA)),X(:,9)),T(:,28)),20)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Gfunction(BB,CC,DD)),X(:,14)),T(:,29)),5)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Gfunction(AA,BB,CC)),X(:,3)),T(:,30)),9)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Gfunction(DD,AA,BB)),X(:,8)),T(:,31)),14)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Gfunction(CC,DD,AA)),X(:,13)),T(:,32)),20)));
%-------------------------------------------------------
% Round 3.
% Let [abcd k s i] denote the operation ...
% a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s)
%--------------------------------------------------------
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Hfunction(BB,CC,DD)),X(:,6)),T(:,33)),4)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Hfunction(AA,BB,CC)),X(:,9)),T(:,34)),11)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Hfunction(DD,AA,BB)),X(:,12)),T(:,35)),16)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Hfunction(CC,DD,AA)),X(:,15)),T(:,36)),23)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(A,Hfunction(BB,CC,DD)),X(:,2)),T(:,37)),4)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Hfunction(AA,BB,CC)),X(:,5)),T(:,38)),11)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Hfunction(DD,AA,BB)),X(:,8)),T(:,39)),16)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Hfunction(CC,DD,AA)),X(:,11)),T(:,40)),23)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Hfunction(BB,CC,DD)),X(:,14)),T(:,41)),4)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Hfunction(AA,BB,CC)),X(:,1)),T(:,42)),11)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Hfunction(DD,AA,BB)),X(:,4)),T(:,43)),16)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Hfunction(CC,DD,AA)),X(:,7)),T(:,44)),23)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Hfunction(BB,CC,DD)),X(:,10)),T(:,45)),4)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Hfunction(AA,BB,CC)),X(:,13)),T(:,46)),11)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Hfunction(DD,AA,BB)),X(:,16)),T(:,47)),16)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Hfunction(CC,DD,AA)),X(:,3)),T(:,48)),23)));
%-------------------------------------------------------
% Round 4.
% Let [abcd k s i] denote the operation ...
% a = b+ ((a + I(b,c,d) + X[k] + T[i]) <<< s)
%--------------------------------------------------------
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Ifunction(BB,CC,DD)),X(:,1)),T(:,49)),6)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Ifunction(AA,BB,CC)),X(:,8)),T(:,50)),10)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Ifunction(DD,AA,BB)),X(:,15)),T(:,51)),15)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Ifunction(CC,DD,AA)),X(:,6)),T(:,52)),21)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Ifunction(BB,CC,DD)),X(:,13)),T(:,53)),6)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Ifunction(AA,BB,CC)),X(:,4)),T(:,54)),10)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Ifunction(DD,AA,BB)),X(:,11)),T(:,55)),15)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Ifunction(CC,DD,AA)),X(:,2)),T(:,56)),21)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Ifunction(BB,CC,DD)),X(:,9)),T(:,57)),6)));
DD=AddBin(AA,(shiftleft(AddBin(AddBin(AddBin(DD,Ifunction(AA,BB,CC)),X(:,16)),T(:,58)),10)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Ifunction(DD,AA,BB)),X(:,7)),T(:,59)),15)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Ifunction(CC,DD,AA)),X(:,14)),T(:,60)),21)));
AA=AddBin(BB,(shiftleft(AddBin(AddBin(AddBin(AA,Ifunction(BB,CC,DD)),X(:,5)),T(:,61)),6)));
DD=AddBin(A,(shiftleft(AddBin(AddBin(AddBin(DD,Ifunction(AA,BB,CC)),X(:,12)),T(:,62)),10)));
CC=AddBin(DD,(shiftleft(AddBin(AddBin(AddBin(CC,Ifunction(DD,AA,BB)),X(:,3)),T(:,63)),15)));
BB=AddBin(CC,(shiftleft(AddBin(AddBin(AddBin(BB,Ifunction(CC,DD,AA)),X(:,10)),T(:,64)),21)));
%-------------------------------------------------------
% Then perform the following additions. (That is increment each
% of the four registers by the value it had before this block
% was started)
%-------------------------------------------------------
% The message digest produced as output is A, B, C, D
%-------------------------------------------------------
A =AddBin(A,AA);
B =AddBin(B,BB);
C =AddBin(C,CC);
D =AddBin(D,DD);
% Storing Message Digest for each block
MessageDigest=[MessageDigest A' B' C' D'];
% end of for loop on i
end
MessageDigest=[MessageDigest A' B' C' D'];
% end of for loop on i
L=length(MessageDigest);
MD=[];
for i=1:8:L
bindata=MessageDigest(1,i:i+7);
decdata=bi2de(bindata);
MD=[MD decdata];
end
% Writing MD to a seperate file
fid=fopen('MD.txt','w');
o=fwrite(fid,MD);
fclose(fid);
% End of Program
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -