     The NEA encryption algorithm was developed several years ago
as a replacement for DES in a communications application where
exportability was a consideration.  The algorithm was evaluated
and approved for export, albeit with a drastically reduced key
length.
     NEA is being placed in the public domain at this time.  The
source code for an X86 assembly implementation of the algorithm
will be E-mailed to anyone sending a request to artmel@well.com.
     A brief description of the algorithm follows:

     NEA (New Encryption Algorithm) is a symmetrical block cipher
which encrypts and decrypts 64 bit blocks.  It is a product
cipher but does not use a Feistel type of reversible algorithm. 
In its exportable form NEA uses a 24 bit key.
     The permutation transforms (P boxes) and substitution
transforms (S boxes) used in NEA are all key dependent and are
derived from a pseudo-random number generator which is seeded by
the encryption/decryption key.  Since the basic transform is not
reversible in the sense of a Feistel cipher, it is necessary to
also derive the inverse S and P boxes for use in decryption.
     The use of a 64 bit block length facilitates the use of NEA
as a substitution for DES is many applications.  Versions of NEA
with longer key length exist, but the 24 bit key version was
developed to meet exportability requirements.
     The input data block first goes through a simple
transformation, which consists of logically rotating each eight
bit block by a number of bits derived from the key.  The block is
then transformed by a 64 X 64 bit P box.  The resulting output of
the permutation is broken down into 16 4 bit nibbles, each of
which is transformed by an independent 4 X 4 bit S box.  The
permutation/substitution constitutes a "round".
     The data block is then acted on by three more rounds of P
boxes/S boxes, each independently derived.  A final 64 X 64 bit
permutation is then applied to the block before a byte-wise
rotation of the opposite sense of the initial transform is
applied.
     The basic building block of the NEA pseudo-random number
generator is a Linear Congruent Sequence Random Number Generator
(LCSRNG) of the form:

                        R(n+1) = (AR(n) + B) mod M

where A = B, A mod 8 = 5, M = 2**16, and the high order 8 bits of
R(n) is used as the random output.  The generator is defined by
its multiplier A and its initial seed R(0).
     Initially, the seed values and multipliers for two master
LCSRNG's are derived directly from the encryption/decryption key.
Each of these master generators is then used to generate the
seeds and multipliers for 128 secondary LCSRNG's
     To generate a random number, one of the two masters is
selected based on the LSB of the last output.  The output of the
selected master is reduced mod 128 and is used as an index to
select one of its group of secondary generators.  The output of
that LCSRNG is then taken as the output of the overall RNG.
