As some readers among you might be some of my students (I teach in a small suburbian middle-school near Paris) , let me remind you kids that some of the principles behind Solitaire are part of the European Information Literacy and Protection curriculum since 2015, and you will be expected to be familiar with these for your final exams ! Remember that being able to use this cipher could also turn out to be of vital importance for personal information protection.*
*No I didn't go crazy, and I haven't forgotten this is 2008 and not 2019. This Instructable is the first in a series of Instructables related to the Institute for the Future's Alternate Reality Game Superstruct. Set in 2019, this game places players in a world threatened by five major ills - failing and/or hacked communication and computer networks, a severed food chain, devastating climate catastrophes that force populations to migrate, epidemics of Respiratory Distress Syndrom and a world struggling to survive without oil. If you think you're up to the challenge or would like to explore this world more, check the main site and join us !
Step 1: Tools You'll Need
Patience : Encrypting data with the Solitaire cipher takes time. To quote Mr. Schneier, "(Solitaire)'s not fast, though. It can take an evening to encrypt or decrypt a reasonably long message."
Two decks of 54 cards : these decks feature the classic four suits of cards - club, diamonds, hearts and spades - plus two jokers. One of the decks will be used to generate keystream values, the other for backup purposes or communicating to your recipient.
Paper and pencil or a computer terminal : For the purpose of this exercise, any relatively trusted terminal will do. Keep in mind, however, that in a real-life situation you might sometimes not be able to rely on "relatively trusted" hardware. In such situations, all operations should be carried using a disposable writing surface of some sort (only 10 years ago, using paper would have been the easiest option but there are parts of the world where this is no longer the case, alas). Even better, don't write down any information anywhere at all (see my Instructable on methods of loci for more help in that field) - if you can do it all in your head, do so.
Step 2: Overview of the Encryption Process
1) Writing your cleartext (immediately understandable) message and preparing it for encryption ;
2) Preparing the decks to generate keystream values ;
3) Generating keystream letters ;
4) Generating the ciphertext ;
5) You're done !
If these 5 steps are clear enough to you, let's move on with step one - writing your cleartext and preparing it for encryption.
Step 3: Writing and Preparing Your Cleartext Message
Once this is done, it's time to prepare your message for encryption. Encrypting a message doesn't change either words' length or message punctuation, both of which can be indications as to what words you've used in your messages. In order to prevent such an attack - called the "probable word attack" - we're going to apply a few changes to your message.
First, we're going to remove ALL the punctuation in your message. Full stops, commas, etc...Just remove them all.
Second, we're going to take care of the length of the words used. You're going to divide your message's characters in small groups of 5 letters. If you have extras, use the letter X. For example, a short message saying "Do not go" would turn into "DONOT GOXXX".
There's nothing really special about using groups of 5 letters - it's just a convention. In the same way, you'll notice we turned the letters into caps - this too is a convention to differentiate more conveniently cleartext from ciphertext. It also takes care of removing all indication of where a sentence starts or finishes. Neat, is it not ?
Now that we're done, let's move to the next step : preparing the decks !
Step 4: Preparing Your Decks
Once this is done, turn it face up and arrange the cards in the other deck to match the distribution of the first. Put it back in its package and don't touch it ! That'll be your backup. You can write down the order of the cards in the deck, save it on your terminal or, as said previously, use mnemonics' to memorize the order of the cards in the deck.
Step 5: Generating Keystream Values
Before fiddling with your deck, let's clarify a few points first - namely, let's explain what these keystream numbers are and what they're going to be used for. Simply put, a keystream is a series of randomly-generated values. Each one of these values is added with one value from the cleartext, the sum of which gives you a third value that is used to generate - you guessed it - ciphertext ! Here's how Solitaire generates these keystream values in just a few steps. If you mess up at some point, just use the backup deck to restore your original keystream-generating deck, and start all over again.
Step 1 : Take the keystream-generating deck face up, and find Joker A and B. In a deck of cards, the two Jokers are usually differentiated one way or another : for example, the Jokers in my deck sport either a red or a black star, and I decided that Joker A would be the Joker with the red star and Joker B the Joker with a black star.
Step 2 : Take Joker A and bring it one card down, then take Joker B and take it two cards down.
Step 3 : We're now going to perform a triple cut. Basically we're going to swap the cards above the first Joker from the top of the deck with the cards under the second Joker from the top of the deck.
Notice I *did* say the first and second Joker from the top, NOT Joker A and B ! Only the cards above and below the Jokers move, not the Jokers themselves. Also, if it turned out that there would be no cards in one of the 3 sections, pretend this is an "invisible" set of cards and swap it nonetheless.
Step 4 : Now is time for a count cut. First, let's check the card at the bottom of the deck - here we have a 10 of Diamonds : we're going to convert it into a number between 1 and 53 using the chart below.*
Clubs are the value of the card + 0 ;
Diamonds are the value of the card + 13 ;
Hearts are the value of the card + 26 ;
Spades are the value of the card + 39.
So we're going to count from the top of the deck all the way down to the 23rd card designated by the value we just figured out. Take all these cards and insert them above the last card of the deck. Make sure that last card stays there - there's a reason for that ! We're almost done !
*Since a Joker is worth 53, a deck with a Joker as the bottom card is left unchanged by Step 4.
Step 5 : It's time to find the first card with which we'll generate a keystream value ! Look at the first card on top of the deck, and convert its value much like you did in Step 4. In our case, we're going to count down to the 33rd card designated by the 7 of Hearts on top of the deck, and write down the card right after (I got a 7 of Spades) on paper. Don't remove that card from the deck ! If the card you hit is a Joker, start over again from Step 1.
Step 6 : Finally, we're going to generate that first keystream value by converting the card's suit and value to a number between 1and 26. Remember the value table we used earlier ? We're going to do something similar here. Let's suppose A of Clubs to King of Clubs will be 1 to 13, A of Diamonds to King of Diamonds will be 14 to 26, A of Hearts to King of Hearts will be 1 to 13 again, and A of Spades to King of Spades will be 14 to 26 again - convert the card you got accordingly, and voila - you have your first keystream value ! All you have to do now is generate as many of these values as there are characters in your message. Of course, don't reset your deck until after you're done generating values.
Once you have the amount of keystream values you need, let's move on to the final step that'll turn your cleartext into ciphertext for good !
Step 6: Generating Ciphertext
This word "modulo" might sound scary and strange, but that is actually something people do all the time when, for example, we figure out what time it is - namely modulo 12. Let's suppose it's 11 in the morning and you have to meet someone 3 hours later - that'll be 2 in the afternoon. Easy, is it not ? These operations are called modular arithmetics. Now let us apply this to our cleartext and keystream values.
Let's go back to the cleartext we prepared earlier so that it'd turn into DONOT GOXXX. We're going to convert every letter to a numeric equivalent :
D O N O T G O X X X transforms into :
4 15 14 15 20 7 15 24 24 24
To which we had the keystream values (these are completely arbitrary, and are only here as an example) :
17 15 8 24 3 10 20 13 1 14
Which gives us :
21 30 22 39 23 1735 37 25 38
Do you remember the modulo I mentioned earlier ? If watches are modulo 12, then the alphabet is modulo 26. Converting these values accordingly, we have now :
21 4 22 13 23 17 9 11 25 12
Which once converted back to letters becomes :
U D V M W Q I K Z M.
Step 7: Deciphering Ciphertext
Step 1 - You're going to need the keystream values the sender used to encrypt the message. This is pretty simple, all things considered : all one needs to do is follow the process described in Step 6 - Generating keystream values using the correct deck, and generate as many keystream values as there are of characters in the message, as seen before.
Step 2 - We're going to use the example from the previous step :
U D V M W Q I K Z M,
and convert it into numbers :
21 4 22 13 23 17 9 11 25 12.
Step 3 - If the recipient of the message followed the keystream values generation process correctly, starting from the deck that was agreed upon with the sender, the values generated are the same as those the sender used :
17 15 8 24 3 10 20 13 1 14 ;
Step 4 - From there, all one needs to do is substract the generated keystream values from the numbers that came up when we converted the message, still using modulo 26. This gives us :
4 15 14 15 20 7 15 24 24 24,
Which we convert into letters, obtaining :
D O N O T G O X X X.
As I told you, nothing too difficult if you've understood how the encryption process works - the decryption process is just the same, only reversed. Don't hesitate to train and work on it until it makes sense ! Better make mistakes now than when time will actually be of the essence !
If you're clear on that part, let's move on to the conclusion.
Step 8: Conclusion (and a Few Words of Advice)
Never, never use the same deck arrangement twice for two different messages. I won't delve into mathematical details here (for this, you should once again check Mr Schneier's original Solitaire page) but a professional cryptographer obtaining two or several messages encrypted with the same deck could easily deduce the keystream values, and decrypt your messages from there.
Don't be lazy and skip the 6 shufflings in the beginning of the process. Would you leave your appartment with your door unlocked when you could have actually locked it ? I thought so. Just do the shuffling :)
If possible, train at generating keystreams before actually having to use Solitaire. This will reduce the risk for errors - which are quite irreversible - as well as help you encrypt your messages faster.
Do as many things as possible in your head, not on paper nor on a computer terminal - granted you can do it without mistakes, that is. For that, you'll need to learn or train in mnemonics, but if the situation calls for such drastic measures, it's worth it.
Once you've finished generating keystream values shuffle your deck a number of times to make the initial deck impossible to retrace. Solitaire is reversible if someone puts their hand on the initial deck, and you do not want this to happen, do you ? Besides, as was said before, you must have written down/saved/memorized the initial deck somewhere (or made a backup deck).
Did I mention never using the same deck arrangement twice ? ;) Alright then, class dismissed ! Enjoy your privacy.
If you notice ANY mistake in this Instructable, make sure to send me a message so I can correct it as soon as possible ! For more details on the mathematics of Solitaire and more advice from Mr. Schneier, visit the original Solitaire webpage as well as [http://en.wikipedia.org/wiki/Solitaire_(cipher) the Wikipedia article] dedicated to this cipher.
And finally, thanks to messieurs BlueScreenJunky and Scribe for their help and proofreading !