Contributor: ANDREW EIGUS

{
The following is result of my work to make simple, fast, and enough
acceptable routine that will encrypt/decrypt any data with the given Key
string. It really works, it's far from RSA and DES, but it encrypts/decrypts
just as it will be _quite_ (impossibel? hard?) to restore the original data
without knowing a Key. BTW, i would recommend as long Key as possibel. ;)

This Eigus Encryption released to Public Domain, and no charge is required
for the author. Alsow, if you would have reccomendations, suggestions, ideas,
or stories to optimise my code, please do not hestitate to ask/tell/post.

Eigus Encryption may be included in SWAG. Thank you.
}

Unit Crypto;
{
  Copyright (c) 1994 by Andrew Eigus    Fidonet: 2:5100/33
  Eigus Encryption Routine source code for Borland Pascal 7.0
  Platforms: DOS, DPMI, Windows
}

interface

const
  { use these above as values for ecCommand parameter for Encrypt procedure }
  ecEncode  = True;
  ecExtract = False;

procedure Encrypt(var Buffer; Count : word; Key : string; ecCommand : boolean);

implementation

Procedure Encrypt; assembler;
var
  SaveDS, SaveSI : word;
  N : byte;
Asm
  push ds
  lds si,Key
  cld
  xor ah,ah
  lodsb
  mov N,al
  mov bx,ax
  cmp bx,0
  je  @@5
  mov SaveDS,ds
  mov SaveSI,si
  lds si,Buffer
  les di,Buffer
  mov cx,Count
  jcxz @@5
@@1:
  lodsb
  mov dl,al
  push ds
  push si
  mov ds,SaveDS
  mov si,SaveSI
  lodsb
  dec bx
  cmp bx,0
  jz  @@2
  lds si,Key
  lodsb
  mov bl,al
@@2:
  add N,al
  or  ecCommand,ecExtract
  jz  @@3
  add dl,al
  sub dl,N
  not dl
  jmp @@4
@@3:
  not dl
  add dl,N
  sub dl,al
@@4:
  mov al,dl
  mov SaveDS,ds
  mov SaveSI,si
  pop si
  pop ds
  stosb
  loop @@1
@@5:
  pop ds
End; { Encrypt }

End.



{ CRYPDEMO.PAS }

Program CryptoDemo;
{
Copyright (c) 1994 by Andrew Eigus  Fidonet: 2:5100/33
Demonstrates the use of unit CRYPTO.PAS
}

uses Crypto;

var
  Str, Key : string;

Begin
  Str := 'This is text to encrypt with Encrypt procedure'; { text to encrypt }
  Key := 'ExCaLiBeR'; { key string to use; longer -> safer ;I }
  WriteLn(#13#10'Original string: ''', Str, '''');
  Encrypt(Str[1], Length(Str), Key, ecEncode);
  WriteLn('Encrypted string: ''', Str, '''');
  Encrypt(Str[1], Length(Str), Key, ecExtract);
  WriteLn('Decrypted string: ''', Str, '''')
End.

{
I hope that my CRYPTO unit might be useful for all of you. You may change my
code as you want.
}