using encrypt(3C) to encrypt/decrypt data
ShanklandJA
jas at druxy.UUCP
Wed Jan 11 04:48:13 AEST 1984
(The statement on this line is false.)
A few notes on crypt, encrypt, and setkey(3C):
crypt and encrypt(3C) use an entirely different algorithm from crypt(1).
The latter uses a trivialized version of the German Enigma that
served the Nazis so well during WWII; the former is a variant of
the DES encryption algorithm.
Unix does password encryption by taking a constant string and encrypting
it 25 times over, using the user's typed password as a key. It also
perturbs the encryption algorithm by modifying the E-table (one
of the tables used in standard DES encryption) in one of 4096 ways.
The crypt routine takes a 2-character "salt" and uses it to decide
just how to perturb the E-table.
Now, the problem with using setkey and encrypt to encrypt and decrypt data:
unless crypt is called first, the E-table used by encrypt IS NEVER
INITIALIZED. I have seen this "feature" in both 4.1BSD and 5.0 USG.
The standard DES E-table is kept in an array e2[]. When crypt is
called with a password and a salt, it perturbs e2[] and puts the result
in an array E[], which is subsequently used for DES encryption.
Here are two ways to get around this problem: at initialization time,
call crypt with any old key and some agreed-upon salt (the salt must
of course be consistent among all programs that plan to encrypt/decrypt
the same data) to initialize the E[] array. Alternatively, if source to
crypt is available, modify it so that the E[] array is initialized to
the same values as the e2[] array. This is a pretty trivial modification.
Two final words of warning: crypt works on 64-bit blocks. Don't
make the mistake of taking a 3-byte string, null-padding it to
8 bytes, encrypting it, and then writing only the first 3 bytes of
the encrypted result out to disk (or whatever). Taking those 3 result
bytes, null-padding them to 8 bytes, and decrypting will produce garbage.
Obvious, I know, but we all have our dense moments. Second, be
forewarned that crypt is pretty slow. Be prepared to spend about
4-5 seconds of VAX 780 CPU time to encrypt or decrypt 1024 bytes.
The only time I used it, it turned out to be so slow that I abandoned it.
Hoping this is helpful....
-- Jim Shankland, AT & T Information Systems, Denver
..!ihnp4!druxy!jas
More information about the Comp.unix.wizards
mailing list