#INCLUDE ONCE "WinCrypt.inc
MACRO ALG_ID = DWORD
'//-----------------------------------------------------------------------
'// 生成MD5密码 16位
'//-----------------------------------------------------------------------
FUNCTION MD5_ComputeHash(BYVAL pass AS STRING) AS STRING
LOCAL i AS LONG
LOCAL hCryptProv AS DWORD
LOCAL hCryptHash AS DWORD
LOCAL lcHashValue AS DWORD
LOCAL lnHashSize AS DWORD
LOCAL lnStatus AS LONG
LOCAL HashLen AS DWORD
LOCAL p AS BYTE PTR
LOCAL md5 AS STRING
'// 获得指定CSP的密钥容器的句柄
lnStatus = CryptAcquireContext(hCryptProv, BYVAL %NULL, BYVAL %NULL, %PROV_RSA_FULL, %CRYPT_VERIFYCONTEXT)
IF(lnStatus<>1) THEN
FUNCTION = ""
EXIT FUNCTION
END IF
'//创建一个HASH对象, 指定HASH算法
lnStatus = CryptCreateHash(hCryptProv, %CALG_MD5, 0, 0, hCryptHash)
IF(lnStatus<>1) THEN
FUNCTION = ""
EXIT FUNCTION
END IF
'//将要计算 md5 值的数据提供给这个哈希对象中
lnStatus = CryptHashData(hCryptHash, BYVAL STRPTR(pass), LEN(pass), 0)
IF(lnStatus<>1) THEN
FUNCTION = ""
EXIT FUNCTION
END IF
'//获取HASH结果的大小
lnHashSize = LEN(pass)
lnStatus = CryptGetHashParam(hCryptHash, %HP_HASHSIZE, HashLen, lnHashSize, 0)
IF(lnStatus<>1 OR HashLen=0) THEN
FUNCTION = ""
EXIT FUNCTION
END IF
p = VARPTR(HashLen)
HashLen = @p
'GLOBALMEM ALLOC HashLen TO lcHashValue '分配缓存空间
DIM buf(HashLen-1) AS BYTE '分配缓存空间
'//获取HASH结果
lnStatus = CryptGetHashParam(hCryptHash, %HP_HASHVAL, BYVAL VARPTR(buf(0)), HashLen, 0)
IF(lnStatus<>1) THEN
FUNCTION = ""
EXIT FUNCTION
END IF
p = VARPTR(lcHashValue)
FOR i=0 TO HashLen-1
md5 = md5 + CHR$(buf(i))
NEXT i
ERASE buf()
'GLOBALMEM FREE lcHashValue TO lcHashValue
IF(hCryptHash>0) THEN CryptDestroyHash(hCryptHash)
IF(hCryptProv>0) THEN CryptReleaseContext(hCryptProv, 0)
FUNCTION = md5
END FUNCTION
PowerBasic 生成MD5密码 16位
于 2022-09-24 12:08:50 首次发布