home *** CD-ROM | disk | FTP | other *** search
- 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.