>>DEFINE CLASS vfpCrypt AS VFPbase >> >> PROCEDURE Crypt >> *------------------------------------------------------------ >> * Description: >> * Return: >> * Use: >> *------------------------------------------------------------ >> * Id Date By Description >> * 1 12/19/2005 Gregory L Reichert Initial Creation >> * >> *------------------------------------------------------------ >> LPARAMETERS tcStr, tcPassword >> >> LOCAL lnStrLen, lnPassLen, lnPassNum, laPassword[1,2], lcPassword >> LOCAL lcStrOut, lnPassPos, lnNum01, lcStrOut, lnInPos, lnPassPos >> >> IF TYPE("tcStr") <> "C" ; >> OR TYPE("tcPassword") <> "C" ; >> OR LEN(tcPassword) < PW_MIN_LEN >> ERROR 11 >> ENDIF >> >> lnStrLen = LEN(tcStr) >> >> * Because of the bug in the original C code we've to add CHR(0) to the password >> * and use it later >> lcPassword = tcPassword + CHR(0) >> lnPassLen = LEN(lcPassword) >> DIMENSION laPassword[lnPassLen+1,2] >> FOR lnPassPos=1 TO lnPassLen >> laPassword[lnPassPos,2] = SUBSTR(lcPassword,lnPassPos,1) >> laPassword[lnPassPos,1] = ASC(laPassword[lnPassPos,2]) >> ENDFOR >> >> * Get seed value >> lnPassNum = INT((((THIS.CipherGetPnum(lcPassword)/997) - 1) % 254) + 1 ) >> lcStrOut = "" >> lnPassPos = 1 >> >> * Encode/decode each character >> FOR lnInPos=0 TO lnStrLen-1 >> * Get new seed value >> lnNum01 = (( lnPassNum + (lnInPos - lnStrLen)) - 1) >> lnPassNum = (ABS(lnNum01) % 254) * SIGN(lnNum01) + 1 >> * Encode current character >> lnByte = BITXOR( ASC(SUBSTR(tcStr,lnInPos+1,1)), ; >> BITXOR(lnPassNum, laPassword[lnPassPos,1])) >> * Convert signed value to unsigned, if necessary >> lnByte = BITAND(lnByte, 0xFF) >> * If result is zero, use current character >> lcStrOut = lcStrOut + IIF(lnByte = 0, SUBSTR(tcStr,lnInPos+1,1), CHR(lnByte)) >> * Advance to the next password character >> lnPassPos = IIF( lnPassPos => lnPassLen, 1, lnPassPos + 1) >> ENDFOR >> >> RETURN lcStrOut >> ENDPROC >> >> >> *------------------------------------------------------------ >> * Description: >> * Return: >> * Use: >> *------------------------------------------------------------ >> * Id Date By Description >> * 1 11/18/2009 GLR Initial Creation >> * >> *------------------------------------------------------------ >> * >> * Parameters: >> * tcStr - string to encrypt/decrypt >> * tcPassword - password to use for encryption/decryption >> * >> *----------encrypt.prg---------- >> * >> * Alias for cipher >> PROCEDURE ENCRYPT >> LPARAMETERS tcStr, tcPassword >> RETURN THIS.Crypt(tcStr, tcPassword) >> ENDPROC >> * >> *----------decrypt.prg---------- >> * >> * Alias for cipher >> PROCEDURE decrypt >> LPARAMETERS tcStr, tcPassword >> RETURN THIS.Crypt(tcStr, tcPassword) >> ENDPROC >> * >> >> * Returns a seed value based on the string passed as parameter >> PROCEDURE CipherGetPnum(tcStr) >> LOCAL liRet, lnPos >> liRet = 1 >> FOR lnPos=0 TO LEN(tcStr ) - 1 >> liRet = liRet + ASC(SUBSTR(tcStr,lnPos+1,1)) + lnPos >> ENDFOR >> DO WHILE (liRet < PW_MIN_NUM) >> liRet = BITLSHIFT(liRet,1) >> ENDDO >> RETURN liRet >> ENDPROC >>ENDDEFINE >>>