* description: Encrypts cString with value passed in cMask * using Bit XOR operation. * * Bit XOR operation works like this: * XorIt( A, B ) -> C * XorIt( C, B ) -> A * * author: May/2002 - Hector Correa * updated: *XorIt( "mypassword", "akeytoencrypt" ) -> "someencryptedvalue" *XorIt( "someencryptedvalue", "akeytoencrypt" ) -> "mypassword CLEAR *1st time lcpassword="" lcpassword="x8RockAndRolL1230x9" encrypted1=XorIt(lcpassword,'password') ? "1st try" ? ? "Encrypted password: "+encrypted1 unencrypted1=XorIt(encrypted1,'password') ? "unencrypted password: "+ unencrypted1 *2nd time lcname="" lcname="Tracy C. Holzer" encrypted2=XorIt(lcname,'name') ? ?"2nd try" ? ? "2nd try Encrypted ASCII values:" for i=1 to len(encrypted2) ?? asc(substr(encrypted2,i,1)),"," next ?"Encrypted Name: "+encrypted2 unencrypted2=XorIt(encrypted2,'name') ?"Unencrypted name: "+unencrypted2 unencrypted1=XorIt(encrypted1,'password') ?"Unencrypted password: "+unencrypted1 Function XorIt( cString, cMask ) if empty( cString ) return "" endif if empty( cMask ) return "" endif cRetVal = "" nlength = LEN( cString ) cMask = padr( cMask, nlength, "#" ) FOR i=1 TO nlength nChar = ASC( SUBSTR( cString, i, 1 ) ) nKeyChar = ASC( SUBSTR( cMask, i, 1 ) ) nNewChar = BITXOR( nChar, nKeyChar ) cRetVal = cRetVal + CHR( nNewChar ) NEXT RETURN cRetValWe also do something not complicated:
CREATE TABLE u_access (cname c(20), cpass c(30)) APPEND BLANK _xldata=.T. CLEAR ? 'Original Passwword Value=password&120+t|' lcval = wordhide('password&120+t|') REPLACE cname WITH 'User1' REPLACE cpass WITH lcval ? 'Encrypted value='+lcval lnewcval = wordhide(u_access.cpass) ? 'UnEncrypted Value='+lnewcval USE IN u_access RETURN ******************************************* * Psuedo 16bit data encryption algorithm. * * Useage: <str1>=wordhide(<str2>) * Convert back: <str3>=wordhide(<str1>) * ******************************************* * PROCEDURE wordhide PARAMETER xstr *--03/18/2003 TCH IF UPPER(TYPE('_xldata'))=="U" PRIVATE _xldata _xldata=.F. ENDIF PRIVATE i,j,ret,xval,temp newstr = xstr IF _xldata newstr = "" * Get pairs of characters from the string FOR k = 1 TO LEN(xstr) STEP 2 v3=ASC(SUBSTR(xstr,k+1,1)) + ; ASC(SUBSTR(xstr,k,1)) * 256 * Don't encrypt 2 spaces together. IF v3=8224 v4=v3 ELSE v4=messybits(v3) ENDIF v1 = 0 v2 = 0 IF v4 >= 256 v1 = INT(v4 / 256) v4 = v4 - (v1 * 256) ENDIF v2 = INT(v4) newstr=newstr+CHR(v1)+CHR(v2) ENDFOR ENDIF RETURN newstr ***************************** PROCEDURE messybits ***************************** * This routine takes a 16bit number (0 - 65535), converts it to BINARY and * then rearranges the BITS for data encryption. PARAMETER dword PRIVATE _i,_j,retval,_xval,temp retval = "" FOR _j = 15 TO 0 STEP -1 IF dword >= 2^_j retval=retval+"1" dword = dword - 2^_j ELSE retval=retval+"0" ENDIF ENDFOR * Move through 16 bits, get every 4th bit and make new binary number temp = "" FOR _i = 1 TO 4 FOR _j = 0 TO 3 temp = temp + SUBSTR(retval,_i+(_j*4),1) ENDFOR ENDFOR retval=temp * Convert the BINARY number back to decimal and, just * for fun, flip the BINARY number backwards as we do it. _xval=0 FOR _j = 1 TO LEN(retval) IF SUBSTR(retval,_j,1) = "1" _xval = _xval + 2^(_j-1) ENDIF ENDFOR RETURN _xval