The program TNT (4) is a good example of a data encryption method that has attempted to be both fast and secure but it too is about 10 to 20 times more complicated, as measured by program execution time, than the method presented here. This forces TNT to be written in assembly language to be practical. CRYP was written in a high order language and is about 4.5 times faster, exclusive of I/O time, than TNT written in assembly language.
Another article (5) contained encryption programs that were fast and were written in a high order language, but they used the same encryption key over and over again for the same input key. If one enciphered message were ever compromised then any other message which used the same input key would no longer be secure with this method.
Basic Method Used --
An alphanumeric key, input by the operator of the program, is converted into nine 16-bit seeds for nine different random number generators. The output of the nine generators are combined to generate a random sequence of bits of about 3.55 * 10**44 bits long (approximately 2**148 bits). This sequence of bits is then used as a pseudo infinite key and is exclusive-ORed with the bits of the data file to produce the data for the enciphered file.
Processing the Key --
The characters of the key input by the operator are converted to a standard form containing only 63 different characters. Lower case letters are converted to upper case and control characters are converted to the special characters and the numbers. The space character is changed to a '/' so the standard form will never contain a space. This is done because it may be difficult on some systems to input a space character in an argument on the command line.
A key of 24 characters is needed. If the input key is longer than 24 characters, it is hashed into a 24 character key. For the first 24 characters, each character is increased by the sum of all characters that precede it. For the 25 character on, each charac- ter is increased by the sum of all characters that follow it. Then characters in the same position modulo 24 are then added together to make the key 24 characters long. The summing of characters is done arithmetically modulo 256.
If the key is shorter than 24 characters, trailing '/' are appended to make it 24 characters. The 24-character key is also converted to the standard form. Only the 6 least significant bits of each of the 24 key characters are used to generate the seeds for the random number generators.
Continuation File --
In order to make this method an infinite key encryption system (4) a continuation file, CRY.CON, is maintained by the program. This file contains one record of 18 bytes from the random number generators. Each time a file is enciphered, the continuation file is read, its 18 bytes are exclusive-ORed with the 18 bytes of the bits from the encryption key to produce the starting seeds for the 9 random number generators. The continuation file is also output as the first 18 bytes of the enciphered file. After the input file is enciphered the continuation file is updated by reseeding the random number generators with the 18 bytes of the continuation file and the next 4096 bytes from the generators are stored in a pool of random numbers in reverse order. Each 16 bits stored is the sum of 9 random integers, one from each generator, truncated to the lower 16 bits. The first 18 bytes of this pool is then written to the continuation file.
There is an option in CRYP to initialize the continuation file. When this option is selected the encryption key is used directly to seed the random number generators and 18 bytes output from the generators, as described above, are stored in the continuation file. The key used to initialize the continuation file should not be the same key used to encrypt data files.
The use of the continuation file does not cause each file enci- phering to start up with the pseudo infinite key exactly where it left off, but causes it to start up at a random point in its extremely long periodic cycle. It is impractical to try to start up where the previous file left off because the pool of 2048 random integers, described shortly, would have to be save and protected between runs. Starting up at a random point and reiniti- alizing the pool for each file is a better method.
The Random Number Generators --
The nine random number generators were chosen very carefully and have been tested to ensure they each produce the proper number of random integers before they cycle and start reproducing the same sequence all over again. Four of the generators are Congruential generators (6) and five of them are Shift-register generators (7). This was done to prevent the problems that can arise when only one type of generator is used (7). The generators were chosen so their periods would be relatively prime to each other (65536, 65535, 65537, 65521, 65519, 65497, 65479, 65449 and 65447 respectively). This was done to produce a very long resulting period in the pseudo infinite key. The pseudo infinite key is generated in 16-bit increments by a combination of exclusive-ORing and arithme- tic addition of the output of the nine random number generators.
The Pseudo Infinite Key --
After the seeds of the 9 generators are established, each genera- tor is called once and the sum of the 9 integers generated, truncated to 16 bits, is used to initialize rr, the running random integer. This rr is normally updated by adding, and truncating to 16 bits, the next output of the next generator, cycling the generators 0 through 8 and repeating. Thus, only one call to one generator is needed to get 16 more bits for the basic random bit sequence.
Next the pool of 2048 random integers is initialized. This is done by storing consecutive values of rr generated as just described. After this rr is recomputed by calling each generator once and summing the 9 integers generated as before. This makes rr indepen- dent from any integer in the pool.
Now we are ready to start generating bits of the pseudo infinite key. The next 16 bits of this key is always generated by:
1) Use the lower 11 bits of rr as a relative index into the pool.
2) Use the integer at this position in the pool as the next 16 bits of the pseudo infinite key.
3) Update rr by adding the output of the next generator to rr and keep the lower 16 bits.
4) Replace the integer just used in the pool with the exclusive-OR of itself and rr (do not change rr).
This process causes the pseudo infinite key to be a very compli- cated function of the output of the 9 random number generators, but is a simple process to program and execute.
One criticism of this method might be that it is a substitution cipher only and that a combination of a transposition and substi- tution produces the strongest cipher schemes. The normal transpo- sition process is what makes the TNT program run so slow. In a sense CRYP does have a transposition process but it is a transpo- sition in the pseudo infinite key instead of in the text.
Process Overview --
In order to understand the method better, outlines of the three options of the program are given:
Encipher Process --
1) Process key from operator.
2) Read continuation file.
3) Copy continuation file to output file.
4) Initialize random number seeds.
5) Fill random number pool.
6) Read, encrypt, write input file to output file.
7) Restore random number seeds from continuation file.
8) Build and write random record to continuation file.
Decipher Process --
1) Process key from operator.
2) Read first 18 bytes of input file.
3) Initialize random number seeds.
4) Fill random number pool.
5) Read, encrypt, write input file to output file.
Initialize Continuation file --
1) Process key from operator.
2) Initialize random number seeds.
3) Build and write random record to continuation file.
Timing Data --
A file of 128K bytes of all zeros was generated using DEBUG, and COPY in the following way:
A:\>DEBUG -FCS:100,L,8000,0 -RCX CX xxxx :8000 -RBX BX xxxx :0 -NA:Z -W Writing 08000 bytes -Q A:\>COPY /B Z+Z+Z+Z Z128K Z Z Z Z 1 File(s) copied
Randomness Testing --
The 128k file of all zero described above was enciphered four different times and a Chi-square test applied to each enciphered file. The Chi-squared statistic generated was 232.8, 294.8, 304.5 and 225.9. For a Chi-square test with 255 degrees of freedom as this test is, the Chi-square statistic has a median value of 254.3 and should be between 200.6 and 316.9, 99% of the time and between 219.0 and 293.2, 90% of the time.
Twenty-four Chi-square tests were run on other encipherings of the all zero file, taking 5120 byte blocks of data per test. The maximum Chi-square was 291.3, the minimum Chi-square was 198.8 and the average was 254.7. On these 24 runs the mean, second, third, and fourth moments of the distribution of the value of the bytes were also calculated with no significant deviation from their theoretical values.
Operating the program --
This program is written in C and all operator input comes from the DOS command line. The format of the command to execute CRYP can be found by executing CRYP with no parameters. The output to the screen in this case is:
CRYP - A data encryption system written in C, with pipes Version 6.00, 1992-11-15, 1400 hours Copyright (c) 1987-1992 by author: Harry J. Smith usage: CRYP key [D/I] [<infile] [>outfile] D = Decipher I = Init CRY.CON file using key and exit default = Encipher and update CRY.CON file
A file can be enciphered twice with the same or different keys and then deciphered by deciphering twice using the keys in the reverse order. This double encryption is not recommended since CRYP is very secure with only one encryption.
Choosing a key --
If you are serious about protecting the information contained in your file, the encryption key should be chosen carefully, and of course it also needs to be protected. A key of FEBRUARY is a poor choice because if a few characters can be determined the rest can be guessed. A short key such as ASDF is bad because if the key space is searched in lexicographic order the key will be found in less than 2**24 tries.
A good scheme for choosing a key is to make up a phrase that makes no special sense but is at least 48 characters long. When this key is converted to the 24-character key the characters will look random. For example, the eight input keys:
1) YOU/SHOULD/MAKE/YOUR/KEYS/AT/LEAST/48/CHARACTERS 2) TRY/TO/MAKE/YOUR/KEYS/EASY/TO/REMEMBER/BUT/HARD/TO/BREAK 3) THE/WIND/BLOWS/THE/SNOW/FALLS/IT/WILL/NOT/BE/HOT 4) A/NEST/IS/A/HOME/IF/YOU/ARE/A/BIRD/BUT/I/LIKE/MINE 5) ROSE/HAS/HAD/TOO/MUCH/SAID/I/HAVE/NOTHING/TO/ADD 6) ROPE/IT/CAN/BE/LONG/IT/CAN/BE/SHORT/BUT/NOT/FOR/ME 7) EAGLE/WHAT/A/BIRD/IF/I/COULD/FLY/WOULD/BE/ONE/TOO 8) BOOK/READ/ONE/TO/ME/READ/ONE/MYSELF/BUT/NOT/TO/YOU
1) B>DRQJM](YTR_2(4%36G3**1 2) U/1"@N)C422T+58;(>/9D2%" 3) IKOR]SRMH[PVAHHNGXXIR2!! 4) *J!!%88?I#)#<282,2/*P2 5) :@OEKD]OHK]S33:@!'M<55GD 6) Y:W-Z^#_ZLHCVY3+KKC>8F&7 7) $'99::+'/4,^XNSVXB\STXXG 8) ._*'14,4%ORZ0]\WWVLGJ[MB
How Secure is the Method? --
The search space is about 2**144 keys. An extremely powerful computer would be needed to search and find the key in a timely manner. If 10**14 processors could each test 10**14 different keys per second it would take about 10**7 years to find a randomly selected key.
If there is a flaw in this method it would be that a chunk of the pseudo key, if it were exposed, could be used to determine the value of the seeds used to produce it. This seams totally impossi- ble because the process of generating the pseudo infinite key appears to be quite irreversible, but this is not proven. Thus, it is still necessary to change the input key periodically.
Pascal version --
An interactive user interface version of this program, CRYU, was developed using TURBO Pascal. Tests were performed to insure that a file can be enciphered with one of the programs and then deciphered with the other program. The running time of the two programs are essentially the same.
C Named files version --
A C version CRYN that uses files names on the command line instead of pipes was also developed. The format of the command to execute CRYN can be found by executing CRYN with no parameters. The output to the screen in this case is:
CRYN - A data encryption system written in C, named files Version 6.00, 1992-11-15, 1400 hours Copyright (c) 1987-1992 by author: Harry J. Smith usage: CRYN key [infile outfile [D]] key only => Init CRY.CON file using key and exit no D => Encipher and update CRY.CON file D => Decipher
1. Data Encryption Standard, U. S. Department of Commerce, National Bureau of standards, FIPS Publication 46, 1977 January 15.
2. Katzan, H. The Standard Data Encryption Algorithm. New York: Petrocelli Books, 1977.
3. Kernighan, B., and Plauger, P. Software Tools. Reading, Mass.: Addison-Wesley, 1976.
4. Thomas, J., and Thersites, J. "Designing a File Encryption System", Dr.Dobb's Journal (August 1984): 44-53.
5.Scacchitti, F. E., "The Cryptographer's Toolbox", Dr. Dobb's Journal (May 1986): 58-64.
6. Knuth, D. E. The Art of Computer Programming, vol. 2, Seminu- merical Algorithms. Reading, Mass.: Addison-Wesley, 1968.
7. Ralston, A. Encyclopedia of Computer Science, First Edition, "Random Number Generation", New York: Van Nostrand Reinhold, 1976.
8. Stout, R. B., "S-CODER for Data Encryption" Dr. Dobb's Journal (Jan 1990): 52-58.