<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<span id="mailbox-conversation"></span><br><br><span class="none"><div id="orc-email-signature" style="display: block;">
<span style="-webkit-tap-highlight-color: transparent;">On Tuesday, Sep 9, 2014 at 5:24 PM, Tony Arcieri <</span><a href="mailto:bascule@gmail.com" target="_blank" style="-webkit-tap-highlight-color: transparent;">bascule@gmail.com</a><span style="-webkit-tap-highlight-color: transparent;">>, wrote:</span>
</div>
<blockquote class="gmail_quote"><div dir="ltr">Keybase attempts to bind user identities on social media to their PGP keys by having users publish an RSA signature under an unknown key, which Keybase refers to as a "proof". The (allegedly) signed message contains a link to their Keybase identity, but contains no information about their public key fingerprint.<div><br></div>
<div>After clicking on the link in the message we're taken to the Keybase web site where their alleged public key is listed. We are then asked to verify this key is authentic by checking if the digital signature in the original message verifies.</div>
<div><br></div>
<div>However, is this actually secure? Or more specifically:</div>
<div><div></div></div>
</div></blockquote>
<span class="mailbox-inline-edit">​</span><div>As you've noted, what keybase.io is doing appears to be fine; they include a lot of information about the public key in their proofs. It would be preferable to include the public key itself, or a strong hash of it.</div>
<div>
<br><div>
<blockquote class="gmail_quote"><div dir="ltr"><div>
<div>Can we produce an RSA keypair such that an existing digital signature will verify under it if we control both the private and public key?</div>
<div></div>
</div></div></blockquote>
<span class="mailbox-inline-edit">​</span><div>Yes; this is a dual-share key-share attack. It works only if you allow users to choose arbitrary public exponents. You just create a smooth enough modulus that you can solve the discrete log problem on its component primes; this isn't incompatible with the modulus being difficult to factor. </div>
<div></div>
</div>
</div>
<span class="mailbox-inline-edit">​</span><div>(This can also be done, in theory, for ECDSA, but no implementations that I know of have made the mistake of permitting users to specify arbitrary base points.)<div><div><div>
<div><br></div>
<div><blockquote class="gmail_quote"><div dir="ltr"><div><span style="-webkit-tap-highlight-color: transparent;">For the purposes of this problem, let's say it doesn't even need to be a good / secure RSA key, just one that the "proof" signature verifies under.</span></div></div></blockquote></div>
</div></div></div>
<div><div><div><div><blockquote class="gmail_quote"><div dir="ltr"><div></div></div></blockquote></div></div></div></div>
<span class="mailbox-inline-edit">​</span><div>Indeed; as best I can tell, keybase.io's OpenPGP implementation is not checking any of the RSA cryptosystem's validity conditions. (Neither does Google's E2E. GnuPGP and PGP check some, but not all.) What RSA public key consumers should check, in rough order of importance:</div>
<div><br></div>
<div>gcd(n, e) == 1</div>
<div>n mod 2 == 1</div>
<div>1 < e <= 2^16+1</div>
</div>
<div>
<div>is_prime(e)</div>
<div><br></div>
<div>(Note that the last two are more restrictive than the sufficient conditions for validity. There is no particular reason to be more lenient, however. It is also nice to check that n can't be factored by trial division or random ECM instances for rho, lambda, and p-1, but this is impractical for JS implementations.)</div>
</div></span>
</body></html>