คัดลอกรหัสรหัสดังต่อไปนี้:
หน่วย MD5;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม,
กล่องโต้ตอบ, StdCtrls;
พิมพ์
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: MD5Context);
ขั้นตอน MD5Update (บริบท var: MD5Context; อินพุต: PAnsiChar;
ความยาว: คำยาว);
ขั้นตอน MD5Final (บริบท var: MD5Context; var Digest: MD5Digest);
ฟังก์ชั่น MD5File (N: สตริง): MD5Digest;
ฟังก์ชัน MD5Print(D: MD5Digest): AnsiString;
ฟังก์ชั่น MD5F (ชื่อไฟล์: AnsiString): AnsiString;
ฟังก์ชั่น MD5S (Str: AnsiString): AnsiString;
// MD5F คือการคำนวณค่า MD5 ของไฟล์ MD5S คือการคำนวณค่า MD5 ของสตริง!
var
ช่องว่างภายใน: 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;
จบ;
ฟังก์ชั่น I(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);
เริ่ม
รวม(a, F(b, c, D) + x + ac);
เน่า(a, s);
รวม(ก, ข);
จบ;
ขั้นตอน GG (var a: DWORD; b, c, D, x: DWORD; s: Byte; ac: DWORD);
เริ่ม
รวม(a, G(b, c, D) + x + ac);
เน่า(a, s);
รวม(ก, ข);
จบ;
ขั้นตอน HH(var a: DWORD; b, c, D, x: DWORD; s: Byte; ac: DWORD);
เริ่ม
รวม(a, H(b, c, D) + x + ac);
เน่า(a, s);
รวม(ก, ข);
จบ;
ขั้นตอนที่ 2 (var a: DWORD; b, c, D, x: DWORD; s: Byte; ac: DWORD);
เริ่ม
รวม(a, I(b, c, D) + x + ac);
เน่า(a, s);
รวม(ก, ข);
จบ;
เข้ารหัสขั้นตอน (แหล่งที่มา เป้าหมาย: ตัวชี้ จำนวน: คำยาว);
var
s:พีไบต์;
T: PDWORD;
ฉัน: คำยาว;
เริ่ม
s := ที่มา;
T := เป้าหมาย;
for I := 1 ถึง Count div 4 do
เริ่ม
ต^ := ส^;
รวม;
T^ := T^ หรือ (s^ shl 8);
รวม;
T^ := T^ หรือ (s^ shl 16);
รวม;
T^ := T^ หรือ (s^ shl 24);
รวม;
รวม(T);
จบ;
จบ;
ขั้นตอนการถอดรหัส (แหล่งที่มา เป้าหมาย: ตัวชี้ จำนวน: คำยาว);
var
s: PDWORD;
T: Pไบต์;
ฉัน: คำยาว;
เริ่ม
s := ที่มา;
T := เป้าหมาย;
สำหรับฉัน := 1 เพื่อนับทำ
เริ่ม
T^ := s^ และ $FF;
รวม(T);
T^ := (s^ shr 8) และ $FF;
รวม(T);
T^ := (s^ shr 16) และ $FF;
รวม(T);
T^ := (s^ shr 24) และ $FF;
รวม(T);
รวม;
จบ;
จบ;
ขั้นตอนการแปลง (บัฟเฟอร์: ตัวชี้; var State: MD5State);
var
ก, ข, ค, ง: DWORD;
บล็อก: MD5บล็อก;
เริ่ม
เข้ารหัส(บัฟเฟอร์, @Block, 64);
ก := รัฐ[0];
ข := รัฐ[1];
ค := รัฐ[2];
D := รัฐ[3];
FF(ก, ข, ค, ดี, บล็อค[0], 7, $D76AA478);
FF(D, a, b, c, บล็อก[1], 12, $E8C7B756);
FF(c, D, a, b, Block[2], 17, $242070DB);
FF(b, c, D, a, บล็อก[3], 22, $C1BDCEEE);
FF(ก, ข, ค, ดี, บล็อก[4], 7, $F57C0FAF);
FF(D, a, b, c, บล็อก[5], 12, $4787C62A);
FF(c, D, a, b, บล็อก[6], 17, $A8304613);
FF(b, c, D, a, บล็อก[7], 22, $FD469501);
FF(a, b, c, D, บล็อก[8], 7, $698098D8);
FF(D, a, b, c, บล็อค[9], 12, $8B44F7AF);
FF(c, D, a, b, บล็อก[10], 17, $FFFF5BB1);
FF(b, c, D, a, บล็อก[11], 22, $895CD7BE);
FF(a, b, c, D, บล็อก[12], 7, $6B901122);
FF(D, a, b, c, บล็อก[13], 12, $FD987193);
FF(ค, ดี, เอ, บี, บล็อค[14], 17, $A679438E);
FF(b, c, D, a, บล็อค[15], 22, $49B40821);
GG(ก, ข, ค, ดี, บล็อก[1], 5, $F61E2562);
GG(D, a, b, c, บล็อก[6], 9, $C040B340);
GG(c, D, a, b, บล็อก[11], 14, $265E5A51);
GG(ข, ค, ดี, เอ, บล็อค[0], 20, $E9B6C7AA);
GG(a, b, c, D, บล็อก[5], 5, $D62F105D);
GG(D, a, b, c, บล็อก[10], 9, $2441453);
GG(ซี, ดี, เอ, บี, บล็อก[15], 14, $D8A1E681);
GG(b, c, D, a, บล็อก[4], 20, $E7D3FBC8);
GG(a, b, c, D, บล็อก[9], 5, $21E1CDE6);
GG(D, a, b, c, บล็อก[14], 9, $C33707D6);
GG(ซี, ดี, เอ, บี, บล็อค[3], 14, $F4D50D87);
GG(b, c, D, a, บล็อก[8], 20, $455A14ED);
GG(ก, ข, ค, ดี, บล็อก[13], 5, $A9E3E905);
GG(D, a, b, c, บล็อก[2], 9, $FCEFA3F8);
GG(c, D, a, b, บล็อก[7], 14, $676F02D9);
GG(b, c, D, a, บล็อก[12], 20, $8D2A4C8A);
HH(a, b, c, D, บล็อก[5], 4, $FFFA3942);
HH(D, a, b, c, บล็อค[8], 11, $8771F681);
HH(c, D, a, b, บล็อค[11], 16, $6D9D6122);
HH(b, c, D, a, บล็อค[14], 23, $FDE5380C);
HH(ก, ข, ค, ดี, บล็อก[1], 4, $A4BEEA44);
HH(D, a, b, c, บล็อก[4], 11, $4BDECFA9);
HH(c, D, a, b, บล็อค[7], 16, $F6BB4B60);
HH(b, c, D, a, บล็อค[10], 23, $BEBFBC70);
HH(a, b, c, D, บล็อก[13], 4, $289B7EC6);
HH(D, a, b, c, บล็อก[0], 11, $EAA127FA);
HH(c, D, a, b, บล็อค[3], 16, $D4EF3085);
HH(b, c, D, a, บล็อค[6], 23, $4881D05);
HH(a, b, c, D, บล็อก[9], 4, $D9D4D039);
HH(D, a, b, c, บล็อก[12], 11, $E6DB99E5);
HH(c, D, a, b, บล็อค[15], 16, $1FA27CF8);
HH(b, c, D, a, บล็อค[2], 23, $C4AC5665);
II(ก, ข, ค, ดี, บล็อก[0], 6, $F4292244);
II(ดี, a, b, c, บล็อค[7], 10, $432AFF97);
II(ซี, ดี, เอ, บี, บล็อค[14], 15, $AB9423A7);
II(b, c, D, a, บล็อค[5], 21, $FC93A039);
II(a, b, c, D, บล็อก[12], 6, $655B59C3);
II(D, a, b, c, บล็อก[3], 10, $8F0CCC92);
II(c, D, a, b, บล็อก[10], 15, $FFEFF47D);
II(b, c, D, a, บล็อก[1], 21, $85845DD1);
II(ก, ข, ค, ดี, บล็อก[8], 6, $6FA87E4F);
II(D, a, b, c, บล็อก[15], 10, $FE2CE6E0);
II(c, D, a, b, บล็อก[6], 15, $A3014314);
II(b, c, D, a, บล็อค[13], 21, $4E0811A1);
II(ก, ข, ค, ดี, บล็อก[4], 6, $F7537E82);
II(D, a, b, c, บล็อก[11], 10, $BD3AF235);
II(c, D, a, b, บล็อก[2], 15, $2AD7D2BB);
II(b, c, D, a, บล็อก[9], 21, $EB86D391);
inc (สถานะ [0], a);
inc(สถานะ[1], b);
inc (สถานะ [2], c);
inc(สถานะ[3], D);
จบ;
ขั้นตอน MD5Init (บริบท var: MD5Context);
เริ่ม
ด้วยบริบททำ
เริ่ม
รัฐ[0] := $67452301;
สถานะ[1] := $EFCDAB89;
รัฐ[2] := $98BADCFE;
รัฐ[3] := $10325476;
จำนวน[0] := 0;
นับ[1] := 0;
ZeroMemory(@บัฟเฟอร์, ขนาดของ (MD5Buffer));
จบ;
จบ;
ขั้นตอน MD5Update (บริบท var: MD5Context; อินพุต: PAnsiChar;
ความยาว: คำยาว);
var
ดัชนี: คำยาว;
PartLen: คำยาว;
ฉัน: คำยาว;
เริ่ม
ด้วยบริบททำ
เริ่ม
ดัชนี := (นับ[0] shr 3) และ $3F;
inc (นับ [0], ความยาว shl 3);
ถ้า Count[0] < (ความยาว shl 3) แล้ว
inc(นับ[1]);
inc (นับ [1], ความยาว shr 29);
จบ;
PartLen := 64 - ดัชนี;
ถ้าความยาว >= PartLen แล้ว
เริ่ม
CopyMemory(@Context.Buffer[ดัชนี], อินพุต, PartLen);
แปลง(@Context.Buffer, Context.State);
ฉัน := พาร์เลน;
ในขณะที่ I + 63 < ความยาวทำ
เริ่ม
แปลง(@Input[I], Context.State);
รวม(I, 64);
จบ;
ดัชนี := 0;
จบ
อื่น
ฉัน := 0;
CopyMemory(@Context.Buffer[ดัชนี], @Input[I], ความยาว - I);
จบ;
ขั้นตอน MD5Final (บริบท var: MD5Context; var Digest: MD5Digest);
var
บิต: MD5CBits;
ดัชนี: คำยาว;
PadLen: คำยาว;
เริ่ม
ถอดรหัส(@Context.Count, @Bits, 2);
ดัชนี := (Context.Count[0] shr 3) และ $3F;
ถ้าดัชนี < 56 แล้ว
PadLen := 56 - ดัชนี
อื่น
PadLen := 120 - ดัชนี;
MD5Update (บริบท, @PADDING, PadLen);
MD5Update(บริบท, @Bits, 8);
ถอดรหัส(@Context.State, @Digest, 4);
ZeroMemory(@บริบท, ขนาดของ (MD5Context));
จบ;
ฟังก์ชั่น MD5String (M: AnsiString): MD5Digest;
var
บริบท: MD5Context;
เริ่ม
MD5Init(บริบท);
MD5Update (บริบท, PAnsiChar (M), ความยาว (M));
MD5Final (บริบท, ผลลัพธ์);
จบ;
ฟังก์ชั่น MD5File (N: สตริง): MD5Digest;
var
FileHandle: THandle;
MapHandle: THandle;
ตัวชี้มุมมอง: ตัวชี้;
บริบท: MD5Context;
เริ่ม
MD5Init(บริบท);
FileHandle := CreateFile(PWideChar(WideString(N)), ทั่วไป_อ่าน,
FILE_SHARE_READ หรือ FILE_SHARE_WRITE ไม่มี OPEN_EXISTING
FILE_ATTRIBUTE_NORMAL หรือ FILE_FLAG_SEQUENTIAL_SCAN, 0);
ถ้า FileHandle <> INVALID_HANDLE_VALUE แล้ว
พยายาม
MapHandle := CreateFileMapping(FileHandle, ไม่มี, PAGE_READONLY, 0, 0, ไม่มี);
ถ้า MapHandle <> 0 แล้ว
พยายาม
ViewPointer := MapViewOfFile (MapHandle, FILE_MAP_READ, 0, 0, 0);
ถ้า ViewPointer <> ไม่มีเลย
พยายาม
MD5Update (บริบท, ViewPointer, GetFileSize (FileHandle, ไม่มี));
ในที่สุด
UnmapViewOfFile(ViewPointer);
จบ;
ในที่สุด
CloseHandle(แมปแฮนเดิล);
จบ;
ในที่สุด
CloseHandle(ตัวจัดการไฟล์);
จบ;
MD5Final (บริบท, ผลลัพธ์);
จบ;
ฟังก์ชัน MD5Print(D: MD5Digest): AnsiString;
var
ฉัน: ไบต์;
ค่าคงที่
ตัวเลข: อาร์เรย์ [0 .. 15] ของ Ansichar = ('0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f');
เริ่ม
ผลลัพธ์ := '';
สำหรับฉัน := 0 ถึง 15 ทำ
ผลลัพธ์ := ผลลัพธ์ + ตัวเลข[(D[I] shr 4) และ $0F] + ตัวเลข[D[I] และ $0F];
จบ;
ฟังก์ชัน MD5Match (D1, D2: MD5Digest): บูลีน;
var
ฉัน: ไบต์;
เริ่ม
ฉัน := 0;
ผลลัพธ์ := จริง;
ในขณะที่ผลลัพธ์และ (I <16) ทำ
เริ่ม
ผลลัพธ์ := D1[I] = D2[I];
รวม(ฉัน);
จบ;
จบ;
ฟังก์ชั่น MD5S (Str: AnsiString): AnsiString;
เริ่ม
ผลลัพธ์ := MD5Print(MD5String(Str));
จบ;
ฟังก์ชั่น MD5F (ชื่อไฟล์: AnsiString): AnsiString;
เริ่ม
ผลลัพธ์ := MD5Print(MD5File(string(FileName)));
จบ;