On 01/05/2012 05:59 PM, Thor Lancelot Simon wrote:

FWIW, using HMAC like this is the "extract" step of the two-step
extract-expand HMAC based construction that is HKDF


From http://tools.ietf.org/html/draft-krawczyk-hkdf-01
2.2.  Step 1: Extract

   PRK = HKDF-Extract(salt, IKM)

   Options:
      Hash     a hash function; HashLen denotes the length of the
               hash function output in octets
   Inputs:
      salt     optional salt value (a non-secret random value);
               if not provided, it is set to a string of HashLen zeros.
                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
So this is your fixed-value 'tweak'.

      IKM      input keying material
   Output:
      PRK      a pseudo-random key (of HashLen octets)

   The output PRK is calculated as follows:

   PRK = HMAC-Hash(salt, IKM)

Now the definition of HMAC from http://tools.ietf.org/html/rfc2104
where 'K' is the key/tweak input:

                 ipad = the byte 0x36 repeated B times
                 opad = the byte 0x5C repeated B times.

                    H(K XOR opad, H(K XOR ipad, text))

So HMAC with a fixed key input is exactly equivalent to evaluating the underlying hash function twice with two different fixed prefixes.

HMAC does have some other desirable properties that the raw
hash functions do not, no?

I'm not seeing any for the simple extraction scenario, other than the doubling-up of the hash function.

I thought HMAC met the strict avalanche
criterion, while SHA1 does not,

Well perhaps, but what I'm saying is that if you believe that that has implications for your RNG extractor, then you also believe that SHA-1 is not an ideal hash function, i.e., it is "broken" (and I think most folks would agree with you on that).

But the hash function
    SHA-1(fixed_prefix_b || SHA-1(fixed_prefix_a || text))
AKA
    HMAC_SHA-1(fixed_key, text)

MAY be usefully less broken. However, the result will have slightly less than the theoretical 160 bits of entropy (maybe 159.2) due to the way SHA-1 is iterated.

and that this was one of the reasons
why truncation of HMAC results was considered safer than truncation
of raw hash results.

I think that that has more to do with the presumption that the key is secret. If the attacker doesn't know the key, he can't compute the function so he can't conduct offline attacks against the truncated result.

 In this application, the result will often be
truncated when it is used, which is another reason why I -- naive
crypto-plumber though I am -- thought HMAC might be a better choice.

IMHO the bigger danger in RNGs is complexity and overengineering.

But others have well-reasoned opinions that differ from mine. :-)

- Marsh
_______________________________________________
cryptography mailing list
[email protected]
http://lists.randombit.net/mailman/listinfo/cryptography

Reply via email to