IETF-SSH archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Interop lsh and SSH-2.0-GitLab-SSHD



>> So it's not just modulus size, but I'm wondering if the gitlab code
>> is stupid enough to consider any exponent over 65537 as an error or
>> some such.
> My guess is it considers any exponent larger than a machine word
> (which makes ops with it quite efficient) as irrational and therefore
> rejects it.

nisse@'s original message said that

	The only unusual thing with the key, as far as I can tell, is
	that the "e" value is a randomly selected 32-bit number, not
	just 17 or 65537.

I would be surprised if that were larger than a machine word on the
machines gitlab is using.

> My code does this too - there's no sane reason for having an exponent
> like that apart from opening yourself up to DoS attacks.

I guess we won't interoperate, then; I'm sorry to hear it.

moussh uses an exponent chosen by taking 0x8000000000000001 and, twice,
setting a randomly-selected bit (so in most cases four bits set),
retrying generation until it finds a value which is suitable, one which
is coprime to (p-1)(q-1).  As my explanatory comment puts it,

/*
 * We want e to be large enough to make the low encryption exponent
 *  attack hopeless right out of the gate; but we also want it to have
 *  relatively few bits set, so as to speed up operation.  So we set e
 *  equal to 0x8000000000000001 plus up to two other bits in random
 *  positions, trying different random values until we get an e that's
 *  relatively prime to t=(p-1)(q-1).  (The code always sets two bits;
 *  I say "up to" two other bits because the code may hit the bits
 *  already set, or may pick the same bit for each of the two.)
 *
 * This way, it's unlikely that two different keys will have the same
 *  value of e, but even if they do, it is impossible to mount the
 *  attack, because it requires at least e different messages, and e is
 *  very large when considered as a count of things.
 */

The relevant exponentiation thus means 64-to-66 (if I've counted right)
multiplications.  I didn't - and don't - consider that unreasonable.
Neither do most implementations; I have heard of only one or two (yours
and maybe gitlab's) that disagree.

I considered doing the 32-bit version instead, but collecting
two-to-four billion example messages, to mount the low encryption
exponent attack, was just a little bit too close to plausible for
comfort.  (I wouldn't even consider 17, nor even 65537, because of that
attack.)  And a random 32-bit value, re-chosen until it's
mathematically suitable, will require a mean of about 48
multiplications, only three-quarters what my exponents require.  On a
32-bit machine, exponents over 32 bits long are a little more
expensive to use, but that cost is so dwarfed by the modular
multiplications that I don't consider it even worth thinking about
until e's size approaches n's.

/~\ The ASCII				  Mouse
\ / Ribbon Campaign
 X  Against HTML		mouse%rodents-montreal.org@localhost
/ \ Email!	     7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B



Home | Main Index | Thread Index | Old Index