使用MD5算法加密VFP數(shù)據(jù)

字號(hào):

使用MD5算法加密VFP數(shù)據(jù)
    我們的VFP數(shù)據(jù)太開放了些,用Excel隨便打開一個(gè)DBF表,里面的數(shù)據(jù)就一覽無遺。如果數(shù)據(jù)是比較敏感的話,可就壞事了。例如:我的數(shù)據(jù)錄入員的程序登錄密碼是放在一個(gè)VFP表里,經(jīng)過加密,就算用Excel打開DBF表,也是看不到密碼的。從一個(gè)隨書資料盤上見到此段代碼,供大家參考。
    ------------------------------------
    ********md5.prg**********
    FUNCTION LShift(lvalue, iShiftBits)
    IF iShiftBits = 0
    RETURN lvalue
    ELSE
    IF iShiftBits = 31
    IF BITAND(lvalue , 1)<>0
    RETURN 0x80000000
    ELSE
    RETURN 0
    ENDIF
    ENDIF
    ENDIF
    IF BITAND(lvalue , m_l2Power(31 - iShiftBits))<>0
    RETURN BITOR( (BITAND(lvalue , m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) , 0x80000000)
    ELSE
    RETURN (BITAND(lvalue , m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))
    ENDIF
    ENDFUNC
    FUNCTION RShift(lvalue, iShiftBits)
    IF iShiftBits = 0
    RETURN lvalue
    ELSE
    IF iShiftBits = 31
    IF BITAND(lvalue , 0x80000000)
    RETURN 1
    ELSE
    RETURN 0
    ENDIF
    ENDIF
    ENDIF
    RShift2 = INT(BITAND(lvalue , 0x7FFFFFFE) / m_l2Power(iShiftBits))
    IF BITAND(lvalue , 0x80000000)<>0
    RShift2 =BITOR (RShift2 , INT(0x40000000 / m_l2Power(iShiftBits - 1)))
    ENDIF
    RETURN RShift2
    ENDFUNC
    FUNCTION RotateLeft(lvalue, iShiftBits)
    RETURN BITOR(LShift(lvalue, iShiftBits) ,RShift(lvalue, (32 - iShiftBits)))
    ENDFUNC
    FUNCTION AddUnsigned(lX, lY)
    lX8 = BITAND(lX , 0x80000000)
    lY8 = BITAND(lY , 0x80000000)
    lX4 = BITAND(lX , 0x40000000)
    lY4 = BITAND(lY , 0x40000000)
    lResult = BITAND(lX , 0x3FFFFFFF) + BITAND(lY , 0x3FFFFFFF)
    IF BITAND(lX4 , lY4)<> 0
    lResult = BITXOR(BITXOR(BITXOR(lResult , 0x80000000) , lX8) , lY8)
    ELSE
    IF BITOR(lX4 , lY4)<> 0
    IF BITAND(lResult , 0x40000000)<> 0
    lResult = BITXOR(BITXOR(BITXOR(lResult , 0xC0000000) , lX8) , lY8)
    ELSE
    lResult = BITXOR(BITXOR(BITXOR(lResult , 0x40000000) , lX8) , lY8)
    ENDIF
    ELSE
    lResult = BITXOR(BITXOR( lResult , lX8) , lY8)
    ENDIF
    ENDIF
    RETURN lResult
    ENDFUN
    C
    FUNCTION md5_F(x, y, z)
    RETURN BITOR(BITAND(x , y) , BITAND(BITNOT(x) , z))
    ENDFUNC
    FUNCTION md5_G(x, y, z)
    RETURN BITOR(BITAND(x , z) , BITAND(y , BITNOT(z)))
    ENDFUNC
    FUNCTION md5_H(x, y, z)
    RETURN BITXOR(BITXOR(x , y) , z)
    ENDFUNC
    FUNCTION md5_I(x, y, z)
    RETURN BITXOR(y , BITOR(x , BITNOT(z)))
    ENDFUNC
    PROCEDURE 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)
    ENDPROC
    PROCEDURE 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)
    ENDPROC
    PROCEDURE 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)
    ENDPROC
    PROCEDURE md5_II(a, b, c, d, x, s, ac)
    a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
    a = RotateLeft(a, s)
    a = AddUnsigned(a, b)
    ENDPROC
    FUNCTION Hex(lByte)
    x=’’
    DO WHILE lByte>0
    IF lByte>=16
    y=lByte
    ELSE
    y=lByte
    ENDIF
    IF y<10 .and. y>=0
    x=STR(y,1)+x
    ELSE
    x=CHR(65+y-10)+x
    ENDIF
    lByte=(lByte-y)/16
    ENDDO
    RETURN x
    ENDFUNC
    FUNCTION WordToHex(lvalue)
    lResult=’’
    FOR lCount = 0 TO 3
    lByte = BITAND(RShift(lvalue, lCount * BITS_TO_A_BYTE) , m_lOnBits(BITS_TO_A_BYTE ))
    lResult = lResult + RIGHT("0" + Hex(lByte), 2)
    ENDFOR
    RETURN lResult
    ENDFUNC