使用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
我們的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