انسخ رمز الكود كما يلي:
وحدة MD5؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، المتغيرات، الفئات، الرسومات، عناصر التحكم، النماذج،
مربعات الحوار، ستدكترلس؛
يكتب
MD5Count = الصفيف [0 .. 1] من DWORD؛
MD5State = الصفيف [0 .. 3] من DWORD؛
MD5Block = الصفيف [0 .. 15] من DWORD؛
MD5CBits = الصفيف [0 .. 7] من البايت؛
MD5Digest = مصفوفة [0 .. 15] من البايت؛
MD5Buffer = مصفوفة [0 .. 63] من البايت؛
MD5Context = السجل
الحالة: MD5State؛
العدد: MD5Count؛
المخزن المؤقت: MD5Buffer؛
نهاية؛
الإجراء MD5Init(var context: MD5Context);
الإجراء MD5Update(var context: MD5Context; الإدخال: PAnsiChar;
الطول: كلمة طويلة)؛
الإجراء MD5Final(var context: MD5Context; var Digest: MD5Digest);
وظيفة MD5File (N: سلسلة): MD5Digest؛
وظيفة MD5Print(D: MD5Digest): AnsiString;
وظيفة MD5F (اسم الملف: AnsiString): AnsiString؛
وظيفة MD5S (سلسلة: AnsiString): AnsiString؛
// MD5F هو حساب قيمة MD5 للملف، MD5S هو حساب قيمة MD5 للسلسلة!
فار
الحشو: 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 دولار)؛
تطبيق
الدالة F(x, y, z: DWORD): DWORD;
يبدأ
النتيجة:= (x و y) أو ((ليس x) و z)؛
نهاية؛
الدالة G(x, y, z: DWORD): DWORD;
يبدأ
النتيجة:= (x وz) أو (y و(ليس z))؛
نهاية؛
الدالة H(x, y, z: DWORD): DWORD;
يبدأ
النتيجة := x xor y xor z;
نهاية؛
الوظيفة الأولى (x، y، z: DWORD): DWORD؛
يبدأ
النتيجة := y xor (x أو (ليس z));
نهاية؛
تعفن الإجراء (var x: DWORD; N: Byte);
يبدأ
x := (x shl N) أو (x shr (32 - N))؛
نهاية؛
الإجراء FF(var a: DWORD; b, c, D, x: DWORD; s: Byte; ac: DWORD);
يبدأ
inc(a, F(b, c, D) + x + ac);
تعفن (أ، ق)؛
المؤتمر الوطني العراقي (أ، ب)؛
نهاية؛
الإجراء GG(var a: DWORD; b, c, D, x: DWORD; s: Byte; ac: DWORD);
يبدأ
inc(a, G(b, c, D) + x + ac);
تعفن (أ، ق)؛
المؤتمر الوطني العراقي (أ، ب)؛
نهاية؛
الإجراء HH(var a: DWORD; b, c, D, x: DWORD; s: Byte; ac: DWORD);
يبدأ
inc(a, H(b, c, D) + x + ac);
تعفن (أ، ق)؛
المؤتمر الوطني العراقي (أ، ب)؛
نهاية؛
الإجراء II(var a: DWORD; b, c, D, x: DWORD; s: Byte; ac: DWORD);
يبدأ
inc(a, I(b, c, D) + x + ac);
تعفن (أ، ق)؛
المؤتمر الوطني العراقي (أ، ب)؛
نهاية؛
تشفير الإجراء (المصدر، الهدف: المؤشر؛ العدد: كلمة طويلة)؛
فار
ق:بيتيت؛
T: بي دي وورد؛
أنا: كلمة طويلة؛
يبدأ
ق := المصدر؛
ت := الهدف؛
لأني := 1 لعدد div 4 do
يبدأ
ت^ := ق^;
المؤتمر الوطني العراقي (ق)؛
T^ := T^ أو (s^ shl 8);
المؤتمر الوطني العراقي (ق)؛
T^ := T^ أو (s^ shl 16);
المؤتمر الوطني العراقي (ق)؛
T^ := T^ أو (s^ shl 24);
المؤتمر الوطني العراقي (ق)؛
المؤتمر الوطني العراقي(T);
نهاية؛
نهاية؛
فك تشفير الإجراء (المصدر، الهدف: المؤشر؛ العدد: كلمة طويلة)؛
فار
الصورة: بي دي وورد؛
T: بيتابايت؛
أنا: كلمة طويلة؛
يبدأ
ق := المصدر؛
ت := الهدف؛
لأني := 1 لعد القيام به
يبدأ
T^ := s^ و$FF؛
المؤتمر الوطني العراقي(T);
T^ := (s^ shr 8) و$FF؛
المؤتمر الوطني العراقي(T);
T^ := (s^ shr 16) و$FF؛
المؤتمر الوطني العراقي(T);
T^ := (s^ shr 24) و$FF؛
المؤتمر الوطني العراقي(T);
المؤتمر الوطني العراقي (ق)؛
نهاية؛
نهاية؛
الإجراء تحويل (المخزن المؤقت: المؤشر؛ حالة فار: MD5State)؛
فار
أ، ب، ج، د: DWORD؛
الكتلة: MD5Block؛
يبدأ
Encode(Buffer, @Block, 64);
أ := الحالة[0];
ب := الحالة[1];
ج := الحالة[2];
D := الحالة[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(أ، ب، ج، د، بلوك[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(د، أ، ب، ج، بلوك [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);
سمو (أ، ب، ج، د، بلوك [5]، 4، $FFFA3942)؛
سمو (د، أ، ب، ج، بلوك [8]، 11، 8771F681 دولار)؛
سمو (ج، د، أ، ب، بلوك [11]، 16، $6D9D6122)؛
سمو (ب، ج، د، أ، بلوك [14]، 23، $FDE5380C)؛
HH(a, b, c, D, Block[1], 4, $A4BEEA44);
سمو (د، أ، ب، ج، بلوك [4]، 11، $4BDECFA9)؛
HH(c, D, a, b, Block[7], 16, $F6BB4B60);
HH(b, c, D, a, Block[10], 23, $BEBFBC70);
سمو (أ، ب، ج، د، بلوك [13]، 4، $289B7EC6)؛
سمو (د، أ، ب، ج، بلوك [0]، 11، $EAA127FA)؛
HH(c, D, a, b, Block[3], 16, $D4EF3085);
سمو (ب، ج، د، أ، بلوك [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(أ، ب، ج، د، بلوك[0]، 6، $F4292244)؛
II(د، أ، ب، ج، بلوك [7]، 10، 432 دولار أمريكي 97)؛
II(ج، د، أ، ب، بلوك[14]، 15، $AB9423A7)؛
II(ب، ج، د، أ، بلوك[5]، 21، $FC93A039)؛
II(أ، ب، ج، د، بلوك[12]، 6، $655B59C3)؛
II(D, a, b, c, Block[3], 10, $8F0CCC92);
II(ج، د، أ، ب، بلوك [10]، 15، $FFFEFF47D)؛
II(b, c, D, a, Block[1], 21, $85845DD1);
II(أ، ب، ج، د، بلوك[8]، 6، $6FA87E4F)؛
II(د، أ، ب، ج، بلوك [15]، 10، $FE2CE6E0)؛
II(ج، د، أ، ب، بلوك[6]، 15، $A3014314)؛
II(ب، ج، د، أ، بلوك [13]، 21، $4E0811A1)؛
II(أ، ب، ج، د، بلوك[4]، 6، $F7537E82)؛
II(د، أ، ب، ج، بلوك [11]، 10، $BD3AF235)؛
II(ج، د، أ، ب، بلوك[2]، 15، $2AD7D2BB)؛
II(ب، ج، د، أ، بلوك [9]، 21، $EB86D391)؛
المؤتمر الوطني العراقي(الدولة[0]، أ)؛
المؤتمر الوطني العراقي(الدولة[1]، ب)؛
المؤتمر الوطني العراقي(الدولة[2]، ج)؛
المؤتمر الوطني العراقي(الدولة[3], D);
نهاية؛
الإجراء MD5Init(var context: MD5Context);
يبدأ
مع السياق تفعل
يبدأ
الحالة[0] := 67452301 دولار;
الحالة[1] := $EFCDAB89;
الحالة[2] := $98BADCFE;
الحالة[3] := 10325476 دولار؛
عدد[0] := 0;
العدد[1] := 0;
ZeroMemory(@Buffer, SizeOf(MD5Buffer));
نهاية؛
نهاية؛
الإجراء MD5Update(var context: MD5Context; الإدخال: PAnsiChar;
الطول: كلمة طويلة)؛
فار
الفهرس: كلمة طويلة؛
PartLen: كلمة طويلة؛
أنا: كلمة طويلة؛
يبدأ
مع السياق تفعل
يبدأ
الفهرس := (العدد[0] shr 3) و$3F؛
inc(Count[0], Length shl 3);
إذا كان العدد [0] < (الطول shl 3) إذن
المؤتمر الوطني العراقي(العدد[1]);
المؤتمر الوطني العراقي (العدد [1]، الطول 29)؛
نهاية؛
PartLen := 64 - الفهرس؛
إذا كان الطول >= PartLen إذن
يبدأ
CopyMemory(@Context.Buffer[Index], Input, PartLen);
Transform(@Context.Buffer, context.State);
أنا := PartLen;
بينما أنا + 63 < الطول
يبدأ
Transform(@Input[I], context.State);
المؤتمر الوطني العراقي (أنا، 64)؛
نهاية؛
الفهرس := 0;
نهاية
آخر
أنا := 0;
CopyMemory(@Context.Buffer[Index], @Input[I], Length - I);
نهاية؛
الإجراء MD5Final(var context: MD5Context; var Digest: MD5Digest);
فار
البتات: MD5CBits؛
الفهرس: كلمة طويلة؛
PadLen: كلمة طويلة؛
يبدأ
Decode(@Context.Count, @Bits, 2);
الفهرس := (Context.Count[0] shr 3) و$3F؛
إذا كان الفهرس <56 ثم
PadLen := 56 - الفهرس
آخر
PadLen := 120 - الفهرس؛
MD5Update(Context, @PADDING, PadLen);
MD5Update(Context, @Bits, 8);
Decode(@Context.State, @Digest, 4);
ZeroMemory(@Context, SizeOf(MD5Context));
نهاية؛
وظيفة MD5String(M: AnsiString): MD5Digest;
فار
السياق: MD5Context؛
يبدأ
MD5Init(Context);
MD5Update(Context, PAnsiChar(M), Length(M));
MD5Final(السياق، النتيجة)؛
نهاية؛
وظيفة MD5File (N: سلسلة): MD5Digest؛
فار
مقبض الملف: Thandle؛
MapHandle: Thandle؛
ViewPointer: المؤشر؛
السياق: MD5Context؛
يبدأ
MD5Init(Context);
FileHandle := CreateFile(PWideChar(WideString(N)))، GENERIC_READ،
FILE_SHARE_READ أو FILE_SHARE_WRITE، لا شيء، OPEN_EXISTING،
FILE_ATTRIBUTE_NORMAL أو FILE_FLAG_SEQUENTIAL_SCAN، 0)؛
إذا FileHandle <> INVALID_HANDLE_VALUE ثم
يحاول
MapHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil);
إذا MapHandle <> 0 ثم
يحاول
ViewPointer := MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0);
إذا كان ViewPointer <> لا شيء إذن
يحاول
MD5Update(Context, ViewPointer, GetFileSize(FileHandle, nil));
أخيراً
UnmapViewOfFile(ViewPointer);
نهاية؛
أخيراً
CloseHandle(MapHandle);
نهاية؛
أخيراً
CloseHandle(FileHandle);
نهاية؛
MD5Final(السياق، النتيجة)؛
نهاية؛
وظيفة MD5Print(D: MD5Digest): AnsiString;
فار
أنا: بايت؛
ثابت
الأرقام: المصفوفة [0 .. 15] من Ansichar = ('0'، '1'، '2'، '3'، '4'، '5'، '6'، '7'،
'8'، '9'، 'أ'، 'ب'، 'ج'، 'د'، 'ه'، 'و')؛
يبدأ
النتيجة := '';
لأني := 0 إلى 15 افعل
النتيجة := النتيجة + الأرقام[(D[I] shr 4) و$0F] + الأرقام[D[I] و$0F];
نهاية؛
الدالة MD5Match(D1, D2: MD5Digest): منطقية؛
فار
أنا: بايت؛
يبدأ
أنا := 0;
النتيجة :=صحيح؛
بينما النتيجة و (I <16) تفعل
يبدأ
النتيجة := D1[I] = D2[I];
المؤتمر الوطني العراقي (أنا)؛
نهاية؛
نهاية؛
وظيفة MD5S (سلسلة: AnsiString): AnsiString؛
يبدأ
النتيجة := MD5Print(MD5String(Str));
نهاية؛
وظيفة MD5F (اسم الملف: AnsiString): AnsiString؛
يبدأ
النتيجة := MD5Print(MD5File(string(FileName)));
نهاية؛