首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

请大侠提供MD5算法的VFP源码解决方法

2012-04-02 
请大侠提供MD5算法的VFP源码现在比较流行的MD5的校验算法,查了一下,竟然没有VFP的源码?!可能是没有提到过

请大侠提供MD5算法的VFP源码
现在比较流行的MD5的校验算法,   查了一下,   竟然没有VFP的源码?!
可能是没有提到过吧.
希望有能力的大侠能够提供MD5算法的VFP源码,   让我等菜鸟瞻仰瞻仰
期待中……

[解决办法]
**************************************************************
* Md5算法在VFP中的实现
* 调用方法: MD5(要加密的字符串,8) 或 MD5(要加密的字符串,16)
* 第二个参数说明加密位长,8位或16位,默认为8位+
* 转自梅子论坛[mayleelife]
* 梅子VFP论坛 www.meizvfp.com
**************************************************************

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(32 - iShiftBits)) <> 0
RETURN BITOR( (BITAND(lValue , m_lOnBits(32 - (iShiftBits + 1))) * m_l2Power(iShiftBits + 1)) , 0x80000000)
ELSE
RETURN BITAND(lvalue , m_lOnBits(32 - iShiftBits)) * m_l2Power(iShiftBits + 1)
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 + 1))

IF BITAND(lvalue , 0x80000000) <> 0
RShift2 =BITOR (RShift2 , INT(0x40000000 / m_l2Power(iShiftBits )))
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
ENDFUNC

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%16
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( "00 " + Hex(lByte), 2)
ENDFOR

RETURN lResult

热点排行