¦¶¨|¿³
µù¥U®É¶¡: 2003-08-25 ¤å³¹: 661 ¨Ó¦Û: ¥x¤¤¥«¤j¨½°Ï
²Ä 1 ¼Ó
|
µoªí©ó: ¬P´Á¤ ¤T¤ë 10, 2017 3:14 pm ¤å³¹¥DÃD: MD5 µ{¦¡ |
|
|
³o¬O¥h¦~À°¤@¦ìª°¤Í¼gªº¡A¶K¤W¨Ó¡A¯Âºé¬O§K±o¥H«án§ä³o¨Çµ{¦¡½X¡A©È¦b¦Û¤v¹q¸£¤¤§ä¤£¨ì
³o¨Ç¤º®e°O±o¬O¤WºôªF§Û§Û¦è§Û§Û¡AµM«á¦A¨Ì¦Û¤vªº¼g§@²ßºD¾ã²zªº
¥N½X: |
* ------------------------------------------------------------------- *
* µ{¦¡¦WºÙ¡GMD5.PRG
* »¡©ú¡G±N¶Ç¤Jªº¦r¦ê¡A¸g MD5 ½s½X«á¶Ç¦^
* «Ø¥ß¤é´Á¡G2016/06/02
* §ó·s¤é´Á¡G2016/06/02
* ------------------------------------------------------------------- *
* °Ñ¼Æ «¬ºA »¡©ú
* ------------------ ---- -------------------------------------------
* Input:
* LP_cToCodingStr C n½s½Xªº¦r¦ê
* (LP_nCodingBits) N ¥H¦h¤Ö¦ì¤¸½s½X¡C32 (¹w³]È) ©Î 16 ¨âºØ
* Output:
* Wo_cTransMD5Str C A.¸g MD5 ½s½X«áªº¦r¦ê
* B.LP_nCodingBits = 32 => ¿é¥X 32 Bytes ¦r¦ê
* LP_nCodingBits = 16 => ¿é¥X 16 Bytes ¦r¦ê
* ½d¨Ò¡G
* ? MD5("The quick brown fox jumps over the lazy dog")
* 9e107d9d372bb6826bd81d3542a419d6
* ------------------------------------------------------------------- *
LPARAMETERS LP_cToCodingStr, LP_nCodingBits
LOCAL Wo_cTransMD5Str && C ¸g MD5 ½s½X«áªº¦r¦ê
Wo_cTransMD5Str = ""
* -------- *
* °Ñ¼ÆÀˬd *
* -------- *
IF TYPE("LP_cToCodingStr") <> "C"
RETURN Wo_cTransMD5Str
ENDIF
IF TYPE("LP_nCodingBits") <> "N"
LP_nCodingBits = 32
ENDIF
IF !INLIST(LP_nCodingBits, 16, 32)
LP_nCodingBits = 32
ENDIF
* ------------ *
* °Ï°ìÅܼƫŧi *
* ------------ *
LOCAL W1_nBYTES_TO_A_WORD,; && N
W1_nBITS_TO_A_WORD,; && N
W1_nMODULUS_BITS,; && N
W1_nCONGRUENT_BITS && N
LOCAL W1_nS11,; && N
W1_nS12,; && N
W1_nS13,; && N
W1_nS14,; && N
W1_nS21,; && N
W1_nS22,; && N
W1_nS23,; && N
W1_nS24,; && N
W1_nS31,; && N
W1_nS32,; && N
W1_nS33,; && N
W1_nS34,; && N
W1_nS41,; && N
W1_nS42,; && N
W1_nS43,; && N
W1_nS44 && N
LOCAL W1_nSUB_A,; && N FOR ... ENDFOR °j°é¾n¼Ð
W1_nToCodingStrLen,; && N n½s½Xªº¦r¦êªø«×
W1_nRow4NumberOfWords && N ¬ÛÃö°}¦C(W1_aWordArray, W1_aX)ªº¦C¼Æ
LOCAL W1_nA, W1_nB, W1_nC, W1_nD, W1_nAA, W1_nBB, W1_nCC, W1_nDD && N
* ------------ *
* ¨p¦³Åܼƫŧi *
* ------------ *
PRIVATE M_nBITS_TO_A_BYTE && N
DIMENSION M_a2Power[31] && A ¦s©ñ 2 ªº¦¸¤è(0 .. 30)¡C2^0, 2^1, .., 2^30
DIMENSION M_aOnBits[31] && A ¦s©ñ 2 ªº¦¸¤è(1 .. 31) ´î 1¡C2^1-1, 2^2-1, .., 2^31-1
* -------------- *
* ¨p¦³Åܼƪì©lÈ *
* -------------- *
FOR W1_nSUB_A = 1 TO 31
IF W1_nSUB_A = 1
M_a2Power[W1_nSUB_A] = 1
ELSE
M_a2Power[W1_nSUB_A] = M_a2Power[W1_nSUB_A-1] * 2
ENDIF
ENDFOR
FOR W1_nSUB_A = 1 TO 31
IF W1_nSUB_A = 31
M_aOnBits[W1_nSUB_A] = M_a2Power[W1_nSUB_A] * 2 - 1
ELSE
M_aOnBits[W1_nSUB_A] = M_a2Power[W1_nSUB_A+1] - 1
ENDIF
ENDFOR
M_nBITS_TO_A_BYTE = 8
* -------------- *
* °Ï°ìÅܼƪì©lÈ *
* -------------- *
W1_nBYTES_TO_A_WORD = 4
W1_nBITS_TO_A_WORD = 32
W1_nMODULUS_BITS = 512
W1_nCONGRUENT_BITS = 448
W1_nS11 = 07
W1_nS12 = 12
W1_nS13 = 17
W1_nS14 = 22
W1_nS21 = 05
W1_nS22 = 09
W1_nS23 = 14
W1_nS24 = 20
W1_nS31 = 04
W1_nS32 = 11
W1_nS33 = 16
W1_nS34 = 23
W1_nS41 = 06
W1_nS42 = 10
W1_nS43 = 15
W1_nS44 = 21
W1_nToCodingStrLen = LEN(LP_cToCodingStr)
W1_nRow4NumberOfWords = (INT((W1_nToCodingStrLen + INT((W1_nMODULUS_BITS - W1_nCONGRUENT_BITS) / M_nBITS_TO_A_BYTE)) / INT(W1_nMODULUS_BITS / M_nBITS_TO_A_BYTE)) + 1) * INT(W1_nMODULUS_BITS / W1_nBITS_TO_A_WORD)
* ----------------------- *
* «Ø¥ß W1_aWordArray °}¦C *
* ----------------------- *
LOCAL ARRAY W1_aWordArray[W1_nRow4NumberOfWords] && A
STORE 0 TO W1_aWordArray
LOCAL W1_nBytePosition,; && N
W1_nByteCount,; && N
W1_nWordCount && N
W1_nBytePosition = 0
W1_nByteCount = 0
DO WHILE W1_nByteCount < W1_nToCodingStrLen
W1_nWordCount = INT(W1_nByteCount / W1_nBYTES_TO_A_WORD)
W1_nBytePosition = MOD(W1_nByteCount, W1_nBYTES_TO_A_WORD) * M_nBITS_TO_A_BYTE
W1_aWordArray[W1_nWordCount+1] = BITOR(W1_aWordArray[W1_nWordCount+1], LShift(ASC(SUBSTR(LP_cToCodingStr, W1_nByteCount+1, 1)), W1_nBytePosition))
W1_nByteCount = W1_nByteCount + 1
ENDDO
W1_nWordCount = INT(W1_nByteCount / W1_nBYTES_TO_A_WORD)
W1_nBytePosition = MOD(W1_nByteCount, W1_nBYTES_TO_A_WORD) * M_nBITS_TO_A_BYTE
W1_aWordArray[W1_nWordCount+1] = BITOR(W1_aWordArray[W1_nWordCount+1], LShift(0x80, W1_nBytePosition))
W1_aWordArray[W1_nRow4NumberOfWords-1] = LShift(W1_nToCodingStrLen, 03)
W1_aWordArray[W1_nRow4NumberOfWords] = RShift(W1_nToCodingStrLen, 29)
* --------------- *
* «Ø¥ß W1_aX °}¦C *
* --------------- *
DIMENSION W1_aX[W1_nRow4NumberOfWords]
FOR W1_nSUB_A = 1 TO W1_nRow4NumberOfWords
W1_aX[W1_nSUB_A] = W1_aWordArray[W1_nSUB_A]
ENDFOR
* ----------------------------------------------------------------- *
* ³]©w¿ù»~³B²zµ{§Ç¡G¦] Visual FoxPro ¥»¨©Ò¡A¹ï¤j¼Æªº³B²z¯à¤O¤£°÷ *
* ----------------------------------------------------------------- *
ON ERROR DO ERR_TREAT
* ---- *
* *
* ---- *
W1_nA = 0x67452301
W1_nB = 0xEFCDAB89
W1_nC = 0x98BADCFE
W1_nD = 0x10325476
FOR W1_nSUB_A = 1 TO W1_nRow4NumberOfWords STEP 16
W1_nAA = W1_nA
W1_nBB = W1_nB
W1_nCC = W1_nC
W1_nDD = W1_nD
DO md5_FF WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+00], W1_nS11, 0xD76AA478
DO md5_FF WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+01], W1_nS12, 0xE8C7B756
DO md5_FF WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+02], W1_nS13, 0x242070DB
DO md5_FF WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+03], W1_nS14, 0xC1BDCEEE
DO md5_FF WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+04], W1_nS11, 0xF57C0FAF
DO md5_FF WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+05], W1_nS12, 0x4787C62A
DO md5_FF WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+06], W1_nS13, 0xA8304613
DO md5_FF WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+07], W1_nS14, 0xFD469501
DO md5_FF WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+08], W1_nS11, 0x698098D8
DO md5_FF WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+09], W1_nS12, 0x8B44F7AF
DO md5_FF WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+10], W1_nS13, 0xFFFF5BB1
DO md5_FF WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+11], W1_nS14, 0x895CD7BE
DO md5_FF WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+12], W1_nS11, 0x6B901122
DO md5_FF WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+13], W1_nS12, 0xFD987193
DO md5_FF WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+14], W1_nS13, 0xA679438E
DO md5_FF WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+15], W1_nS14, 0x49B40821
DO md5_GG WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+01], W1_nS21, 0xF61E2562
DO md5_GG WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+06], W1_nS22, 0xC040B340
DO md5_GG WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+11], W1_nS23, 0x265E5A51
DO md5_GG WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+00], W1_nS24, 0xE9B6C7AA
DO md5_GG WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+05], W1_nS21, 0xD62F105D
DO md5_GG WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+10], W1_nS22, 0x2441453
DO md5_GG WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+15], W1_nS23, 0xD8A1E681
DO md5_GG WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+04], W1_nS24, 0xE7D3FBC8
DO md5_GG WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+09], W1_nS21, 0x21E1CDE6
DO md5_GG WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+14], W1_nS22, 0xC33707D6
DO md5_GG WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+03], W1_nS23, 0xF4D50D87
DO md5_GG WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+08], W1_nS24, 0x455A14ED
DO md5_GG WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+13], W1_nS21, 0xA9E3E905
DO md5_GG WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+02], W1_nS22, 0xFCEFA3F8
DO md5_GG WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+07], W1_nS23, 0x676F02D9
DO md5_GG WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+12], W1_nS24, 0x8D2A4C8A
DO md5_HH WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+05], W1_nS31, 0xFFFA3942
DO md5_HH WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+08], W1_nS32, 0x8771F681
DO md5_HH WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+11], W1_nS33, 0x6D9D6122
DO md5_HH WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+14], W1_nS34, 0xFDE5380C
DO md5_HH WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+01], W1_nS31, 0xA4BEEA44
DO md5_HH WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+04], W1_nS32, 0x4BDECFA9
DO md5_HH WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+07], W1_nS33, 0xF6BB4B60
DO md5_HH WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+10], W1_nS34, 0xBEBFBC70
DO md5_HH WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+13], W1_nS31, 0x289B7EC6
DO md5_HH WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+00], W1_nS32, 0xEAA127FA
DO md5_HH WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+03], W1_nS33, 0xD4EF3085
DO md5_HH WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+06], W1_nS34, 0x4881D05
DO md5_HH WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+09], W1_nS31, 0xD9D4D039
DO md5_HH WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+12], W1_nS32, 0xE6DB99E5
DO md5_HH WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+15], W1_nS33, 0x1FA27CF8
DO md5_HH WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+02], W1_nS34, 0xC4AC5665
DO md5_II WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+00], W1_nS41, 0xF4292244
DO md5_II WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+07], W1_nS42, 0x432AFF97
DO md5_II WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+14], W1_nS43, 0xAB9423A7
DO md5_II WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+05], W1_nS44, 0xFC93A039
DO md5_II WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+12], W1_nS41, 0x655B59C3
DO md5_II WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+03], W1_nS42, 0x8F0CCC92
DO md5_II WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+10], W1_nS43, 0xFFEFF47D
DO md5_II WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+01], W1_nS44, 0x85845DD1
DO md5_II WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+08], W1_nS41, 0x6FA87E4F
DO md5_II WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+15], W1_nS42, 0xFE2CE6E0
DO md5_II WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+06], W1_nS43, 0xA3014314
DO md5_II WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+13], W1_nS44, 0x4E0811A1
DO md5_II WITH W1_nA, W1_nB, W1_nC, W1_nD, W1_aX[W1_nSUB_A+04], W1_nS41, 0xF7537E82
DO md5_II WITH W1_nD, W1_nA, W1_nB, W1_nC, W1_aX[W1_nSUB_A+11], W1_nS42, 0xBD3AF235
DO md5_II WITH W1_nC, W1_nD, W1_nA, W1_nB, W1_aX[W1_nSUB_A+02], W1_nS43, 0x2AD7D2BB
DO md5_II WITH W1_nB, W1_nC, W1_nD, W1_nA, W1_aX[W1_nSUB_A+09], W1_nS44, 0xEB86D391
W1_nA = AddUnsigned(W1_nA, W1_nAA)
W1_nB = AddUnsigned(W1_nB, W1_nBB)
W1_nC = AddUnsigned(W1_nC, W1_nCC)
W1_nD = AddUnsigned(W1_nD, W1_nDD)
ENDFOR
ON ERROR && «ì´_¹w³]ªº¿ù»~³B²z
DO CASE
* > ¿é¥X 16 ¦ì¤¸²Õ
CASE LP_nCodingBits = 16
Wo_cTransMD5Str = LOWER(WordToHex(W1_nB) + WordToHex(W1_nC))
* > ¿é¥X 32 ¦ì¤¸²Õ
OTHERWISE
Wo_cTransMD5Str = LOWER(WordToHex(W1_nA) + WordToHex(W1_nB) + WordToHex(W1_nC) + WordToHex(W1_nD))
ENDCASE
RETURN Wo_cTransMD5Str
* ****************** *
* ¨ä¥L¬ÛÃö¨ç¼Æ³]©w°Ï *
* ****************** *
* *************************************************************************** *
FUNCTION LShift
* --------------------------- *
* °Ñ¼Æ «¬ºA »¡©ú
* ------------------ ---- ----
* Input:
* LP_nToShiftValue N
* LP_nShiftBits N
* Output:
* N
* --------------------------- *
LPARAMETERS LP_nToShiftValue, LP_nShiftBits
DO CASE
CASE LP_nShiftBits = 0
RETURN LP_nToShiftValue
CASE LP_nShiftBits = 31
IF BITAND(LP_nToShiftValue, 1) <> 0
RETURN 0x80000000
ELSE
RETURN 0
ENDIF
ENDCASE
IF BITAND(LP_nToShiftValue, M_a2Power[32-LP_nShiftBits]) <> 0
RETURN BITOR((BITAND(LP_nToShiftValue, M_aOnBits[32-(LP_nShiftBits+1)]) * M_a2Power[LP_nShiftBits+1]), 0x80000000)
ELSE
RETURN BITAND(LP_nToShiftValue, M_aOnBits[32-LP_nShiftBits]) * M_a2Power[LP_nShiftBits+1]
ENDIF
ENDFUNC
* *************************************************************************** *
FUNCTION RShift
* --------------------------- *
* °Ñ¼Æ «¬ºA »¡©ú
* ------------------ ---- ----
* Input:
* LP_nToShiftValue N
* LP_nShiftBits N
* Output:
* Wo_nRShift2 N
* --------------------------- *
LPARAMETERS LP_nToShiftValue, LP_nShiftBits
LOCAL Wo_nRShift2 && N
DO CASE
CASE LP_nShiftBits = 0
RETURN LP_nToShiftValue
CASE LP_nShiftBits = 31
IF BITAND(LP_nToShiftValue, 0x80000000)
RETURN 1
ELSE
RETURN 0
ENDIF
ENDCASE
Wo_nRShift2 = INT(BITAND(LP_nToShiftValue , 0x7FFFFFFE) / M_a2Power[LP_nShiftBits+1])
IF BITAND(LP_nToShiftValue, 0x80000000) <> 0
Wo_nRShift2 = BITOR(Wo_nRShift2, INT(0x40000000 / M_a2Power[LP_nShiftBits]))
ENDIF
RETURN Wo_nRShift2
ENDFUNC
* *************************************************************************** *
PROCEDURE md5_FF
* ------------------ *
* °Ñ¼Æ «¬ºA »¡©ú
* -------- ---- ----
* Input & Output:
* LP_nA N
* Input:
* LP_nB N
* LP_nC N
* LP_nD N
* LP_nX N
* LP_nS N
* LP_nAC N
* ------------------ *
LPARAMETERS LP_nA, LP_nB, LP_nC, LP_nD, LP_nX, LP_nS, LP_nAC
LP_nA = AddUnsigned(LP_nA, AddUnsigned(AddUnsigned(md5_F(LP_nB, LP_nC, LP_nD), LP_nX), LP_nAC))
LP_nA = RotateLeft(LP_nA, LP_nS)
LP_nA = AddUnsigned(LP_nA, LP_nB)
ENDPROC
* *************************************************************************** *
PROCEDURE md5_GG
* ------------------ *
* °Ñ¼Æ «¬ºA »¡©ú
* -------- ---- ----
* Input & Output:
* LP_nA N
* Input:
* LP_nB N
* LP_nC N
* LP_nD N
* LP_nX N
* LP_nS N
* LP_nAC N
* ------------------ *
LPARAMETERS LP_nA, LP_nB, LP_nC, LP_nD, LP_nX, LP_nS, LP_nAC
LP_nA = AddUnsigned(LP_nA, AddUnsigned(AddUnsigned(md5_G(LP_nB, LP_nC, LP_nD), LP_nX), LP_nAC))
LP_nA = RotateLeft(LP_nA, LP_nS)
LP_nA = AddUnsigned(LP_nA, LP_nB)
ENDPROC
* *************************************************************************** *
PROCEDURE md5_HH
* ------------------ *
* °Ñ¼Æ «¬ºA »¡©ú
* -------- ---- ----
* Input & Output:
* LP_nA N
* Input:
* LP_nB N
* LP_nC N
* LP_nD N
* LP_nX N
* LP_nS N
* LP_nAC N
* ------------------ *
LPARAMETERS LP_nA, LP_nB, LP_nC, LP_nD, LP_nX, LP_nS, LP_nAC
LP_nA = AddUnsigned(LP_nA, AddUnsigned(AddUnsigned(md5_H(LP_nB, LP_nC, LP_nD), LP_nX), LP_nAC))
LP_nA = RotateLeft(LP_nA, LP_nS)
LP_nA = AddUnsigned(LP_nA, LP_nB)
ENDPROC
* *************************************************************************** *
PROCEDURE md5_II
* ------------------ *
* °Ñ¼Æ «¬ºA »¡©ú
* -------- ---- ----
* Input & Output:
* LP_nA N
* Input:
* LP_nB N
* LP_nC N
* LP_nD N
* LP_nX N
* LP_nS N
* LP_nAC N
* ------------------ *
LPARAMETERS LP_nA, LP_nB, LP_nC, LP_nD, LP_nX, LP_nS, LP_nAC
LP_nA = AddUnsigned(LP_nA, AddUnsigned(AddUnsigned(md5_I(LP_nB, LP_nC, LP_nD), LP_nX), LP_nAC))
LP_nA = RotateLeft(LP_nA, LP_nS)
LP_nA = AddUnsigned(LP_nA, LP_nB)
ENDPROC
* *************************************************************************** *
FUNCTION AddUnsigned
* ---------------------- *
* °Ñ¼Æ «¬ºA »¡©ú
* ------------ ---- ----
* Input:
* LP_nX N
* LP_nY N
* Output:
* Wo_nResult N
* ---------------------- *
LPARAMETERS LP_nX, LP_nY
LOCAL Wo_nResult && N
LOCAL W1_nX8, W1_nY8, W1_nX4, W1_nY4 && N
W1_nX8 = BITAND(LP_nX , 0x80000000)
W1_nY8 = BITAND(LP_nY , 0x80000000)
W1_nX4 = BITAND(LP_nX , 0x40000000)
W1_nY4 = BITAND(LP_nY , 0x40000000)
Wo_nResult = BITAND(LP_nX, 0x3FFFFFFF) + BITAND(LP_nY, 0x3FFFFFFF)
DO CASE
CASE BITAND(W1_nX4, W1_nY4) <> 0
Wo_nResult = BITXOR(BITXOR(BITXOR(Wo_nResult, 0x80000000), W1_nX8), W1_nY8)
CASE BITOR(W1_nX4, W1_nY4) = 0
Wo_nResult = BITXOR(BITXOR(Wo_nResult, W1_nX8), W1_nY8)
CASE BITAND(Wo_nResult, 0x40000000) = 0
Wo_nResult = BITXOR(BITXOR(BITXOR(Wo_nResult, 0x40000000), W1_nX8), W1_nY8)
OTHERWISE
Wo_nResult = BITXOR(BITXOR(BITXOR(Wo_nResult, 0xC0000000), W1_nX8), W1_nY8)
ENDCASE
RETURN Wo_nResult
ENDFUNC
* *************************************************************************** *
FUNCTION md5_F
* ----------------- *
* °Ñ¼Æ «¬ºA »¡©ú
* ------- ---- ----
* Input:
* LP_nX N
* LP_nY N
* LP_nZ N
* Output:
* N
* ----------------- *
LPARAMETERS LP_nX, LP_nY, LP_nZ
RETURN BITOR(BITAND(LP_nX, LP_nY), BITAND(BITNOT(LP_nX), LP_nZ))
ENDFUNC
* *************************************************************************** *
FUNCTION md5_G
* ----------------- *
* °Ñ¼Æ «¬ºA »¡©ú
* ------- ---- ----
* Input:
* LP_nX N
* LP_nY N
* LP_nZ N
* Output:
* N
* ----------------- *
LPARAMETERS LP_nX, LP_nY, LP_nZ
RETURN BITOR(BITAND(LP_nX, LP_nZ), BITAND(LP_nY, BITNOT(LP_nZ)))
ENDFUNC
* *************************************************************************** *
FUNCTION md5_H
* ----------------- *
* °Ñ¼Æ «¬ºA »¡©ú
* ------- ---- ----
* Input:
* LP_nX N
* LP_nY N
* LP_nZ N
* Output:
* N
* ----------------- *
LPARAMETERS LP_nX, LP_nY, LP_nZ
RETURN BITXOR(BITXOR(LP_nX, LP_nY), LP_nZ)
ENDFUNC
* *************************************************************************** *
FUNCTION md5_I
* ----------------- *
* °Ñ¼Æ «¬ºA »¡©ú
* ------- ---- ----
* Input:
* LP_nX N
* LP_nY N
* LP_nZ N
* Output:
* N
* ----------------- *
LPARAMETERS LP_nX, LP_nY, LP_nZ
RETURN BITXOR(LP_nY, BITOR(LP_nX, BITNOT(LP_nZ)))
ENDFUNC
* *************************************************************************** *
FUNCTION RotateLeft
* --------------------------- *
* °Ñ¼Æ «¬ºA »¡©ú
* ------------------ ---- ----
* Input:
* LP_nToShiftValue N
* LP_nShiftBits N
* Output:
* N
* --------------------------- *
LPARAMETERS LP_nToShiftValue, LP_nShiftBits
RETURN BITOR(LShift(LP_nToShiftValue, LP_nShiftBits), RShift(LP_nToShiftValue, 32-LP_nShiftBits))
ENDFUNC
* *************************************************************************** *
FUNCTION WordToHex
* --------------------------- *
* °Ñ¼Æ «¬ºA »¡©ú
* ----------------- ---- ----
* Input:
* LP_nToTransNum N
* Output:
* Wo_cTransHexStr C
* --------------------------- *
LPARAMETERS LP_nToTransNum
LOCAL Wo_cTransHexStr && C
Wo_cTransHexStr = ""
* ------------ *
* °Ï°ìÅܼƫŧi *
* ------------ *
LOCAL W1_nSUB_A,; && N FOR ... ENDFOR °j°é¾n¼Ð
W1_nByte && N
FOR W1_nSUB_A = 0 TO 3
W1_nByte = BITAND(RShift(LP_nToTransNum, W1_nSUB_A * M_nBITS_TO_A_BYTE), M_aOnBits[M_nBITS_TO_A_BYTE])
Wo_cTransHexStr = Wo_cTransHexStr + RIGHT("00" + Hex(W1_nByte), 2)
ENDFOR
RETURN Wo_cTransHexStr
ENDFUNC
* *************************************************************************** *
FUNCTION Hex
* --------------------------- *
* °Ñ¼Æ «¬ºA »¡©ú
* ----------------- ---- ----
* Input:
* LP_nByte N
* Output:
* Wo_cTransHexStr C
* --------------------------- *
LPARAMETERS LP_nByte
LOCAL W1_nByte && N
W1_nByte = LP_nByte
LOCAL Wo_cTransHexStr && C
Wo_cTransHexStr = ""
* ------------ *
* °Ï°ìÅܼƫŧi *
* ------------ *
LOCAL W1_nY && N
DO WHILE W1_nByte > 0
IF W1_nByte >= 16
W1_nY = W1_nByte % 16
ELSE
W1_nY = W1_nByte
ENDIF
IF W1_nY < 10 AND W1_nY >= 0
Wo_cTransHexStr = STR(W1_nY, 1) + Wo_cTransHexStr
ELSE
Wo_cTransHexStr = CHR(65+W1_nY-10) + Wo_cTransHexStr
ENDIF
W1_nByte = (W1_nByte-W1_nY) / 16
ENDDO
RETURN Wo_cTransHexStr
ENDFUNC
* *************************************************************************** *
PROCEDURE ERR_TREAT
RETURN && ¦b¦¹³]©w¿ù»~³B²zµ{§Ç
ENDPROC
|
_________________ §Æ±æ¦³§ó¦h¤H¨Ó°Ñ»P
VFP wiki - »Ýn¤j®a¤@°_§¹¦¨ªºVFP¹q¤l®Ñ»PFAQ |
|