From: JMKELSEY@delphi.com
Newsgroups: mail.cypherpunks
Subject: RC2's key schedule and passphrase hashing
Message-ID: <01I0ZVV5YJBC985HB3@delphi.com>
Date: 9 Feb 96 09:28:57 GMT
-----BEGIN PGP SIGNED MESSAGE-----
[ To: Cypherpunks, sci.crypt ## Date: 02/09/96 01:44 am ##
Subject: RC2's key schedule and passphrase hashing ]
Summary: Don't use RC2's key schedule to hash passphrases, with or
without the export hack. Instead, hash the passphrase
first, and then pass the result into RC2 to get expanded.
(This is a good rule to follow with any cipher whose
designers didn't specifically intend for it to be used to
hash passphrases.) Don't use phase two at all--if you
need exportable 40 bit security, generate a 128-bit random
value, and leak 88 bits as salt. Hash the value, and use
the result as the RC2 key.
>Date: Fri, 02 Feb 1996 10:02:37 -0800 (PST)
>From: baldwin (Robert W. Baldwin)
>Subject: RC2 technical questions
>- How does the length of the key influence the mixing
> of bits during each pass of the expansion algorithm?
>- If the first pass of expansion is viewed as a hash
> function that produces 40 or 128 bits out, what are
> its properties?
These are good questions, and they turn out to be pretty
educational. I no longer can see any good reason for the
effective-bits hack. Let me explain why, briefly:
Suppose I'm hashing a 64-character passphrase, where each character
has about three bits of actual entropy, for use in an export-
controlled application. Clearly, this gives us plenty of entropy
(192 bits) in the whole user key. How much entropy can make it to
the last five bytes of expanded key? These last five bytes are a
function of the last five bytes of user passphrase (total entropy of
about 15 bits), and the previous byte of expanded key (which can't
have more than eight bits of entropy). Those are the only inputs
that aren't known to all attackers. This means that in this (very
degenerate) case, we'd have 23 bits of entropy in our last 40 bits.
If we then did phase two of the key expansion based on those 40
bits, we'd wind up with a total expanded key entropy of 23 bits. In
short: Guess an 8 bit random number and the last five bytes of the
user key, and you've got the entire expanded key. (Of course, if
the application always padded the user passphrase with blanks or
something to make it 64 bytes long, and then scheduled the key with
the export control hack, we'd have *eight* bits of entropy in our
expanded key, which probably qualifies for some kind of special
thank-you note from Fort Meade or something.)
Suppose I'm hashing a 32 character user passphrase. The same
analysis applies to the bytes 60..63 of expanded key. Those bytes
can have no more than 23 bits of entropy, if each character of the
passphrase carries three bits of entropy. This means that bytes
92..95 carry at most 31 bits of entropy, and thus that bytes
124..127 carry at most 39 bits of entropy. If we pad the passphrase
out on the right to 32 bytes before sending it into the RC2 key
schedule, then we wind up with about 24 bits of entropy in the whole
expanded key after phase two.
Our assumptions about entropy in user passphrases can make this
better or worse. For example, we may assume that it costs us 16
bits to guess the first three characters of any passphrase
substring, and one bit per character after that. In that case,
processing a 64-character passphrase into 40 effective key bits gives
us 26 bits of entropy. If we assume that each additional character
after the first three guessed costs us two bits, then processing a
64-character passphrase down to 40 bits gives us 28 bits of entropy,
and processing it down to 56 bits gives us 32 bits.
Without phase two, long user passphrases simply leave most of the
expanded key fairly predictable, especially in the high couple of
bits of each byte. I haven't tried to analyze yet what this does to
RC2's security, but it's almost never a good idea to have
highly-predictable bits anywhere in a cipher's expanded key.
The moral of the story seems to be this: Don't use key schedules as
passphrase hashing functions, unless they're specifically designed
as such. In particular, don't use RC2's key schedule to hash your
passphrase. Pass your passphrase (and salt) through a good one-way
hash function like SHA1, and feed the result into your key schedule.
Can anyone guess what the effective-bits parameter is used for? It
doesn't seem to be secure for hashing passphrases, making some
reasonable-sounding assumptions about actual entropy per character
in user passphrases. I can't see an intelligent use for it.
Note that setting effective bits to 40, we have only a 40-bit
key--no salt. This means that using alleged-RC2 with phase two of
the key schedule and effective bits set to 64 or less, we're
potentially vulnerable to a precomputation attack. This is a real
problem if we're doing something like encrypting a constant block at
the beginning of the encryption, to verify that we have the right
decryption key. (It's enough of a potential problem to be
worrysome, anyway--note that almost all of my notes to John Smith
start out with the same eight characters: "[ To: Jo".
Precomputation attacks based on this are quite feasible.) I am very
curious about how this is dealt with in practical implementations.
The obvious way to do this would be to leave effective-bits = 1024,
and just hash an 88-bit salt with a 40-bit session key to get the
128-bit key actually passed into RC2. But that begs the question:
What's the use of having the effective-bits parameter? I certainly
hope nobody is using RC2 with effective-bits set to 40 in any
important, real-world applications.
>--Bob
Note: Please respond via e-mail as well as or instead of posting,
as I get CP-LITE instead of the whole list.
--John Kelsey, jmkelsey@delphi.com / kelsey@counterpane.com
PGP 2.6 fingerprint = 4FE2 F421 100F BB0A 03D1 FE06 A435 7E36
-----BEGIN PGP SIGNATURE-----
Version: 2.6.2
iQCVAwUBMRsR1kHx57Ag8goBAQFzOAQAnjL06eTNMkqgT9OatMa2FRm2dFU7yffU
lH3blWxV2Wv8XrMGTB3WTES6ME1D84qJMk641MNxAtH1PAigFzEFDeBHxDr83fR4
tJFECzQ0KWGUu3Pn9/sHJFhjOWUbg6AAtNQ94XN4kBx+NSb3rF/AtoEMyJr6azug
FA5T+AQq+Jo=
=Y7P+
-----END PGP SIGNATURE-----