>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 >Thank you very much for the code!