MD5加密算法以及原理delphi版.docx
- 文档编号:9134083
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:16
- 大小:19.41KB
MD5加密算法以及原理delphi版.docx
《MD5加密算法以及原理delphi版.docx》由会员分享,可在线阅读,更多相关《MD5加密算法以及原理delphi版.docx(16页珍藏版)》请在冰点文库上搜索。
MD5加密算法以及原理delphi版
1.MD5算法说明
一、补位
二、补数据长度
三、初始化MD5参数
四、处理位操作函数
五、主要变换过程
六、输出结果
补位:
MD5算法先对输入的数据进行补位,使得数据位长度LEN对512求余的结果是448。
即数据扩展至K*512+448位。
即K*64+56个字节,K为整数。
具体补位操作:
补一个1,然后补0至满足上述要求。
补数据长度:
用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。
这时,数
据就被填补成长度为512位的倍数。
初始化MD5参数:
四个32位整数(A,B,C,D)用来计算信息摘要,初始化使用的是十六进制表
示的数字
A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210
处理位操作函数:
X,Y,Z为32位整数。
F(X,Y,Z)=X&Y|NOT(X)&Z
G(X,Y,Z)=X&Z|Y?
(Z)
H(X,Y,Z)=XxorYxorZ
I(X,Y,Z)=Yxor(X|not(Z))
主要变换过程:
使用常数组T[1...64],T[i]为32位整数用16进制表示,数据用16个32位
的整数数组M[]表示。
具体过程如下:
Fori=0toN/16-1do
Forj=0to15do
SetX[j]toM[i*16+j].
end/结束对J的循环
AA=A
BB=B
CC=C
DD=D
[ABCD071][DABC1122][CDAB2173][BCDA3
224]
[ABCD475][DABC5126][CDAB6177][BCDA7
228]
[ABCD879][DABC91210][CDAB101711][BCDA
112212]
[ABCD12713][DABC131214][CDAB141715]
[BCDA152216]
[ABCD1517][DABC6918][CDAB111419][BCDA
02020]
[ABCD5521][DABC10922][CDAB151423]
[BCDA42024]
[ABCD9525][DABC14926][CDAB31427][BCDA
82028]
[ABCD13529][DABC2930][CDAB71431][BCDA
122032]
[ABCD5433][DABC81134][CDAB111635]
[BCDA142336]
[ABCD1437][DABC41138][CDAB71639][BCDA
102340]
[ABCD13441][DABC01142][CDAB31643]
[BCDA62344]
[ABCD9445][DABC121146][CDAB151647]
[BCDA22348]
[ABCD0649][DABC71050][CDAB141551]
[BCDA52152]
[ABCD12653][DABC31054][CDAB101555]
[BCDA12156]
[ABCD8657][DABC151058][CDAB61559]
[BCDA132160]
[ABCD4661][DABC111062][CDAB21563]
[BCDA92164]
A=A+AA
B=B+BB
C=C+CC
D=D+DD
end
输出结果。
2.实现代码:
{unitUnit2;
interface
implementation
end.
具体使用方法如下,另外还附有源代码:
MD5加密算法(DELPHI)}
unitUnit2;
//-----------------------------------------------------------------------------------------------
INTERFACE
//-----------------------------------------------------------------------------------------------
uses
Windows;
type
MD5Count=array[0..1]ofDWORD;
MD5State=array[0..3]ofDWORD;
MD5Block=array[0..15]ofDWORD;
MD5CBits=array[0..7]ofbyte;
MD5Digest=array[0..15]ofbyte;
MD5Buffer=array[0..63]ofbyte;
MD5Context=record
State:
MD5State;
Count:
MD5Count;
Buffer:
MD5Buffer;
end;
procedureMD5Init(varContext:
MD5Context);
procedureMD5Update(varContext:
MD5Context;Input:
pChar;Length:
longword);
procedureMD5Final(varContext:
MD5Context;varDigest:
MD5Digest);
functionMD5String(M:
string):
MD5Digest;
functionMD5File(N:
string):
MD5Digest;
functionMD5Print(D:
MD5Digest):
string;
functionMD5Match(D1,D2:
MD5Digest):
boolean;
//-----------------------------------------------------------------------------------------------
IMPLEMENTATION
//-----------------------------------------------------------------------------------------------
var
PADDING:
MD5Buffer=(
$80,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00
);
functionF(x,y,z:
DWORD):
DWORD;
begin
Result:
=(xandy)or((notx)andz);
end;
functionG(x,y,z:
DWORD):
DWORD;
begin
Result:
=(xandz)or(yand(notz));
end;
functionH(x,y,z:
DWORD):
DWORD;
begin
Result:
=xxoryxorz;
end;
functionI(x,y,z:
DWORD):
DWORD;
begin
Result:
=yxor(xor(notz));
end;
procedurerot(varx:
DWORD;n:
BYTE);
begin
x:
=(xshln)or(xshr(32-n));
end;
procedureFF(vara:
DWORD;b,c,d,x:
DWORD;s:
BYTE;ac:
DWORD);
begin
inc(a,F(b,c,d)+x+ac);
rot(a,s);
inc(a,b);
end;
procedureGG(vara:
DWORD;b,c,d,x:
DWORD;s:
BYTE;ac:
DWORD);
begin
inc(a,G(b,c,d)+x+ac);
rot(a,s);
inc(a,b);
end;
procedureHH(vara:
DWORD;b,c,d,x:
DWORD;s:
BYTE;ac:
DWORD);
begin
inc(a,H(b,c,d)+x+ac);
rot(a,s);
inc(a,b);
end;
procedureII(vara:
DWORD;b,c,d,x:
DWORD;s:
BYTE;ac:
DWORD);
begin
inc(a,I(b,c,d)+x+ac);
rot(a,s);
inc(a,b);
end;
//-----------------------------------------------------------------------------------------------
//EncodeCountbytesatSourceinto(Count/4)DWORDsatTarget
procedureEncode(Source,Target:
pointer;Count:
longword);
var
S:
PByte;
T:
PDWORD;
I:
longword;
begin
S:
=Source;
T:
=Target;
forI:
=1toCountdiv4dobegin
T^:
=S^;
inc(S);
T^:
=T^or(S^shl8);
inc(S);
T^:
=T^or(S^shl16);
inc(S);
T^:
=T^or(S^shl24);
inc(S);
inc(T);
end;
end;
//DecodeCountDWORDsatSourceinto(Count*4)BytesatTarget
procedureDecode(Source,Target:
pointer;Count:
longword);
var
S:
PDWORD;
T:
PByte;
I:
longword;
begin
S:
=Source;
T:
=Target;
forI:
=1toCountdobegin
T^:
=S^and$ff;
inc(T);
T^:
=(S^shr8)and$ff;
inc(T);
T^:
=(S^shr16)and$ff;
inc(T);
T^:
=(S^shr24)and$ff;
inc(T);
inc(S);
end;
end;
//TransformStateaccordingtofirst64bytesatBuffer
procedureTransform(Buffer:
pointer;varState:
MD5State);
var
a,b,c,d:
DWORD;
Block:
MD5Block;
begin
Encode(Buffer,@Block,64);
a:
=State[0];
b:
=State[1];
c:
=State[2];
d:
=State[3];
FF(a,b,c,d,Block[0],7,$d76aa478);
FF(d,a,b,c,Block[1],12,$e8c7b756);
FF(c,d,a,b,Block[2],17,$242070db);
FF(b,c,d,a,Block[3],22,$c1bdceee);
FF(a,b,c,d,Block[4],7,$f57c0faf);
FF(d,a,b,c,Block[5],12,$4787c62a);
FF(c,d,a,b,Block[6],17,$a8304613);
FF(b,c,d,a,Block[7],22,$fd469501);
FF(a,b,c,d,Block[8],7,$698098d8);
FF(d,a,b,c,Block[9],12,$8b44f7af);
FF(c,d,a,b,Block[10],17,$ffff5bb1);
FF(b,c,d,a,Block[11],22,$895cd7be);
FF(a,b,c,d,Block[12],7,$6b901122);
FF(d,a,b,c,Block[13],12,$fd987193);
FF(c,d,a,b,Block[14],17,$a679438e);
FF(b,c,d,a,Block[15],22,$49b40821);
GG(a,b,c,d,Block[1],5,$f61e2562);
GG(d,a,b,c,Block[6],9,$c040b340);
GG(c,d,a,b,Block[11],14,$265e5a51);
GG(b,c,d,a,Block[0],20,$e9b6c7aa);
GG(a,b,c,d,Block[5],5,$d62f105d);
GG(d,a,b,c,Block[10],9,$2441453);
GG(c,d,a,b,Block[15],14,$d8a1e681);
GG(b,c,d,a,Block[4],20,$e7d3fbc8);
GG(a,b,c,d,Block[9],5,$21e1cde6);
GG(d,a,b,c,Block[14],9,$c33707d6);
GG(c,d,a,b,Block[3],14,$f4d50d87);
GG(b,c,d,a,Block[8],20,$455a14ed);
GG(a,b,c,d,Block[13],5,$a9e3e905);
GG(d,a,b,c,Block[2],9,$fcefa3f8);
GG(c,d,a,b,Block[7],14,$676f02d9);
GG(b,c,d,a,Block[12],20,$8d2a4c8a);
HH(a,b,c,d,Block[5],4,$fffa3942);
HH(d,a,b,c,Block[8],11,$8771f681);
HH(c,d,a,b,Block[11],16,$6d9d6122);
HH(b,c,d,a,Block[14],23,$fde5380c);
HH(a,b,c,d,Block[1],4,$a4beea44);
HH(d,a,b,c,Block[4],11,$4bdecfa9);
HH(c,d,a,b,Block[7],16,$f6bb4b60);
HH(b,c,d,a,Block[10],23,$bebfbc70);
HH(a,b,c,d,Block[13],4,$289b7ec6);
HH(d,a,b,c,Block[0],11,$eaa127fa);
HH(c,d,a,b,Block[3],16,$d4ef3085);
HH(b,c,d,a,Block[6],23,$4881d05);
HH(a,b,c,d,Block[9],4,$d9d4d039);
HH(d,a,b,c,Block[12],11,$e6db99e5);
HH(c,d,a,b,Block[15],16,$1fa27cf8);
HH(b,c,d,a,Block[2],23,$c4ac5665);
II(a,b,c,d,Block[0],6,$f4292244);
II(d,a,b,c,Block[7],10,$432aff97);
II(c,d,a,b,Block[14],15,$ab9423a7);
II(b,c,d,a,Block[5],21,$fc93a039);
II(a,b,c,d,Block[12],6,$655b59c3);
II(d,a,b,c,Block[3],10,$8f0ccc92);
II(c,d,a,b,Block[10],15,$ffeff47d);
II(b,c,d,a,Block[1],21,$85845dd1);
II(a,b,c,d,Block[8],6,$6fa87e4f);
II(d,a,b,c,Block[15],10,$fe2ce6e0);
II(c,d,a,b,Block[6],15,$a3014314);
II(b,c,d,a,Block[13],21,$4e0811a1);
II(a,b,c,d,Block[4],6,$f7537e82);
II(d,a,b,c,Block[11],10,$bd3af235);
II(c,d,a,b,Block[2],15,$2ad7d2bb);
II(b,c,d,a,Block[9],21,$eb86d391);
inc(State[0],a);
inc(State[1],b);
inc(State[2],c);
inc(State[3],d);
end;
//-----------------------------------------------------------------------------------------------
//InitializegivenContext
procedureMD5Init(varContext:
MD5Context);
begin
withContextdobegin
State[0]:
=$67452301;
State[1]:
=$efcdab89;
State[2]:
=$98badcfe;
State[3]:
=$10325476;
Count[0]:
=0;
Count[1]:
=0;
ZeroMemory(@Buffer,SizeOf(MD5Buffer));
end;
end;
//UpdategivenContexttoincludeLengthbytesofInput
procedureMD5Update(varContext:
MD5Context;Input:
pChar;Length:
longword);
var
Index:
longword;
PartLen:
longword;
I:
longword;
begin
withContextdobegin
Index:
=(Count[0]shr3)and$3f;
inc(Count[0],Lengthshl3);
ifCount[0]<(Lengthshl3)theninc(Count[1]);
inc(Count[1],Lengthshr29);
end;
PartLen:
=64-Index;
ifLength>=PartLenthenbegin
CopyMemory(@Context.Buffer[Index],Input,PartLen);
Transform(@Context.Buffer,Context.State);
I:
=PartLen;
whileI+63 Transform(@Input[I],Context.State); inc(I,64); end; Index: =0; endelseI: =0; CopyMemory(@Context.Buffer[Index],@Input[I],Length-I); end; //FinalizegivenContext,createDigestandzeroizeContext procedureMD5Final(varContext: MD5Context;varDigest: MD5Digest); var Bits: MD5CBits; Index: longword; PadLen: longword; begin Decode(@Context.Count,@Bits,2); Index: =(Context.Count[0]shr3)and$3f; ifIndex<56thenPadLen: =56-IndexelsePadLen: =120-Index; MD5Update(Context,@PADDING,PadLen); MD5Update(Context,@Bits,8); Decode(@Context.State,@Digest,4); ZeroMemory(@Context,SizeOf(MD5Context)); en
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MD5 加密算法 以及 原理 delphi