<div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Would someone be so kind as to comment on my usage of cryptography in an</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">application I'm working on. It would be much appreciated and I'll owe you</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">a beer or satisfying beverage of your choice. :)</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">The application sends messages from one user to one or more other users.</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Message recipients must be able to verify that the message is from the</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">alleged sender and must be able to read it. Messages will be accessible</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">publicly; not-intended recipients must not be able to read them.(1)</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">All cryptographic functions are provided by TweetNaCl.js (herein after nacl).</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Below is what a message looks like, explanation follows.</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">// Version 1</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">// Recipients</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//  ed8d5061-bf7f-481a-a7e4-b7517ac0c53e</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//  JiKv6es1GLlsbh/W1KFQYSWhsI7CgjYn</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//  e173ZtIxksLAeAqpJgXslGp3uZaDHj02KxgPQaEUJCiH4wrWDNBfwpdr8zI2yLxn</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//  ea72e2a53-1b48-4861-b17d-40fd8453bfea</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//  CS9aCq12Q7S4vHeaH5L3SFOwvroX9CXt</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//  TwFk875v92bIVe12IhzXFoZu8LYAqKyhBpONYCEOovMq3+KXr7S4hXmh6WBRln</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">// Content</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//  5YKDLW3BRo5znN1ReqCatE3WhWf4OMq5</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//  Wo/uU1/badQDLYEuAH6d+xlSV+i/KeCyKgYa6C4pzaj8YdxuEkZtALi8eAB+oQBv</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//  gCNztP15gV6w0otezjCwuYI+g0Fe8tMorZvvsxzQnpA7JztHLpQ=</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">// Signature</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//  4IyI2L3EEXEG2nWw0bIWsJtyjH/ob6QjtUZKzbcZlAvV3aN4jgRnqYlVOvnhSu7/</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//  1LASIDllHV1b1SYwvDbYDA==</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">//</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Each message consists of four sections:</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Version</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  Just because it seems like a good idea.</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Recipients</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  A list of recipients, each consisting of three lines. The first line</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  is the recipient's id. The second line is a nonce; provided by</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  nacl.randomBytes(nacl.box.nonceLength). The third line is a secret key</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  encrypted with nacl.box using the nonce and the recipients public key.</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Content</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  The first line is a nonce. The following lines are the message which</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  has been encrypted using nacl.secretbox(message,nonce,secret).</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"> The value</span><br></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  of secret is nacl.box.keyPair().publicKey.(2) This is the key encrypted</span><br></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  with each recipient's public key.</span><br></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Signature</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  The signature covers everything from the first line to the last line</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  of Content inclusive, excluding the final line-terminator. The</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  signature is generated by nacl.sign(message, secretKey) where secretKey</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">  is the sender's signing key.</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Additional Information</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Each user, sender or receiver, has two key-pairs: one for encryption</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">and the other for signing. These are generated by nacl.box.keyPair and</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">nacl.sign.keyPair.</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Nonces are used only once.</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">There is no "roll your own" encryption, hashing, or similar; nacl</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">handles everything.</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">It occurred to me that someone could snip the signature off of a message</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">replacing it with another, thereby spoofing the creator. The encrypted</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">messages will at times be exposed to such tampering. While it is true that</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">only a spoofer known to the recipient could pull that off, the application</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">embeds the sender id in the content and verifies that the signer is actually</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">the sender.</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Now that I've written this it all seems rather simple. But I've not done this</span><br></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">before, the decades are littered with almost-got-that-right encryption </span><br></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">and, well, littering is against the law, so if there is the slightest question, </span><br></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">comment, or suggestion, tia!<br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">Zane</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">(1) A recipient who knows the sender's public key can verify the message</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">but cannot read it if not in the Recipients list.</span><br></div><div><br></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">(2) I created a shared key for the secretbox using nacl.box.keyPair().publicKey;</span><br></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;">secretKey is not used.</span><br></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div class="protonmail_signature_block protonmail_signature_block-empty"><div class="protonmail_signature_block-user protonmail_signature_block-empty"><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div><div class="protonmail_signature_block-proton protonmail_signature_block-empty"><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;"><br></span></div>