في أنظمة تسجيل الدخول المختلفة، يعد تشفير md5 لكلمات مرور المستخدم أمرًا لا غنى عنه.
لنضع الأمر بهذه الطريقة، حتى إذا رأيت كلمة مرور تسجيل الدخول الخاصة بالمستخدم من خلال وسائل مختلفة، فلن تتمكن من معرفة ماهيتها بسبب تلك السلسلة من الأشياء الغريبة، وهذه هي الحماية.
عملية التشفير md5 لا رجعة فيها، مما يعني أنه لا يمكنك حساب مظهرها الأصلي من خلال تلك السلسلة من الأشياء الغريبة.
ما يلي هو رمز md5 الكامل. لا تفهم الخوارزمية، فقط اتصل به مباشرة عندما تحتاج إليه.
الخاص BITS_TO_A_BYTE = 8 الخاص BYTES_TO_A_WORD = 4 الخاص BITS_TO_A_WORD = 32 خاص m_lOnBits(30) خاص m_l2Power(30) وظيفة خاصة LShift(lValue, iShiftBits)If iShiftBits = 0 ثمLShift = lValueExit FunctionElseIf iShiftBits = 31 ThenIf lValue و1 ThenLShift = &H80000000ElseLShift = 0End IfExit FunctionElseIf iShiftBits < 0 أو iShiftBits > 31 ثمErr.Raise 6End If (lValue And m_l2Power(31 - iShiftBits)) ثمLShift = ((lValue و m_lOnBits( 31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) أو &H80000000ElseLShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits)) وظيفة End IfEnd الخاصة RShift(lValue, iShiftBits)If iShiftBits = 0 ثمRShift = لو (lValue و&H80000000) ثمRShift = (RShift Or (&H40000000 / m_l2Power(iShiftBits - 1)))End IfEnd وظيفة خاصة RotateLeft(lValue, iShiftBits)RotateLeft = LShift(lValue, iShiftBits) أو RShift(lValue, (32 - iShi فتبت) )نهاية الوظيفة الخاصة AddUnsigned(lX, lY)Dim lX4Dim lY4Dim lX8Dim lY8Dim lResult lX8 = lX و&H80000000lY8 = lY و&H80000000lX4 = lX و&H40000000lY4 = lY و&H40000000 lResult = (lX و &H3FFFFFF) + (lY و &H3FFFFFF) إذا lX4 و lY4 ثمlResult = lResult Xor &H80000000 Xor lX8 Xor lY8ElseIf lX4 أو lY4 ثمIf lResult و &H40000000 ثمlResult = lResult lX8 Xor lY8ElselResult = lResult Xor &H40000000 Xor lX8 Xor lY8End IfElselResult = lResult z) نهاية الوظيفة الخاصة md5_G(x, y, z)md5_G = (x و z) أو (y و (ليس z)) نهاية الوظيفة الخاصة md5_H(x, y, z)md5_H = (x Xor y Xor z) )نهاية الوظيفة الخاصة md5_I(x, y, z)md5_I = (y Xor (x أو (ليس z)))نهاية الوظيفة الفرعية الخاصة md5_FF(a, b, c, d, x, s, ac)a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))a = RotateLeft(a, s)a = AddUnsigned(a, b)End Sub Private Sub md5_GG(a, b, c, d, x, s, ac)a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))a = RotateLeft(a, s)a = AddUnsigned(a, b)End Sub Private Sub md5_HH(a, b, c) , d, x, s, ac)a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))a = RotateLeft(a, s)a = AddUnsigned(a, b)End Sub Private Sub md5_II(a, b, c, d, x, s, ac)a = AddUnsigned (أ، AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))a = RotateLeft(a, s)a = AddUnsigned(a, b)End Sub Private Function ConvertToWordArray(sMessage)Dim lMessageLengthDim lNumberOfWordsDim lWordArray()Dim lBytePositionDim lByteCountDim lWordCount Const MODULUS_BITS = 512Const CONGRUENT_BITS = 448 lMessage الطول = Len(sMessage) lNumberOfWords = (((lmessageLength + ((modulus_bits - contant_bits) / bits_to_a_byte)) / (modulus_bits / bits_to_a_byte)) + 1) * (modulus_bits / bits_to_word) levlyray (lnumberfwords - 1) = 0 افعل حتى lByteCount >= lMessageLengthlWordCount = lByteCount / BYTES_TO_A_WORDlBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTElWordArray(lWordCount) = lWordArray(lWordCount) أو LS hift(تصاعدي(Mid(sMessage, lByteCount + 1, 1))), lBytePosition)lByteCount = lByteCount + 1Loop lWordCount = lByteCount / BYTES_TO_A_WORDlBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE lWordArray(lWordCount) = lWordArray(lWordCo unt) أو LShift(&H80, lBytePosition) lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29) ConvertToWordArray = lWordArrayEnd وظيفة خاصة WordToHex(lValue)Dim lByteDim lCount For lCount = 0 إلى 3lByte = RShift(lValue, العدد* BITS_TO_A_BYTE) وm_lOnBits(BITS_TO_A_BYTE - 1)WordToHex = WordToHex & Right("0" & Hex(lByte)، 2) وظيفة NextEnd الوظيفة العامة MD5(sMessage, stype)m_lOnBits(0) = CLng(1)m_lOnBits(1) ) = CLng(3)m_lOnBits(2) = CLng(7)m_lOnBits(3) = CLng(15)m_lOnBits(4) = CLng(31)m_lOnBits(5) = CLng(63)m_lOnBits(6) = CLng(127)m_lOnBits(7) = CLng(255)m_lOnBits (8) = CLng(511)m_lOnBits(9) = CLng(1023)m_lOnBits(10) = CLng(2047)m_lOnBits(11) = CLng(4095)m_lOnBits(12) = CLng(8191)m_lOnBits(13) = CLng(16383)m_lOnBits (14) = CLng(32767)m_lOnBits(15) = CLng(65535)m_lOnBits(16) = CLng(131071)m_lOnBits(17) = CLng(262143)m_lOnBits(18) = CLng(524287)m_lOnBits(19) = CLng(1048575)m_lOnBits(20) = CLng(2097151)m_lOnBits(21) = CLng(4194303)m_lOnBits(22) = CLng(8388607)m_lOnBits(23) = CLng(16777215)m_lOnBits(24) = CLng(33554431)m_lOnBits(25) = CLng(67108863)m_lOnBits(26) = CLng(134217727)m_lOnBits(27) = CLng(268435455)m_lOnBits(28) = CLng(536870911)m_lOnBits(29) = CLng(1073741823)m_lOnBits(30) = CLng(2147483647) m_l2Power(0) = CLng(1)m_l2Power(1) = CLng(2)m_l2Power(2) = CLng(4)m_l2Power(3) = CLng(8)m_l2Power(4) = CLng(16)m_l2Power(5) = CLng(32)m_l2Power(6) = CLng(64)m_l2Power(7) = CLng(128)m_l2Power (8) = CLng(256)m_l2Power(9) = CLng(512)m_l2Power(10) = CLng(1024)m_l2Power(11) = CLng(2048)m_l2Power(12) = CLng(4096)m_l2Power(13) = CLng(8192)m_l2Power(14) = CLng(16384)m_l2Power (15) = CLng(32768)m_l2Power(16) = CLng(65536)m_l2Power(17) = CLng(131072)m_l2Power(18) = CLng(262144)m_l2Power(19) = CLng(524288)m_l2Power(20) = CLng(1048576)m_l2Power(21) = CLng(2097152)m_l2Power(22) = CLng(4194304)m_l2Power(23) = CLng(8388608)m_l2Power(24) = CLng(16777216)m_l2Power(25) = CLng(33554432)m_l2Power(26) = CLng(67108864)m_l2Power(27) = CLng(134217728)m_l2Power(28) = CLng(268435456)m_l2Power(29) = CLng(536870912)m_l2Power(30) = CLng(1073741824) خافت S31 = 4Const S32 = 11Const S33 = 16Const S34 = 23Const S41 = 6Const S42 = 10Const S43 = 15Const S44 = 21 x = ConvertToWordArray(sMessage) a = &H67452301b = &HEFCDAB89c = &H98BADCFEd = &H10325476 لـ k = 0 إلى UBound(x) الخطوة 16AA = aBB = bCC = cDD = d md5_FF a, b, c, d, x(k + 0), S11, &HD76AA478md5_FF d, a, b, c, x(k + 1)، S12، &HE8C7B756md5_FF ج، د، أ، ب، س (ك + 2)، S13، &H242070DBmd5_FF ب، ج، د، أ، س (ك + 3)، S14، &HC1BDCEEEmd5_FF أ، ب، ج، د، س (ك + 4)، S11، &HF57C0FAFmd5_FF د، أ، ب، ج، س (ك + 5)، S12، &H4787C62Amd5_FF c, d, a, b, x(k + 6), S13, &HA8304613md5_FF b, c, d, a, x(k + 7), S14, &HFD469501md5_FF a, b, c, d, x(k + 8) ) ، S11، &H698098D8md5_FF d, a, b, c, x(k + 9), S12, &H8B44F7AFmd5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1md5_FF b, c, d, a, x(k + 11) ) ، S14، &H895CD7BEmd5_FF a, b, c, d, x(k + 12), S11, &H6B901122md5_FF d, a, b, c, x(k + 13), S12, &HFD987193md5_FF c, d, a, b, x(k + 14) ) ، S13، &HA679438Emd5_FF b, c, d, a, x(k + 15), S14, &H49B40821 md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562md5_GG d, a, b, c, x(k + 6)، S22، &HC040B340md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AAmd5_GG a, b, c, d, x(k + 5) ) ، S21، &HD62F105Dmd5_GG d, a, b, c, x(k + 10), S22, &H2441453md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681md5_GG b, c, d, a, x(k + 4) ) ، S24، &HE7D3FBC8md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6md5_GG c, d, a, b, x(k + 3) ) ، S23، &HF4D50D87md5_GG b, c, d, a, x(k + 8), S24, &H455A14EDmd5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905md5_GG d, a, b, c, x(k + 2) )، S22، &HFCEFA3F8md5_GG ج، د، أ، ب، س (ك + 7)، S23، &H676F02D9md5_GG ب، ج، د، أ، س (ك + 12)، S24، &H8D2A4C8A md5_HH أ، ب، ج، د، س (ك + 5) ) ، S31، &HFFFA3942md5_HH د، أ، ب، ج، x(k + 8), S32, &H8771F681md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380Cmd5_HH a, b, ج، د، س(ك + 1)، S31، &HA4BEEA44md5_HH d، a، b، c، x(k + 4)، S32، &H4BDECFA9md5_HH c، d، a، b، x(k + 7)، S33، &HF6BB4B60md5_HH b، c، d، a، x(k + 10)، S34، &HBEBFBC70md5_HH أ، ب، ج، د، س (ك + 13)، S31، &H289B7EC6md5_HH د، أ، ب، ج، س (ك + 0)، S32، &HEAA127FAmd5_HH ج، د، أ، ب، س (ك + 3) ، S33، &HD4EF3085md5_HH ب، ج، د، أ، س(ك + 6)، S34، &H4881D05md5_HH أ، ب، ج، د، س (ك + 9)، S31، & HD9D4D039md5_HH د، أ، ب، ج، س (ك + 12)، S32، & HE6DB99E5md5_HH ج، د، أ، ب، س(ك + 15)، S33، &H1FA27CF8md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665 md5_II a, b, c, d, x(k + 0), S41, &HF4292244md5_II d, a, b, c, x(k + 7)، S42، &H432AFF97md5_II ج، د، أ، ب، س (ك + 14)، S43، &HAB9423A7md5_II ب، ج، د، أ، س (ك + 5)، S44، &HFC93A039md5_II أ، ب، ج، د، س (ك + 12) ، S41، &H655B59C3md5_II د، أ، ب، ج، x(k + 3), S42, &H8F0CCC92md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47Dmd5_II b, c, d, a, x(k + 1), S44, &H85845DD1md5_II a, b, ج، د، س (ك + 8)، S41، &H6FA87E4Fmd5_II d, a, b, c, x(k + 15), S42, &HFE2CE6E0md5_II c, d, a, b, x(k + 6), S43, &HA3014314md5_II b, c, d, a, x(k + 13) ) ، S44، &H4E0811A1md5_II a, b, c, d, x(k + 4), S41, &HF7537E82md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235md5_II c, d, a, b, x(k + 2) ) ، S43، &H2AD7D2BBmd5_II b, c, d, a, x(k + 9), S44, &HEB86D391 a = AddUnsigned(a, AA)b = AddUnsigned(b, BB)c = AddUnsigned(c, CC)d = AddUnsigned(d, DD )التالي إذا stype = 32 ثمMD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))ElseMD5 = LCase(WordToHex(b) & WordToHex(c))End IfEnd FunctionSub test()MsgBox MD5("a", 16) 'MsgBox مشفرة 16 بت MD5 ("a"، 32) 'تشفير 32 بتEnd Sub