> >* >* Parameters: >* tcStr - string to encrypt/decrypt >* tcPassword - password to use for encryption/decryption >* >*----------cipher.prg---------- >FUNCTION CipherOld >LPARAMETERS tcStr, tcPassword > >#define PW_MIN_LEN 3 && /* min number of characters in the password */ >***#define PW_MIN_NUM 1000 && /* min value for the password seed */ >#define PW_MIN_NUM 10000000 && /* min value for the password seed */ > >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) > >lcPassword = tcPassword >***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((((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 > >* Returns a seed value based on the string passed as parameter >FUNCTION 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 >>