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

cnnnc 2007-03-26 05:18:24
现在比较流行的MD5的校验算法, 查了一下, 竟然没有VFP的源码?!
可能是没有提到过吧.
希望有能力的大侠能够提供MD5算法的VFP源码, 让我等菜鸟瞻仰瞻仰
期待中……
...全文
210 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_meizvfp_com 2007-03-29
  • 打赏
  • 举报
回复
**************************************************************
* 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

青草根儿 2007-03-27
  • 打赏
  • 举报
回复
自己练手吧

2,727

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧