<div dir="ltr">I'm working on a program which authenticates public keys using a symmetric key derived from a "short authentication string" (five random words). I'm using scrypt as a KDF in conjunction with a 32-bit random salt (this is actually the only salt size libsodium's implementation of scrypt will accept), and encrypting public keys with xsalsa20poly1305 (this will likely change to chacha20poly1305 soon if you care). The salt is appended to the ciphertext and both are sent over the wire.<div>

<br></div><div>I'm trying to randomly select a passphrase as users are notoriously terrible at picking passwords. I've settled on this 4096 "most commonly used" word list for English (so each word is 12-bits of entropy):</div>

<div><br></div><div><a href="https://raw.githubusercontent.com/cryptosphere/confusion/master/wordlists/en.txt">https://raw.githubusercontent.com/cryptosphere/confusion/master/wordlists/en.txt</a></div><div><br></div><div>

For now I've somewhat arbitrarily chosen 5 words as being "secure enough" for authentication purposes. This gives 60-bits of entropy, which serves as an input to scrypt.</div><div><br></div><div>The short authentication strings I'm generating seem palatable enough to be easily exchanged in person or over the phone. Here are some samples:</div>

<div><br></div><div><span style="color:rgb(0,0,0);font-family:Times;font-size:medium">shared metaphor property sigh capture</span><br></div><div><span style="color:rgb(0,0,0);font-family:Times;font-size:medium">yeah gravity cycle struggle parental</span><span style="color:rgb(0,0,0);font-family:Times;font-size:medium"><br>

</span></div><div><span style="color:rgb(0,0,0);font-family:Times;font-size:medium">recipient briefly payment schedule target</span><span style="color:rgb(0,0,0);font-family:Times;font-size:medium"><br></span></div><div>
<span style="color:rgb(0,0,0);font-family:Times;font-size:medium">stare educator ally peak employ</span><span style="color:rgb(0,0,0);font-family:Times;font-size:medium"><br>
</span></div><div><br><div><div>I've also added a refresh button so if the first try gives people too big a mouthful, they can refresh until they find a palatable enough phrase.</div><div><br></div><div>Some questions:</div>

<div><br></div><div>- Is 60-bits entropy too little, even "stretching" it with scrypt?</div><div>- What scrypt parameters are needed to make this actually secure?</div><div><br></div><div>Keep in mind here the main goal is authentication, not confidentiality. Once two users have authenticated each other's keys, it doesn't really matter that much if someone cracks the password, as it would only reveal their public keys. Once the public keys have been authenticated, the construct has more or less done its job.</div>

<div><br></div>--<br>Tony Arcieri<br>
</div></div></div>