SWAGOLX.EXE (c) 1993 GDSOFT ALL RIGHTS RESERVED 00014 FILE & ENCRYPTION ROUTINES 1 05-28-9313:40ALL SWAG SUPPORT TEAM CHECKSUM.PAS IMPORT 15 (*π> I finished Programming a Program in turbo pascal 7, and as some sharewareπ> Programs like RemoteAccess, Fastecho and more i want my Program to use aπ> KEY File to know if the Program is registered or not (i will supply a keyπ> For every sysop according to his bbs name and his name), any examples toπ> do such a Procedure?ππYou could do like I did in Terminate, make a big KeyFile around 4-8k andπincluded all kind of checksums calculated on crc-sums and the name etc.ππCalculate the Crc-sums in different ways, use always the GlobalChecksum to findπout if there has been no errors in the File. If error in the global checksum:ππ SetFAttr(keyFile,Archive) { if the File has been set to readonly }π Erase(keyFile,archive)ππAsk user to install a new copy of the keyFile.ππThen somebody has changed it or an error has occured.ππThe next things is to use a different checksum For each release you make ofπyour Program, then people will get annoyed over waiting For a new pirate keyπand hopefully will send you some money.πThe cracker cannot calculate the checksum if you have no code in the Program,πbut he can crack the current version, but if you release a new version often,πpeople will get tired of that and pay. A checksum can be calculated in manyπdifferent ways like below:π*)πVarππ KeyRec : Recordπ Crc : Array[1..100] of LongInt;π Name : String[80];π GlobalChecksum;π end;ππVarπ Sum : LongInt;π X : Word;ππbeginπ Sum := 0;π For x := 1 to Sizeof(KeyRec) Doπ Inc(Sum, Mem[Seg(KeyRec) : Seg(KeyRec) + x]);π { This will add all ascii values to crc, the cracker will prop. findπ this out, but if you then : }π Dec(Sum,3248967);π { How should he find out if there is no code in your Program at the }π { present version }πend.π 2 05-28-9313:40ALL SWAG SUPPORT TEAM COPYINC.PAS IMPORT 21 { COPYINC.PAS Author: Trevor J Carlsenπ PO Box 568π Port Hedland 6721π Western AustraliaπππSYNTAX: copyinc Filenameππwhere Filename is the name of a Text File you wish to create that will be usedπas an include File in a Turbo Pascal Program.ππThis Program creates a Text File in the formatππ Constπ RegStr ='This Program is an unregistered copy';π CodeStr =π #125#34#139#139#74#71#94#61#44#78#65#155#158#132#62#136#141#140#84+π #34#155#63#38#46#89#84#93#57#153#51#83#112#72#36#138#93;π keyval = 1234567890;ππThe Text File that was used by COPYINC to create the above include File wouldπhave looked like thisππp:\prog\freeload.incπThis Program is an unregistered copyπRegStr =πCodeStr =π1234567890ππHere is another example. This was the include File -ππ Constπ ChkStr : String ='This Program is registered to';π CodeChkStr : String =π #32#153#90#34#133#140#42#129#150#50#81#36#83#36#133#154#52#76#75+π #129#45#93#77#44#83#149#157#71#95#225;π keyval = 1234567890;ππand the Text File used by COPYINC -ππp:\prog\registed.incπThis Program is registered to πChkStr : String =πCodeChkStr : String =π1234567890πππThe Text File must always consist of five lines that areπ 1. The name of the include File to be created.π 2. The plain Text.π 3. The name of the plain Text Constant along With its syntax.π 4. The name and syntax of the coded Text Constant.π 5. A key value. Any number in the LongInt range is valid.πππ}ππUsesπ endecode; { my encryption Unit }ππConstπ hash = '#';πVarπ f : Text;π params : Text;π keyval : LongInt;π notice,π fname,π CodeStr,π CodeVar,π PlainVar: String;π x : Word;ππbeginπ assign(params,ParamStr(1));π reset(params);π readln(params,fname);π readln(params,notice);π readln(params,PlainVar);π readln(params,CodeVar);π readln(params,keyval);π CodeStr := EncryptStr(keyval,notice);π notice := ' '+ PlainVar + #39 + notice + #39#59;π assign(f,fname);π reWrite(f);π Writeln(f,'Const');π Writeln(f,notice);π Writeln(f,' ',CodeVar);π Write(f,' ');π For x := 1 to length(CodeStr) do beginπ if x mod 20 = 0 then beginπ Writeln(f,'+');π Write(f,' ');π end;π Write(f,'#',ord(CodeStr[x]));π end;π Writeln(f,';');π Writeln(f,' keyval = ',keyval,#59);π Writeln(f);π close(f);πend.ππ 3 05-28-9313:40ALL SWAG SUPPORT TEAM ENCRYPT.PAS IMPORT 65 {$A+,B-,D-,E+,F-,G+,I+,L-,N-,O-,R-,S-,V-,X+}π{$M 4048,0,131040}πProgram encrypt;ππ{ Author Trevor J Carlsen - released into the public domain 1992 }π{ PO Box 568 }π{ Port Hedland }π{ Western Australia 6721 }π{ Voice +61 91 73 2026 Data +61 91 73 2569 }π{ FidoNet 3:690/644 }ππ{ Syntax: encrypt /p=PassWord /k=KeyFile /f=File }π{ Example - }π{ encrypt /p=billbloggs /k=c:\command.com /f=p:\prog\anyFile.pas }ππ{ PassWord can be any alpha-numeric sequence of AT LEAST four }π{ Characters. }ππ{ KeyFile is the full path of any File on the system that this }π{ Program runs on. This File, preferably a large one, must not }π{ be subject to changes. This is critical as it is used as a }π{ pseudo "one time pad" style key and the slightest change will }π{ render decryption invalid. }ππ{ File is the full path of the File to be encrypted or decrypted.}ππ{ notes: Running Encrypt a second time With exactly the same parameters }π{ decrypts an encrypted File. For total security the keyFile }π{ can be stored separately on a floppy. Without this keyFile or }π{ knowledge of its contents it is IMPOSSIBLE to decrypt the }π{ encrypted File. }ππ{ Parameters are Case insensitive and may be in any order and }π{ may not contain any Dos separator Characters. }ππConstπ BufferSize = 65520;π Renamed : Boolean = False;ππTypeπ buffer_ = Array[0..BufferSize - 1] of Byte;π buffptr = ^buffer_;π str80 = String[80];ππVarπ OldExitProc : Pointer;π KeyFile,π OldFile,π NewFile : File;π KeyBuffer,π Buffer : buffptr;π KeyFileSize,π EncFileSize : LongInt;π PassWord,π KFName,π FFName : str80;ππProcedure Hash(p : Pointer; numb : Byte; Var result: LongInt);π { When originally called numb must be equal to sizeof }π { whatever p is pointing at. if that is a String numb }π { should be equal to length(the_String) and p should be } π { ptr(seg(the_String),ofs(the_String)+1) }π Varπ temp,π w : LongInt;π x : Byte;ππ beginπ temp := LongInt(p^); RandSeed := temp;π For x := 0 to (numb - 4) do beginπ w := random(maxint) * random(maxint) * random(maxint);π temp := ((temp shr random(16)) shl random(16)) +π w + MemL[seg(p^):ofs(p^)+x];π end;π result := result xor temp;π end; { Hash }ππProcedure NewExitProc; Far;π { Does the "housekeeping" necessary on Program termination }π Var code : Integer;π beginπ ExitProc := OldExitProc; { Reset Exit Procedure Pointer to original }π Case ExitCode ofπ 0: Writeln('Successfully encrypted or decrypted ',FFName);π 1: beginπ Writeln('This Program requires 3 parameters -');π Writeln(' /pPassWord');π Writeln(' /kKeyFile (full path and name)');π Write (' /fFile (The full path and name of the File');π Writeln(' to be processed)');π Writeln;π Write ('These parameters can be in any order, are Case,');π Writeln(' insensitive, and may not contain any spaces.');π end;π 2: Writeln('Could not find key File');π 3: Writeln('Could not rename and/or open original File');π 4: Writeln('Could not create encrypted File');π 5: Writeln('I/O error during processing - could not Complete');π 6: Writeln('Insufficient memory available');π 7: beginπ Writeln('Key File is too small - aborted');π Writeln;π Writeln(' Key File must be at least as large as the buffer size ');π Write (' or the size of the File to be encrypted, whatever is the');π Writeln(' smaller.');π end;π 8: Writeln('PassWord must consist of at least 4 Characters');π else { any other error }π Writeln('Aborted With error ',ExitCode);π end; { Case }π if Renamed and (ExitCode <> 0) thenπ Writeln(#7'WARNinG: original File''s name is now TEMP.$$$');π {$I-}π close(KeyFile); Code := Ioresult;π close(NewFile); Code := Ioresult;π close(OldFile); Code := Ioresult;π if ExitCode = 0 thenπ Erase(OldFile); Code := Ioresult;π {$I+}π end; { NewExitProc }πππFunction Str2UpCase(Var S: String): String;π { Converts a String S to upper Case. Valid For English. }π Varπ x : Byte;π beginπ Str2UpCase[0] := S[0];π For x := 1 to length(S) doπ Str2UpCase[x] := UpCase(S[x]);π end; { Str2UpCase }ππProcedure Initialise;π Varπ CommandLine : String;π FPos,FLen,π KPos,KLen,π PPos,PLen : Byte;ππ Procedure AllocateMemory(Var p: buffptr; size: LongInt);π beginπ if size < BufferSize then beginπ if MaxAvail < size then halt(6);π GetMem(p,size);π endπ else beginπ if MaxAvail < BufferSize then halt(6);π new(p);π end;π end; { AllocateMemory }ππ beginπ FillChar(OldExitProc,404,0); { Initialise all global Variables }π FillChar(PassWord,243,32);π ExitProc := @NewExitProc; { Set up new Exit Procedure }π if ParamCount <> 3 then halt(1);π CommandLine := String(ptr(PrefixSeg,$80)^)+' '; { Add trailing space }π CommandLine := Str2UpCase(CommandLine); { Convert to upper Case }π PPos := pos('/P=',CommandLine); { Find passWord parameter }π KPos := pos('/K=',CommandLine); { Find keyFile parameter }π FPos := pos('/F=',CommandLine); { Find Filename For encryption}π if (PPos = 0) or (KPos = 0) or (FPos = 0) then Halt(1);π FFName := copy(CommandLine,FPos+3,80);π FFName[0] := chr(pos(' ',FFName)-1); { Correct String length }π KFName := copy(CommandLine,KPos+3,80);π KFName[0] := chr(pos(' ',KFName)-1);π PassWord := copy(CommandLine,PPos+3,80);π PassWord[0] := chr(pos(' ',PassWord)-1);π if length(PassWord) < 4 then halt(8);π { Create a random seed value based on the passWord }π Hash(ptr(seg(PassWord),ofs(PassWord)+1),length(PassWord),RandSeed);π assign(OldFile,FFName);π {$I-}π rename(OldFile,'TEMP.$$$');π if Ioresult <> 0 thenπ halt(3)π elseπ renamed := True;π assign(OldFile,'TEMP.$$$');π reset(OldFile,1);π if Ioresult <> 0 then halt(3);π assign(NewFile,FFName);π reWrite(NewFile,1);π if Ioresult <> 0 then halt(4);π assign(KeyFile,KFName);π reset(KeyFile,1);π if Ioresult <> 0 then halt(2);π EncFileSize := FileSize(OldFile);π KeyFileSize := FileSize(KeyFile);π if KeyFileSize > EncFileSize thenπ KeyFileSize := EncFileSize;π if Ioresult <> 0 then halt(5);π {$I+}π if (KeyFileSize < BufferSize) and (KeyFileSize < EncFileSize) thenπ halt(7);π AllocateMemory(buffer,EncFileSize);π AllocateMemory(KeyBuffer,KeyFileSize);π end; { Initialise }ππProcedure Main;π Varπ BytesRead : Word;π finished : Boolean;ππ Procedure CodeBuffer(number: Word);π { This is the actual encryption/decryption engine }π Var x : Word;π beginπ For x := 0 to number - 1 doπ buffer^[x] := buffer^[x] xor KeyBuffer^[x] xor Random(256);π end; { CodeBuffer }ππ beginπ {$I-}π finished := False;π Repeatπ BlockRead(OldFile,buffer^,BufferSize,BytesRead);π if Ioresult <> 0 then halt(5);π if (FilePos(KeyFile) + BytesRead) > KeyFileSize thenπ seek(KeyFile,0);π BlockRead(KeyFile,KeyBuffer^,BytesRead,BytesRead);π if Ioresult <> 0 then halt(5);π CodeBuffer(BytesRead);π finished := BytesRead < BufferSize;π BlockWrite(NewFile,buffer^,BytesRead);π Until finished;π end; { Main }ππbeginπ Initialise;π Main;πend.π 4 05-28-9313:40ALL SWAG SUPPORT TEAM ENCRYPT1.PAS IMPORT 6 Function EncryptDecrypt(S : String : K : String) : String;πVarπ I,Q : Integer;π O : String[255];πbeginπ Q := 1;π O := "";π For I := 1 to Length(S) Doπ beginπ O := O + Chr(Ord(S[I]) Xor Ord(K[Q]));π Inc(Q); If Q > Length(K) Then Q := 1;π end;π EncryptDecrypt := O;πend;ππA couple of thoughts on this.ππ1. If K is short then the decryption is very easy.π2. The routine would be VERY slow as it is using String concatenation. Itπ would be MUCH faster if the O := "" line was changed to O[0] := S[0] andπ the O := O + ... line was replaced With -π O[I] := ...ππTeeCeeπ 5 05-28-9313:40ALL SWAG SUPPORT TEAM ENCRYPT2.PAS IMPORT 10 {The following very simple routine will encrypt and decrypt a Text File a lineπat a time. The CR/LF is left unencrypted and the algorithm ensures that noπencrypted Character can be < asciiz 127 *provided that* the Text For encryptingπhas no hi-bit Characters.ππObviously this is just a skeleten example (untested) With no error checking butπit should demonstrate what you need to do. After encrypting Text just reverseπthe parameters and run the Program again to decrypt the encrypted Text.π}πProgram encrypt_Text;ππVarπ inText,π outText : Text;π st : String;ππFunction ConvertTxt(s: String): String;π Var x : Byte;π beginπ ConvertTxt[0] := s[0];π For x := 1 to length(s) doπ ConvertTxt[x] := chr(ord(s[x]) xor (Random(128) or 128));π end; { ConvertTxt }ππbeginπ RandSeed := 1234567;{ set to whatever value you wish - this is your "key" }π assign(inText,ParamStr(1));π reset(inText);π assign(outText,ParamStr(2));π reWrite(outText);π While not eof(inText) do beginπ readln(inText,st);π Writeln(outText,ConvertTxt(st));π end;π close(inText);π close(outText);πend.π 6 05-28-9313:40ALL SWAG SUPPORT TEAM ENCRYPT3.PAS IMPORT 12 { JL> I'm writing a Program to set and test passWords. I imagine you saw it inπ JL> PASCAL echo. Well, I want to know if there is an easier way to encrypt aπ JL> File then to assign a different Character to each letter. This is theπ JL> only way that I can think of to do this.ππ JL> 'A':= '^';π JL> 'B':= 'q';ππWhat you suggest isn't so much encryption as it is a substitution cypher. Theπfollowing is more of an *encryption*:π}ππFunction Crypt(S : String) : String;π(* xor can be used to *toggle* values. In this Case it is toggling *)π(* Character of the String based on its postion in the String. This *)π(* ensures that the mask is always known For the pupose of decoding. *)π Varπ i : Byte;π beginπ For i := 1 to Length(S) Doπ S[i] := Char(ord(S[i]) xor i);π Crypt := S;π end;ππVarπ TestS : String;π TestMask : Byte;ππbeginπ TestS := 'This is a test 1234567890 !@$%';π Write('original: ');π Writeln(TestS);ππ TestS := Crypt(TestS);π Write('Encrypt : ');π Writeln(TestS);ππ TestS := Crypt(TestS);π Write('Decrypt : ');π Writeln(TestS);πend.ππ{Please note that this was a quickie and not fully tested and thereForeπcannot be guaranteed to be perfect. <grin> But it ought to give you aπslightly different perspective and help you see alternate approaches toπthe problem.π}π 7 05-28-9313:40ALL SWAG SUPPORT TEAM ENCRYPT4.PAS IMPORT 12 { JC> I was wondering what Format you Programmers out there use to makeπ JC> registration codes. I was fooling around With a letter standing Forπ JC> another letter but thats too simple. How can I go about writingπ JC> bullet proof (or at least bullet resistant) registration codes. BTW,π JC> this is not an over the modem Type Program. if you understand whatπ JC> I'm TRYinG to say, I wopuld RealLY appreciate a response. Thanks aπ JC> lot!!!π}πππProgram RegCode;ππUses Crt;ππVarπ ch : Char;π Name : String;ππFunction MakeRegCode(S:String): LongInt;ππVarπ I: LongInt;π B: Byte;ππbeginπ I:=0; { Could make this something else if you want it more random looking }π For B:=1 to Length(S)π Do I:=I+ord(S[B]); { Could make it ord(S[B]+SomeValue) to make it moreπ interesting }π MakeRegCode:=I;πend;ππbeginππ Writeln;π Writeln;π Write('Enter SysOp Name : ');π Readln(Name);π Writeln;π Writeln('The resultant code was ',MakeRegCode(Name));π Writeln;π ch:=ReadKey;ππend.πππ{You can also add a BBS Name or a City or anything else you want. just keep onπadding it to the I Var in the MakeRegCode proc. to check to see if a reg codeπis valid, just Compare the registration code he already has (in a cfg Fileπcomewhere I assume) With the one generated this part of code. if they match,πthen is is a good code... if not... then he didn't register.π}π 8 05-28-9313:40ALL SWAG SUPPORT TEAM ENDECODE.PAS IMPORT 31 Unit endecode;π { Simple encryption/decryption routines. }ππInterfaceππTypeπ stArray = Array[0..255] of Byte;ππFunction Key(Var s): LongInt;πFunction EncryptStr(key : LongInt; s: String): String;πFunction DecryptStr(key : LongInt; s: String): String;ππImplementationππFunction MakeCodeStr(key : LongInt; Var s): String;π {--------------------------------------------------------}π { Creates a "randomly" Constructed String of a similar }π { length as the String which is to be encrypted. A }π { LongInt key is used to permit "passWord" Type }π { encryption. This key may be passed as a literal or }π { some passWord used to calculate it. Using this key, }π { the last Character of the String to be encrypted and }π { the length of the String, a "code String" is produced. }π { This code String is then xord With the original String }π { to produce the encrypted String. The last Character }π { however must be treated differently so that it can be }π { easily decoded in order to reproduce the coded String }π { used For decoding. This is done by xoring it With the }π { length of the String. to decrypt a String the last }π { Character must be decoded first and then the key coded }π { String produced in order to decrypt each Character. }π {--------------------------------------------------------}ππ Varπ x : Word;π len : Byte Absolute s;π st : Array[0..255] of Byte Absolute s;ππ beginπ RandSeed := (key * len) div st[len];π {This ensures that no two code Strings will be similar UNLESS they areπ of identical length, have identical last Characters and the sameπ key is used.}π MakeCodeStr[0] := chr(len);π For x := 1 to len doπ MakeCodeStr[x] := chr(32 + Random(95));π {Keeping the Character between 32 and 127 ensures that the high bitπ is never set on the original encrypted Character and thereFore allowsπ this to be used as flag to indicate that the coded Char was < #32.π This will then permit the encrypted String to be printed without fearπ of having embedded control codes play havoc With the Printer.}π end;ππFunction Key(Var s): LongInt;π { Creates a key For seeding the random number generator. st can be aπ passWord }π Varπ x : Byte;π temp : LongInt;π c : Array[1..64] of LongInt Absolute s;π len : Byte Absolute s;π beginπ temp := 0;π For x := 1 to len div 4 doπ temp := temp xor c[x];π Key := Abs(temp);π end;ππFunction EncryptStr(key : LongInt; s: String): String;π Varπ cnt,x : Byte;π len : Byte Absolute s;π st : Array[0..255] of Byte Absolute s;π CodeStr : stArray;π temp : String Absolute CodeStr;π beginπ temp := MakeCodeStr(key,st);π EncryptStr[0] := chr(len);π EncryptStr[len]:= chr(st[len]);π For x := 1 to len-1 do beginπ cnt := st[x] xor CodeStr[x];π inc(cnt,128 * ord(cnt < 32));π EncryptStr[x]:= chr(cnt);π end; { For }π cnt := st[len] xor (len and 127);π inc(cnt,128 * ord(cnt < 32));π EncryptStr[len]:= chr(cnt);π end;ππFunction DecryptStr(key : LongInt; s: String): String;π Varπ cnt,x : Byte;π st : stArray Absolute s;π len : Byte Absolute s;π CodeStr : stArray;π temp : String Absolute CodeStr;π ch : Char;π beginπ cnt := st[len] and 127;π st[len] := cnt xor len;π temp := MakeCodeStr(key,st);π DecryptStr[0]:= chr(len);π DecryptStr[len]:= chr(st[len]);π For x := 1 to len-1 do beginπ cnt := st[x];π dec(cnt,128 * ord(st[x] > 127));π DecryptStr[x] := chr(cnt xor CodeStr[x]);π end; { For }π end;ππend.π 9 05-28-9313:40ALL SWAG SUPPORT TEAM HASH.PAS IMPORT 28 Unit Hash;ππ{***************************************************************************π * *π * Copyright 1989 Trevor J Carlsen *π * All rights reserved *π * Rovert Software Consulting Services *π * PO Box 568 *π * Port Hedland Western Australia 6721 *π * Telephone (091) 732026 or (091) 732569 *π * *π ***************************************************************************}ππInterfaceππUses Strings,π sundry;ππFunction hashcode(st : String; Var nwd : Word): Word;ππImplementationππFunction MakeCodeStr(key : LongInt; st : String): String;π Varπ x : Word;π len : Byte Absolute st;π beginπ RandSeed := (key * len) div ord(st[len]);π MakeCodeStr[0] := st[0];π For x := 1 to len doπ MakeCodeStr[x] := chr(Random(255));π end;ππFunction Key(st: String): LongInt;π Varπ len : Byte Absolute st;π x,y : Byte;π temp : LongInt;π tempst : Array[0..3] of Byte;ππ Procedure makekey(Var k; Var s : LongInt);π Var t : LongInt Absolute k;π rec : Recordπ Case Byte ofπ 1 :(b : LongInt; c : Word);π 2 :(d : Word ; e : LongInt);π 3 :(r : Real);π end;π beginπ RandSeed := t;π rec.r := random;π s := s xor rec.b xor rec.e;π end;ππ beginπ temp := 0;π For x := 1 to len-3 do beginπ For y := 0 to 3 doπ tempst[y] := Byte(st[x + y]);π makekey(tempst,temp);π end;π Key := temp;π end;ππFunction EncryptStr(key : LongInt; st : String): String;π Varπ len : Byte Absolute st;π cnt,x : Byte;π temp,CodeStr : String;π beginπ CodeStr := MakeCodeStr(key,st);π temp[0] := st[0];π temp[len] := st[len];π For x := 1 to len-1 do beginπ cnt := ord(st[x]) xor ord(CodeStr[x]);π temp[x] := chr(cnt);π end;π cnt := ord(st[len]) xor len;π temp[len] := chr(cnt);π EncryptStr := temp;π end;ππFunction hashcode(st : String; Var nwd : Word): Word;π Var k : LongInt;π len : Byte Absolute st;π s : String;π beginπ k := key(st) * nwd;π st := StUpCase(st);π s := CompressStr(st);π move(s[1],nwd,2);π if len < 4 then st := st + '!@#$';π {-Force String to a minimum length}π st := EncryptStr(k,st);π st := EncryptStr(Key(st),st);π hashcode := key(st) shr 16;π end; {hash}ππend.πππ{π> Procedure Hash(p : Pointer; numb : Byte; Var result: LongInt);ππ> ... Is this the way that you were referring to storing passWords?π> if so could further explain the usage of this Procedure? Thanx!!ππYes, but I take issue With the Word "store". Storing the passWord hash is notπstoring the passWord as the passWord cannot be determined by examining the hashπ- even if the hash algorithm is known.ππto use the Procedure -ππWhen the passWord is first created, calculate its hash and store that valueπsomewhere - either in a File or in the exe.ππthen when the passWord is used just -ππ Hash(@passWord,length(passWord),EnteredHash);π if PwdHash = EnteredHash then PassWord_Entered_is_Correct.π} 10 05-28-9313:40ALL SWAG SUPPORT TEAM PASCASE.REP IMPORT 13 CHECKSUM.PASπ Program : 8π Procedure : 1π LongInt : 2π Word : 1π File : 7π For : 3πMade 22 changes to CHECKSUM.PAS in 0.88 seconds.ππCOPYINC.PASπ Program : 6π Uses : 1π Unit : 1π Const : 6π Var : 1π String : 5π LongInt : 2π Word : 1π File : 11π Text : 10π For : 1πMade 45 changes to COPYINC.PAS in 1.04 seconds.ππENCRYPT.PASπMade 0 changes to ENCRYPT.PAS in 1.87 seconds.ππENCRYPT1.PASπ String : 1πMade 1 changes to ENCRYPT1.PAS in 0.71 seconds.ππENCRYPT2.PASπMade 0 changes to ENCRYPT2.PAS in 0.77 seconds.ππENCRYPT3.PASπMade 0 changes to ENCRYPT3.PAS in 0.82 seconds.ππENCRYPT4.PASπMade 0 changes to ENCRYPT4.PAS in 0.88 seconds.ππENDECODE.PASπMade 0 changes to ENDECODE.PAS in 1.15 seconds.ππHASH.PASπMade 0 changes to HASH.PAS in 1.21 seconds.ππPASSWORD.PASπMade 0 changes to PASSWORD.PAS in 0.93 seconds.ππPATCHEXE.PASπMade 0 changes to PATCHEXE.PAS in 0.93 seconds.ππXORCODE.PASπ xor : 2πMade 2 changes to XORCODE.PAS in 0.88 seconds.πππFiles Processed : 12πBytes Processed : 30,724πTotal Scans : 1,908πBytes Scanned : 58,621,392πTotal Changes : 70πTotal Time : 12.31 SecondsπBytes Per Second : 4,762,988π 11 05-28-9313:40ALL SWAG SUPPORT TEAM PASSWORD.PAS IMPORT 20 { JL>Help me guys. I'm learning about reading from a File. I am creating aπ JL>Program that will let you set passWord and test a passWord.ππ JL>Also how do you make the screen print a Character like .... instead of aπ JL>Word. So when you enter in a passWord like in BBS it won't show it?ππ------------------------------------X----------------------------------------π}ππProgram TestPW;ππ{πProgrammer : Chet Kress (FidoNet 1:283/120.4)πBeen Tested? : YES, this has been tested. It works!πoriginal Date : 01/01/93πCurrent Version : v1.0πLanguage : Turbo Pascal v7.0πPurpose : Make a passWord routineπ}ππUses Crt;ππProcedure TestPassWord;ππConstπ DataFile = 'PW.DAT'; {The name of the data File containing the passWord}π {Just have one line in the PW.DAT File, and use that as the passWord}ππVarπ PassWordFile : Text; {The name assigned to the data File}π PassCH : Char; {A Character that the user has entered}π TempPassWord : String; {The temporary passWord from the user}π ThePW : String; {The Real passWord from the data File}ππbegin {TestPassWord}π Assign (PassWordFile, DataFile);π Reset (PassWordFile);π ClrScr;π TempPassWord := '';π Write ('Enter passWord: ');π{π I replaced the Readln With this Repeat..Until loop so you can see theπ "periods" instead of the Characters (like you wanted). This is a simpleπ routine, but it should suffice For what you want it to do. It has someπ error checking and backspacing is available too.π}π Repeatπ PassCH := ReadKey;π if (PassCH = #8) and (Length(TempPassWord) > 0) thenπ beginπ Delete (TempPassWord, Length(TempPassWord), 1);π GotoXY (WhereX-1, WhereY);π Write (' ');π GotoXY (WhereX-1, WhereY);π end;π if (PassCH >= #32) and (PassCH <= #255) thenπ beginπ TempPassWord := TempPassWord + PassCH;π Write ('.');π end;π Until (PassCH = #13);π Writeln;π Readln (PassWordFile, ThePW); { <-- You Forgot to add this line }π if TempPassWord = ThePW thenπ beginπ Writeln ('You have received access.');π Writeln ('Loading Program.');π { Do whatever else you want to here }π endπ elseπ beginπ Writeln ('Wrong PassWord.');π end;π Close (PassWordFile);πend; {TestPassWord}ππbegin {Main}π TestPassWord;πend. {Main}ππ 12 05-28-9313:40ALL SWAG SUPPORT TEAM PATCHEXE.PAS IMPORT 20 { PD> This looks like something I would like to add to my Programs. Myπ PD> question is, how do you modify the .exe from the Program. I can do theπ PD> encryption but don't know how to store the encrypted passWords in theπ PD> Program's own .exe. Any help would be appreciated.π}ππProcedure PatchExeFile(ItemAddr:Pointer;itemsize:LongInt);πVarπ FiletoPatch : File;π HeaderSize : Word;π seeksize : LongInt;π offset : Word;π LDseg : LongInt;π ch : Char;ππbeginπ assign(FiletoPatch, paramstr(0));π reset(FiletoPatch, 1);π seek(FiletoPatch, 8);π blockread(Filetopatch, headersize, sizeof(headersize));π offset := ofs(itemAddr^);π Ldseg := LongInt(Dseg);π seeksize := 16 * (LDseg - PrefixSeg + HeaderSize) + offset - 256π seek(Filetopatch, seeksize);π blockWrite(Filetopatch, ItemAddr^, ItemSize);π close(Filetopatch);πend;ππ{Call it this way:π}πPatchExeFile(Addr(passWords), sizeof(passWords));ππ{note that For this to work, passWords must be a TypeD ConstANT.πSo you declare it this way:π}π PassWords : PassWord_Array =π (π (PassWord : #247#154#189#209#18#104#143#29; Protected : False),π .π .π .π (PassWord : #247#154#189#209#18#104#143#29; Protected : False)π );ππ{ PassWord_Array is declard as an Array of PassWord_Record;ππ The above declaration is from my Crypto.inC. I have a Crypto.PASπProgram that generates this File from my Make File so that on eachπCompile the encryption is changed and the Array of passWords is storedπwith valid encrypted passWords. I used #<AsciiValue> because theπencryption can generate values from Ascii 0 to Ascii 255 and some ofπthose cause troubles in Strings Constants using "'" as delimeters.ππ As long as you use:ππConst <ConstName> : <ConstType> = <ConstantValue>;ππ You will be sure PatchExe can find it's correct adress in the EXE.πFrom there on you can read it in your TP Program as usual and store itπusing the call to PatchExe I gave up there.ππ BTW, do as I do and generate a new random encryption key on eachπrun, Re-encrypting everything and writting it back to the exe. Thisπdrives Hackers mad when they try to decypher your encrypted passWords.ππOne last note:π The above PatchExe was written when I used TP 6.0. I haven't checkedπ yet if TP 7.0 Uses different mapping of his EXe and it will mostπ probably not work on a Protected-mode Compiled EXE.π}π 13 05-28-9313:40ALL SWAG SUPPORT TEAM SOUNDEX.PAS IMPORT 12 {πREYNIR STEFANSSONππSomebody was saying something about Soundex hashing. Here is myπImplementation of that:π}ππUnit Soundex;ππInterfaceππTypeπ Sdx4 = String[4];ππFunction SoundexOf(WorkStr : String) : Sdx4;ππImplementationππVarπ Group : Array[0..6] of String[8];ππFunction ValidityOf(Letter : Char) : Char;πVarπ Valu, j : Integer;π Chs : String[8];πbeginπ For Valu := 0 to 6 DOπ beginπ Chs := Group[Valu];π For j := 1 to Length(Chs) DOπ beginπ if UpCase(Letter) = Chs[j] thenπ ValidityOf := Chr(48+Valu);π end;π end;πend;ππFunction SoundexOf(WorkStr : String) : Sdx4;πVarπ Sndex : Sdx4;π Oval,π Valu : Char;π i : Integer;πbeginπ Sndex := Copy(WorkStr, 1, 1);π Oval := ValidityOf(WorkStr[1]);π For i := 2 to Length(WorkStr) DOπ beginπ Valu := ValidityOf(WorkStr[i]);π if (Valu <> '0') and (Valu <> Oval) thenπ Sndex := Sndex + Valu;π Oval := Valu;π end;π Sndex := Sndex + '000';π SoundexOf := Sndex;πend;ππbeginπ Group[0] := 'AEHIOUWY';π Group[1] := 'BFPV';π Group[2] := 'CGJKQSXZ';π Group[3] := 'DT';π Group[4] := 'L';π Group[5] := 'MN';π Group[6] := 'R';πend.ππ{πA Soundex-String looks like: `G032', one letter and three numbers.πDonald Knuth wrote about Soundexing in his _Art of Computer Programming_πseries. I got my information out of Personal ComputerWorld (PCW), which inπturn got it from Knuth.π}π 14 05-28-9313:40ALL SWAG SUPPORT TEAM XORCODE.PAS IMPORT 11 {π│ Is if possible For you to post a sample code on how to use xor toπ│ encrypt a File??? I'm shifting ORD value around to do excryptionsπ│ and I think your method is better.. So I would like to learn it..ππSure, here's a simple example that reads a user-entered line andπencrypts it using the xor method. By XOR-ing it again the line isπdecrypted. This won't keep NSA fooled For more than a few seconds, butπso long as you keep the passWord hidden it should suffice.π}πππProgram Sample;ππUsesπ Crt;ππConstπ PassWord : Array[1..8] of Char = 'Sha Zamm';ππVarπ PassBits : Array[1..8] of Byte Absolute PassWord;π ALine : String[80];π LineBits : Array[0..80] of Byte Absolute ALine;π I, J, K : Integer;πbeginπ WriteLn('Enter a line of Text to encrypt:');π ReadLn(ALine);π J := 0;π For I := 1 to Length(ALine) Doπ beginπ Inc(J);π If J > 8 Thenπ J := 1;π LineBits[I] := LineBits[I] xor PassBits[J];π end;π WriteLn('Encrypted: ',ALine);π J := 0;π For I := 1 to Length(ALine) Doπ beginπ Inc(J);π If J > 8 Thenπ J := 1;π LineBits[I] := LineBits[I] xor PassBits[J];π end;π WriteLn('Decrypted: ',ALine);πend.π