TOP SECRET
by John Amphlett
from ZX Computing Apr/May.1985

John Amphlett, masterspy of Haverford West,
gives us a means of keeping our secrets safe!


This secret message encoding / decoding program (16K
SPECTRUM) combines a high degree of security with ease of
operation. The main features are:-

A) The original clear message consists of capital letters,
spaces and full stops, making an "alphabet" of 28
characters.

B) The coded message, which has the same length as the clear
original, uses 52 characters, 26 normal and 26 underlined
capital letters. This method of distinguishing the second
half of the coded character set was chosen because both the
Spectrum and the typewriter can easily underline already
printed characters in the same print position.

C) The elements of the original message are changed to coded
ones by shifting the ZX character codes up and around the
alphabet "circle". This is done by adding a variety of fixed
and randomly chosen integers to the codes then subtracting
the necessary multiples of 26. Decoding is performed in the
opposite direction.

D) The special feature of this program, and one that really
makes such high security possible, is that one of these
integers is the ZX code of the already processed previous
element. This means that the value of a coded element
depends partly on the value of its immediate predecessor and
therefore the whole coded message is made much more
difficult to break.

On running the program, the operator is asked to enter the
Code Number (which controls the RANDOMIZE function), the
Code Letter (which becomes the first integer to be added to
the first element) and the Station Number (the number of the
originating operator). Then he must enter "E" or "D" for the
encode or decode mode. Next he types in the message, clear
or coded as appropriate, and after pressing ENTER the
processed message is displayed on the screen. Finally, after
the result is verified, both original and processed messages
are displayed together.

For those readers who are interested in programming
techniques, here is a brief description of the program. The
first section (lines 10 to 60) sets up some of the fixed
variables and gives the initial input prompts. Line 60
ensures that the appropriate clear and coded messages appear
on the screen on the right lines by means of variables E and
D. The second section (lines 85 to 140) uses the familiar
"typewriter" routine to enter the original message. The
important part of this section is the OVERprinting routine
in line 120 which adds an underline character U$ to a
previously printed normal letter when the decode mode is
operating. This is done simply by pressing the "0" key
immediately after the letter so to be treated. Mistakes can
be rectified by pressing the "5" key (line 115) then typing
in the correct letter. Repeated pressing of the "5" key will
erase letters as far back as you wish. Line 110 provides a
BEEP sound when typing and an "end of message" signal which
triggers the jump out of the typing loop. The message is
printed out on the screen as you go and is also concatenated
in B$ in line 125 and subsequently transferred to M$ for use
in either of the next two sections. B$ is returned to a null
string while O$ is held ready for the final display.

The encoding section (lines 200 to 275) takes each element
of M$ in turn, carries out the arithmetic, adds an underline
where appropriate and types out the coded result along the
encoding line on the screen. First, the RANDOMIZE function
and the variable T (the code of the "previous" element) are
set outside the encoding loop and the random number
generator and the variable U (the underline signal) are set
inside. Then the two extra characters, the space (code 32)
and the full stop (code 46), are given code numbers
immediately before the beginning of the letter alphabet
(codes 63 and 64 respectively) by line 225. Then, line 230
makes all the even numbers except 90 change U to zero whilst
all the odd numbers except 63 are left set to unity. The
reason for this is that the letters Y and Z will, after the
reverse arithmetic procedure in the decode mode, end up with
codes 63 and 64, the same as the space and full stop, and
will therefore be incorrectly decoded. Hence the Y and Z are
given the underline signal and will have an extra 26 added
in line 355. The next three lines perform the necessary
arithmetic and in line 250 the value of T is changed to that
of the new A and used next time round the loop. Line 255
adds the underline character to the appropriate coded
element. The message is printed out on the encoding line on
the screen letter by letter, and B$ collects them in a
string as before. The last two lines in this section sort
out what happens next, line 275 passes the coded message to
M$ for use in the next section for the verification routine
and to P$ for use in the final section, while line 270
operates in the decode mode and passes straight to the final
section.


Decoding

The decode section (lines 300 to 375) has the same pattern
as the encode section so that most of the action is similar.
There is, however, one major difference. The coded message
M$ is printed near the bottom of the screen and SCREEN$
picks up the elements one by one in line 325. Where there is
an underlined character, it is not recognised in line 330.
The underline is cancelled by being reprinted, U is changed
to unity and the program refers back to line 325 when the
normal letter is now recognised and processed. It may be
argued that the use of SCREEN$ is a rather clumsy way of
doing things. It would be much simpler and neater to use
M$(X) directly. I agree, but it is much more fun to watch
those underlinings disappear one by one when the decoding
section is working. The final section (lines 400 to 420)
clears the screen and displays both the original and
processed messages in full.

Although the program as it stands works well, there is a
limitation. Only one line of 31 characters can be dealt with
at one time. However, it should be fairly easy to make a few
necessary alterations to the print statements to get over
that. Other improvements spring to mind, such as multiple
coding, speedier action (approximately 12 seconds a line at
the moment), expanding the character vocabulary and so on.
Perhaps it is better to leave it to others to develop these
ideas.


Variables

A$  elements of M$          A  arithmetic process
B$  concatenation of A$    B  = A/2 (odd or even)
E$  encode/decode input     D  decode
L$  code letter             E  encode
M$  complete message        N  code number
O$  original message        R  random number
P$  processed message       S  station number
U$  underline character     T  "addition" number
V$  continue prompt         U  underline signal
Z$  one line of spaces      X  loop control
(CHR$ 8 = back space	  CHR$ 128 = blank space)


--
Another Fine Product transcribed by:
Jim Grimwood (jimg@globalnet.co.uk), Weardale, England
--
