使用MD5算法加密VFP数据

2006-7-18 16:10:21   Count:
 使用MD5算法加密VFP数据    

我们的VFP数据太开放了些,用Excel随便打开一个DBF表,里面的数据就一览无遗。如果数据是比较敏感的话,可就坏事了。例如:我的数据录入员的程序登录密码是放在一个VFP表里,经过加密,就算用Excel打开DBF表,也是看不到密码的。从一个随书资料盘上见到此段代码,供大家参考。    
------------------------------------    

********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    

[1] [2]

[page_break]

*****设置错误处理程序,因Visual FoxPro程序本身所限,对大数的处理能力不够    
ON ERROR do err_treat    
FOR k = 1 TO ;lNumberOfWords STEP 16    
AA = a    
BB = b    
CC = c    
DD = d    

DO md5_FF WITH a, b, c, d, x(k + 0), S11, 0xD76AA478    
DO md5_FF WITH d, a, b, c, x(k + 1), S12, 0xE8C7B756    
DO md5_FF WITH c, d, a, b, x(k + 2), S13, 0x242070DB    
DO md5_FF WITH b, c, d, a, x(k + 3), S14, 0xC1BDCEEE    
DO md5_FF WITH a, b, c, d, x(k + 4), S11, 0xF57C0FAF    
DO md5_FF WITH d, a, b, c, x(k + 5), S12, 0x4787C62A    
DO md5_FF WITH c, d, a, b, x(k + 6), S13, 0xA8304613    
DO md5_FF WITH b, c, d, a, x(k + 7), S14, 0xFD469501    
DO md5_FF WITH a, b, c, d, x(k + 8), S11, 0x698098D8    
DO md5_FF WITH d, a, b, c , x(k + 9), S12, 0x8B44F7AF    
DO md5_FF WITH c, d, a, b, x(k + 10), S13, 0xFFFF5BB1    
DO md5_FF WITH b, c, d, a, x(k + 11), S14, 0x895CD7BE    
DO md5_FF WITH a, b, c, d, x(k + 12), S11, 0x6B901122    
DO md5_FF WITH d, a, b, c, x(k + 13), S12, 0xFD987193    
DO md5_FF WITH c, d, a, b, x(k + 14), S13, 0xA679438E    
DO md5_FF WITH b, c, d, a, x(k + 15), S14, 0x49B40821    

DO md5_GG WITH a, b, c, d, x(k + 1), S21, 0xF61E2562    
DO md5_GG WITH d, a, b, c, x(k + 6), S22, 0xC040B340    
DO md5_GG WITH c, d, a, b, x(k + 11), S23, 0x265E5A51    
DO md5_GG WITH b, c, d, a, x(k + 0), S24, 0xE9B6C7AA    
DO md5_GG WITH a, b, c, d, x(k + 5), S21, 0xD62F105D    
DO md5_GG WITH d, a, b, c, x(k + 10), S22, 0x2441453    
DO md5_GG WITH c, d, a, b, x(k + 15), S23, 0xD8A1E681    
DO md5_GG WITH b, c, d, a, x(k + 4), S24, 0xE7D3FBC8    
DO md5_GG WITH a, b, c, d, x(k + 9), S21,&n bsp;0x21E1CDE6    
DO md5_GG WITH d, a, b, c, x(k + 14), S22, 0xC33707D6    
DO md5_GG WITH c, d, a, b, x(k + 3), S23, 0xF4D50D87    
DO md5_GG WITH b, c, d, a, x(k + 8), S24, 0x455A14ED    
DO md5_GG WITH a, b, c, d, x(k + 13), S21, 0xA9E3E905    
DO md5_GG WITH d, a, b, c, x(k + 2), S22, 0xFCEFA3F8    
DO md5_GG WITH c, d, a, b, x(k + 7), S23, 0x676F02D9    
DO md5_GG WITH b, c, d, a, x(k + 12), S24, 0x8D2A4C8A    

DO md5_HH WITH a, b, c, d, x(k + 5), S31, 0xFFFA3942    
DO md5_HH WITH d, a, b, c, x(k + 8), S32, 0x8771F681    
DO md5_HH WITH c, d, a, b, x(k + 11), S33, 0x6D9D6122    
DO md5_HH WITH b, c, d, a, x(k + 14), S34, 0xFDE5380C    
DO md5_HH WITH a, b, c, d, x(k + 1), S31, 0xA4BEEA44    
DO md5_HH WITH d, a, b, c, x(k + 4), S32, 0x4BDECFA9    
DO md5_HH WITH c, d, a, b, x(k + 7), S33, 0xF6BB4B60    
DO md5_HH WITH b, c, d, a, x(k + 10), S34, 0xBEBFBC70    
DO md5_HH WITH a, b, c, d, x(k + 13), S31, 0x289B7EC6    
DO md5_HH WITH d, a, b, c, x(k + 0), S32, 0xEAA127FA    
DO md5_HH WITH c, d, a, b, x(k + 3), S33, 0xD4EF3085    
DO md5_HH WITH b, c, d, a, x(k + 6), S34, 0x4881D05    
DO md5_HH WITH a, b, c, d, x(k + 9), S31, 0xD9D4D039    
DO md5_HH WITH d, a, b, c, x(k + 12), S32, 0xE6DB99E5    
DO md5_HH WITH c, d, a, b, x(k + 15), S33, 0x1FA27CF8    
DO md5_HH WITH b, c, d, a, x(k + 2), S34, 0xC4AC5665    

DO md5_II WITH a, b, c, d, x(k + 0), S41, 0xF4292244    
DO md5_II WITH d, a, b, c, x(k + 7), S42, 0x432AFF97    
DO md5_II WITH c, d, a, b, x(k + 14), S43, 0xAB9423A7    
DO md5_II WITH b, c, d, a, x(k + 5), S44, 0xFC93A039    
DO md5_II WITH a, b, c, d, x(k + 12), S41, 0x655B59C3    
DO md5_II WITH d, a, b, c, x(k + 3), S42, 0x8F0CCC92    
DO md5_II WITH c, d, a, b, x(k + 10), S43, 0xFFEFF47D    
DO md5_II WITH b, c,  d, a, x(k + 1), S44, 0x85845DD1    
DO md5_II WITH a, b, c, d, x(k + 8), S41, 0x6FA87E4F    
DO md5_II WITH d, a, b, c, x(k + 15), S42, 0xFE2CE6E0    
DO md5_II WITH c, d, a, b, x(k + 6), S43, 0xA3014314    
DO md5_II WITH b, c, d, a, x(k + 13), S44, 0x4E0811A1    
DO md5_II WITH a, b, c, d, x(k + 4), S41, 0xF7537E82    
DO md5_II WITH d, a, b, c, x(k + 11), S42, 0xBD3AF235    
DO md5_II WITH c, d, a, b, x(k + 2), S43, 0x2AD7D2BB    
DO md5_II WITH b, c, d, a, x(k + 9), S44, 0xEB86D391    

a = AddUnsigned(a, AA)    
b = AddUnsigned(b, BB)    
c = AddUnsigned(c, CC)    
d = AddUnsigned(d, DD)    
ENDFOR    

ON ERROR &&恢复默认的错误处理    
*************下面是输出16位代码的方法*************     
* RETURN LOWER(WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d))    
*************下面是输出8位代码的方法*************    
RETURN LOWER(WordToHex(b) + WordToHex(c))     
ENDFUNC    

PROC err_treat    
RETURN    
ENDPROC 

[1]


浏览该文章的用户为您推荐了该信息: 
       
   
   
 
站内检索:
栏目导航
本月授课安排
阅读排行