VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

MD5 程式

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
朱育興



註冊時間: 2003-08-25
文章: 653
來自: 台中市大里區

第 1 樓

發表發表於: 星期五 三月 10, 2017 3:14 pm    文章主題: MD5 程式 引言回覆

這是去年幫一位狐友寫的,貼上來,純粹是免得以後要找這些程式碼,怕在自己電腦中找不到
這些內容記得是上網東抄抄西抄抄,然後再依自己的寫作習慣整理的

代碼:

* ------------------------------------------------------------------- *
* {式名稱:MD5.PRG
* 說明:將傳入的字串,經 MD5 編碼後傳回
* 建立日期:2016/06/02
* 更新日期:2016/06/02
* ------------------------------------------------------------------- *
* 參數               型態 說明
* ------------------ ---- -------------------------------------------
* Input:
*   LP_cToCodingStr  C    要編碼的字串
*   (LP_nCodingBits) N    以多少位元編碼。32 (預]值) 或 16 兩種
* Output:
*   Wo_cTransMD5Str  C    A.經 MD5 編碼後的字串
*                         B.LP_nCodingBits = 32 => 輸出 32 Bytes 字串
*                           LP_nCodingBits = 16 => 輸出 16 Bytes 字串
* 範例:
* ? MD5("The quick brown fox jumps over the lazy dog")
* 9e107d9d372bb6826bd81d3542a419d6
* ------------------------------------------------------------------- *
LPARAMETERS LP_cToCodingStr, LP_nCodingBits

LOCAL Wo_cTransMD5Str  && C 經 MD5 編碼後的字串

Wo_cTransMD5Str = ""

* -------- *
* 參數檢查 *
* -------- *
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

* ------------ *
* 區域變數宣告 *
* ------------ *
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 迴圈駐標
      W1_nToCodingStrLen,;   && N 要編碼的字串長度
      W1_nRow4NumberOfWords  && N 相關}列(W1_aWordArray, W1_aX)的列數

LOCAL W1_nA, W1_nB, W1_nC, W1_nD, W1_nAA, W1_nBB, W1_nCC, W1_nDD  && N

* ------------ *
* 私有變數宣告 *
* ------------ *
PRIVATE M_nBITS_TO_A_BYTE  && N

DIMENSION M_a2Power[31]    && A 存放 2 的次方(0 .. 30)。2^0, 2^1, .., 2^30
DIMENSION M_aOnBits[31]    && A 存放 2 的次方(1 .. 31) 減 1。2^1-1, 2^2-1, .., 2^31-1

* -------------- *
* 私有變數初始值 *
* -------------- *
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

* -------------- *
* 區域變數初始值 *
* -------------- *
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 }列 *
* ----------------------- *
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 }列 *
* --------------- *
DIMENSION W1_aX[W1_nRow4NumberOfWords]

FOR W1_nSUB_A = 1 TO W1_nRow4NumberOfWords
  W1_aX[W1_nSUB_A] = W1_aWordArray[W1_nSUB_A]
ENDFOR

* ----------------------------------------------------------------- *
* ]定錯誤處理{序:] Visual FoxPro 本身所限,對大數的處理能力不夠 *
* ----------------------------------------------------------------- *
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  && 恢復預]的錯誤處理

DO CASE
* > 輸出 16 位元組
CASE LP_nCodingBits = 16
     Wo_cTransMD5Str = LOWER(WordToHex(W1_nB) + WordToHex(W1_nC))
* > 輸出 32 位元組
OTHERWISE
     Wo_cTransMD5Str = LOWER(WordToHex(W1_nA) + WordToHex(W1_nB) + WordToHex(W1_nC) + WordToHex(W1_nD))
ENDCASE

RETURN Wo_cTransMD5Str

* ****************** *
* 其他相關函數]定區 *
* ****************** *
* *************************************************************************** *
FUNCTION LShift
* --------------------------- *
* 參數               型態 說明
* ------------------ ---- ----
* 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
* --------------------------- *
* 參數               型態 說明
* ------------------ ---- ----
* 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
* ------------------ *
* 參數     型態 說明
* -------- ---- ----
* 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
* ------------------ *
* 參數     型態 說明
* -------- ---- ----
* 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
* ------------------ *
* 參數     型態 說明
* -------- ---- ----
* 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
* ------------------ *
* 參數     型態 說明
* -------- ---- ----
* 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
* ---------------------- *
* 參數         型態 說明
* ------------ ---- ----
* 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
* ----------------- *
* 參數    型態 說明
* ------- ---- ----
* 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
* ----------------- *
* 參數    型態 說明
* ------- ---- ----
* 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
* ----------------- *
* 參數    型態 說明
* ------- ---- ----
* 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
* ----------------- *
* 參數    型態 說明
* ------- ---- ----
* 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
* --------------------------- *
* 參數               型態 說明
* ------------------ ---- ----
* 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
* --------------------------- *
* 參數              型態 說明
* ----------------- ---- ----
* Input:
*   LP_nToTransNum  N
* Output:
*   Wo_cTransHexStr C
* --------------------------- *
LPARAMETERS LP_nToTransNum

LOCAL Wo_cTransHexStr  && C

Wo_cTransHexStr = ""

* ------------ *
* 區域變數宣告 *
* ------------ *
LOCAL W1_nSUB_A,;  && N FOR ... ENDFOR 迴圈駐標
      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
* --------------------------- *
* 參數              型態 說明
* ----------------- ---- ----
* 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 = ""

* ------------ *
* 區域變數宣告 *
* ------------ *
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  && 在此]定錯誤處理{序
ENDPROC

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作