Spoiler alert - these posts tell how to decrypt the books of the Uplink Game Bible. Be advised that all the books of the Uplink Game Bible are available in unencrypted form in the Uplink Developer CD which can be downloaded via BitTorrent. I use the Vuze BitTorrent client on a Mac and the website
A word of warning - the challenge of getting the Uplink Game Bible was mostly intended for other Software Developers or hard-core computer enthusiasts.
It is not necessary to hack the Game Bible in order to play the game. The Game Bible only contains design notes and sketches the Introversion developers made while developing Uplink, it does not contain any strategy hints, tactics, or secrets necessary to complete the game(AFAIK).
Book 3 was posted on the web in an unadvertised location. An encrypted message containing this location appears at the end of the Readme.txt for Book 2 (you must decrypt the Book 2 Readme.txt file to read this message).
Maybe you're wondering where book 3 is? Well, it wouldn't be right for us to just give it too you. You're going to have to work at it. And this time, it's going to be a challenge.
Here's a code for you to get breaking. Best of luck.
The blocks of numbers are an encrypted message.
As I said earlier, a decrypted version of Game Bible Book 3 is available on the Uplink Developer CD, which can be downloaded for free via BitTorrent using a torrent found on
http://www.btjunkie.org. But I'm not interested in just having the decrypted Game Bible Book 3, I want to know how the message was encrypted in the first place. What cipher was used?
To figure out the cipher it would help to know the decrypted text of the above message (the plaintext). Luckily the user "danilo" on the Introversion Uplink forums (a.k.a Angel Knight on his website) thoughtfully included some of the plaintext of the message at
http://members.multimania.nl/uplink/ (click the "Game Bible" link on the left side of his web page).
His web page has this text:
Book 3
I finally got this book, so if you want it too, the only thing you have to do is to decrypt this HEX to ACSII, and do what the message tells you:
54 68 65 20 63 6f 64 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 72 65 61 64 6d 65 2e 74 78 74 20 61 72 65 20 61 20 63 6f 64 65 62 6f 6f 6b 20 73 74 79 6c 65 20 73 65 74 20 6f 66 20 6b 65 79 73 2c 20 61 74 65 72 2d 6e 75 6d 62 65 72 22 20 69 6e 20 74 68 65 20 68 61 63 6b 65 72 20 6d 61 6e 69 66 65 73 74 6f 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 79 6f 75 72 20 55 70 6c 69 6e 6b 20 72 65 74 61 69 6c 20 63 61 73 65 2e 20 20 44 65 63 6f 64 69 6e 67 20 69 73 20 61 20 6c 6f 6e 67 2c 20 73 6c 6f 77 20 70 72 6f 63 65 73 73 2e 20 20 54 68 65 20 66 75 6c 6c 20 74 65 78 74 20 72 65 61 64 73 3a 20 43 54 48 52 45 45 20 4f 46 20 54 48 45 20 44 45 53 49 47 4e 45 52 53 20 42 49 42 4c 45 20 43 4f 4e 4e 45 43 54 20 55 50 20 54 4f 20 54 48 49 53 20 57 45 42 20 41 44 44 52 45 53 53 20 57 57 57 20 49 4e 54 52 4f 56 45 52 53 49 4f 4e 20 43 4f 20 55 4b 20 46 4f 52 57 41 52 44 53 4c 41 53 48 20 42 4f 4f 4b 54 48 52 45 45 20 55 53 45 52 4e 41 4d 45 20 62 6f 6f 6b 74 68 72 65 65 20 50 41 53 53 57 4f 52 44 20 74 68 65 68 61 63 6b 65 72 6d 61 6e 69 66 65 73 74 6f 69 73 63 72 61 70 20
I used the search and replace feature of a text editor (TextWrangler) to replace all the spaces with percent-signs and added a final percent-sign at the beginning of the text to get this text:
%54%68%65%20%63%6f%64%65%73%20%61%74%20%74%68%65%20%65%6e%64%20%6f%66%20%72%65%61%64%6d%65%2e%74%78%74%20%61%72%65%20%61%20%63%6f%64%65%62%6f%6f%6b%20%73%74%79%6c%65%20%73%65%74%20%6f%66%20%6b%65%79%73%2c%20%61%74%65%72%2d%6e%75%6d%62%65%72%22%20%69%6e%20%74%68%65%20%68%61%63%6b%65%72%20%6d%61%6e%69%66%65%73%74%6f%20%74%68%61%74%20%63%6f%6d%65%73%20%69%6e%20%79%6f%75%72%20%55%70%6c%69%6e%6b%20%72%65%74%61%69%6c%20%63%61%73%65%2e%20%20%44%65%63%6f%64%69%6e%67%20%69%73%20%61%20%6c%6f%6e%67%2c%20%73%6c%6f%77%20%70%72%6f%63%65%73%73%2e%20%20%54%68%65%20%66%75%6c%6c%20%74%65%78%74%20%72%65%61%64%73%3a%20%43%54%48%52%45%45%20%4f%46%20%54%48%45%20%44%45%53%49%47%4e%45%52%53%20%42%49%42%4c%45%20%43%4f%4e%4e%45%43%54%20%55%50%20%54%4f%20%54%48%49%53%20%57%45%42%20%41%44%44%52%45%53%53%20%57%57%57%20%49%4e%54%52%4f%56%45%52%53%49%4f%4e%20%43%4f%20%55%4b%20%46%4f%52%57%41%52%44%53%4c%41%53%48%20%42%4f%4f%4b%54%48%52%45%45%20%55%53%45%52%4e%41%4d%45%20%62%6f%6f%6b%74%68%72%65%65%20%50%41%53%53%57%4f%52%44%20%74%68%65%68%61%63%6b%65%72%6d%61%6e%69%66%65%73%74%6f%69%73%63%72%61%70%20
I copied this text to the clipboard, clicked the "Hex Converter" link on the left side of his web page, pasted the above text into the "Hexidecimal Value" box, and clicked the Decode button, producing this text in the "ASCII Text" box:
The codes at the end of readme.txt are a codebook style set of keys, ater-number" in the hacker manifesto that comes in your Uplink retail case. Decoding is a long, slow process. The text reads: CTHREE OF THE DESIGNERS BIBLE CONNECT UP TO THIS WEB ADDRESS WWW INTROVERSION CO UK FORWARDSLASH BOOKTHREE USERNAME bookthree PASSWORD thehackermanifestoiscrap
You could also use the hex-ASCII converter at
http://d21c.com/sookietex/ASCII2HEX.html
In the decoded text we see that the secret location to download the unencrypted Book 3 of the Uplink Game Bible was:
http://www.introversion.co.uk/bookthree
Username: bookthree
Password: thehackermanifestoiscrap
I happen to agree.
This is now a dead link. But, as I said, I'm not really interested in the unencrypted Book 3 or the original URL/username/password to get Book 3. I'm interested in the cipher used to encrypt the above message as the blocks of columns of numbers. It will also be fun to use the cipher to decode the rest of the message between the words "CONGRATULATIONS" and "three" (even though I already have this text via having downloaded the unencrypted Readme for Book 3 as part of the Uplink Developer CD).
I noticed that the unencrypted message text from "danilo"'s website ("THREE OF THE DESIGNERS BIBLE CONNECT UP TO ...") lines up with the last blocks of the encrypted blocks of columns of numbers.
Also, the Readme.txt files for the first two Uplink Game Bible books began with the word "CONGRATULATIONS". The first block of numbers in the encrypted text has the same number of letters as "CONGRATULATIONS", so pretty safe to say this word is the plaintext for that block of numbers.
If I write these pieces of known plaintext next to the blocks of numbers, we get this:
01 04 01 c
14 18 02 o
06 12 07 n
18 01 05 g
14 03 04 r
11 32 02 a
09 04 07 t
20 06 02 u
18 09 04 l
17 10 01 a
04 26 01 t
19 05 03 i
16 31 02 o
12 19 04 n
09 02 06 s
01 15 03
03 12 03
13 04 01
04 28 02
04 24 01
21 18 01
11 05 01
03 02 01
01 06 01
01 14 03
11 21 01
12 21 04
12 32 02
16 38 02
15 10 08
04 06 01
14 31 01
11 11 01
09 08 02
02 14 06
15 05 07
16 12 03
16 11 03
15 24 03
08 12 02
19 18 05
17 20 03
19 17 03
20 05 01
12 30 01
03 10 05
14 03 01
06 32 02
18 30 02
04 25 04
17 07 02
18 20 02
21 15 01
22 05 01
15 04 01
12 14 03
08 04 09
12 12 01
18 18 01
01 11 05
09 19 07
02 21 01
16 10 07
02 02 01
01 02 02
19 28 03
11 10 01
06 04 04
15 03 02
16 30 01
18 20 01
17 04 02
13 03 05
05 02 10
16 33 04
12 07 02
12 06 02
19 19 01
17 18 03
03 16 02
12 26 04
09 23 09 t
15 14 01 h
14 18 03 r
12 30 04 e
09 09 07 e
04 22 01 o
08 07 01 f
11 20 06 t
16 12 02 h
12 18 02 e
21 14 03 d
15 29 04 e
09 17 02 s
06 06 02 i
16 26 08 g
12 14 05 n
02 03 03 e
16 04 03 r
12 11 02 s
04 29 01 b
20 13 05 i
04 13 01 b
20 11 03 l
15 01 02 e
06 19 05 c
11 30 03 o
02 09 02 n
20 12 01 n
14 31 09 e
03 08 03 c
19 11 08 t
17 30 07 t
14 29 04 o
06 09 04 t
04 12 02 h
18 09 03 i
12 05 02 s
06 30 04 w
12 14 02 e
16 18 01 b
10 03 01 a
06 29 03 d
11 32 01 d
15 32 05 r
15 31 03 e
17 02 08 s
12 05 02 s
04 14 01 w
14 08 01 w
17 30 01 w
02 07 02 i
12 19 04 n
15 29 03 t
10 09 06 r
03 10 02 o
20 13 06 v
18 34 05 e
12 25 05 r
09 17 02 s
12 01 01 i
11 07 01 o
17 29 06 n
06 21 04 c
12 04 02 o
11 24 02 u
22 05 04 k
11 29 03 f
17 11 02 o
12 31 04 r
08 10 01 w
17 17 01 a
18 07 02 r
08 17 01 d
12 11 02 s
19 29 01 l
01 10 02 a
21 19 02 s
12 18 01 h
02 06 01 b
14 10 04 o
06 13 02 o
17 26 02 k
15 13 01 t
14 20 02 h
04 07 03 r
17 09 01 e
02 25 05 e
06 03 02 u
17 13 02 s
08 27 07 e
20 02 02 r
09 01 01 n
08 25 02 a
04 02 02 m
15 17 02 e
18 09 01 b
16 31 02 o
15 07 04 o
15 26 03 k
06 29 06 t
03 13 02 h
01 01 07 r
01 21 05 e
16 21 03 e
17 01 01 p
04 27 03 a
04 17 01 s
14 21 04 s
03 04 01 w
04 07 02 o
11 11 01 r
15 18 05 d
16 09 01 t
12 07 03 h
02 05 05 e
10 09 02 h
04 25 03 a
17 05 01 c
06 32 04 k
11 13 03 e
04 25 02 r
12 32 04 m
13 01 02 a
14 17 03 n
06 04 02 i
14 22 02 f
20 12 02 e
16 24 01 s
20 04 01 t
06 10 02 o
08 27 02 i
06 11 08 s
21 17 01 c
11 12 03 r
22 05 01 a
01 21 04 p
Now we're getting somewhere.
At this point I scoured the Introversion Uplink forums for more hints. I found out that the Hacker's Manifesto was printed on the inside of the back CD slip of the original Uplink CD's. The Hacker's Manifesto is a short essay written by a teenaged hacker who was caught in the 80's. You can read about it at
http://en.wikipedia.org/wiki/Hacker_Manifesto. You can see the original text of the manifesto at
http://www.phrack.org/issues.html?issue=7&id=3&mode=txt. There were also plenty of hints in the Introversion Uplink forums that the Hacker's Manifesto was needed to get Book 3 of the Uplink Game Bible.
I started looking at the numbers. The numbers in the first column range from 1 to 22. The numbers in the 2nd column range from 1 to 34. The numbers in the 3rd column range from 1 to 9.
What do the numbers mean? Very likely the 3rd number of each line is letter within a word, because these numbers only range from 1 to 9.
One possibility I spent some time on was that the first number was paragraph within the manifesto, the 2nd number was word within the paragraph, and the 3rd number was letter within the word. But the original text of the Hacker's Manifesto is not clearly broken into paragraphs. I spent a lot of time experimenting with different ways of breaking the manifesto into paragraphs before giving up on this idea.
At this point I was completely OCD about this problem. Honestly, figuring this cipher out is one of the most addictingly fun things I have ever done.
I spent a lot of time trying different things. One idea was to take rows that I had the plaintext letter for, and for which I had the same first two numbers, and then looking through the manifesto to see if any single word had corresponding plaintext characters in the correct character-within-a-word (3rd column) positions. I only found one or two cases in the where I had plaintext for multiple characters for rows that had the same first two numbers. For each of these cases I did find one or more words which had the correct plaintext characters in the correct positions. But the first two numbers in the rows still never made sense as (paragraph, word).
I took the text of the Hacker's Manifesto, copied it into a text file, and removed all the noise and punctuation characters, so that only the plain words of the manifesto remained, like this:
another one got caught today its all over the papers teenager arrested in computer crime scandal hacker arrested after bank tampering damn kids theyre all alike but did you in your three piece psychology and technobrain ever take a look behind the eyes of the hacker did you ever wonder what made him tick what forces shaped him what may have molded him i am a hacker enter my world mine is a world that begins with school im smarter than most of the other kids this crap they teach us bores me damn underachiever theyre all alike im in junior high or high school ive listened to teachers explain for the fifteenth time how to reduce a fraction i understand it no ms smith i didn't show my work i did it in my head damn kid probably copied it theyre all alike i made a discovery today i found a computer wait a second this is cool it does what i want it to if it makes a mistake its because i screwed it up not because it doesn't like me or feels threatened by me or thinks im a smart ass or doesnt like teaching and shouldn't be here damn kid all he does is play games they're all alike and then it happened a door opened to a world rushing through the phone line like heroin through an addicts veins an electronic pulse is sent out a refuge from the day to day incompetencies is sought a board is found this is it this is where i belong i know everyone here even if ive never met them never talked to them may never hear from them again i know you all damn kid tying up the phone line again theyre all alike you bet your ass were all alike weve been spoon-fed baby food at school when we hungered for steak the bits of meat that you did let slip through were pre-chewed and tasteless weve been dominated by sadists or ignored by the apathetic the few that had something to teach found us will-ing pupils but those few are like drops of water in the desert this is our world now the world of the electron and the switch the beauty of the baud we make use of a service already existing without paying for what could be dirt cheap if it wasnt run by profiteering gluttons and you call us criminals we explore and you call us criminals we seek after knowledge and you call us criminals we exist without skin color without nationality without religious bias and you call us criminals you build atomic bombs you wage wars you murder cheat and lie to us and try to make us believe its for our own good yet we're the criminals yes i am a criminal my crime is that of curiosity my crime is that of judging people by what they say and think not what they look like my crime is that of outsmarting you something that you will never forgive me for i am a hacker and this is my manifesto you may stop this individual but you cant stop us all after all were all alike
Note that my plain manifesto text above has all the apostrophe's removed. This actually causes the character numbers in the 3rd column to not match, so save yourself some time and don't remove the apostrophes from the manifesto text.
This plain manifesto text turned out to come in very handy in the near future.
At some point during all the experimentation I decided to take the information I had so far, convert it into CSV format, and open it with Microsoft Excel (I use my Mac at a workplace that is mostly PC's so I need to have Microsoft Office for Mac installed to open the Word and Excel files my coworkers send me).
I converted the above data into CSV format by using a text editor (TextWrangler) to delete all blank lines between the groups and to replace all spaces with commas. I saved the data to a .csv file and opened the file with Excel.
Looking for more cases where I had rows with the first two numbers equal to each other, I sorted the data by column A, then by column B, then column C. In Excel's main menu select Data > Sort.
In the Sort dialog, select to sort by column A, B, C and click OK:
The sorted data looks like this:
It turns out that this sorted data and the plain words of the manifesto are exactly what you need to build the key which is needed to decrypt the rest of the message.
If you continue to assume that the 3rd column numbers are character-within-a-word, when you start scanning down the rows sorted ciphertext data and looking for matching words in the plain text of the Hacker's Manifesto, you quickly see that for all rows where the first number is 1, if you interpret the 2nd number as word-within-a-line and the 3rd number as character-within-a-word, the known plaintext characters match exactly.
For example, the row
1 1 7 r
matches line 1, word 1, character 7 of "another" at the beginning of the manifesto.
The row
1 4 1 c
matches line 1, word 1, character 1 of "caught" at the beginning of the manifesto.
Of course, at this point, the manifesto text is all one big line. The question is, how do we break the manifesto into lines so that the plaintext characters match up?
If you keep scanning down in the sorted data, the rows where the number in column 1 is "2" and for which we have plaintext characters are
2
3
3
e
2
5
5
e
2
6
1
b
2
7
2
i
2
9
2
n
2
25
5
e
That's quite a lot of known plaintext for the 2nd line of the key file. If you experiment with it, you find that it only works if you break the manifesto into a second line after the word "tampering". Once you do that, you repeat the same process, walking down the sorted data and breaking the manifesto into lines so that the known plaintext characters for the next row match up with the manifest characters. It takes a long time, but when you're done, you have the key needed to decrypt the rest of the message. Here is the key:
GAME BIBLE BOOK 3 KEY
1 another one got caught today its all over the papers teenager arrested in computer crime scandal hacker arrested after bank tampering
2 damn kids theyre all alike but did you in your three piece psychology and technobrain ever take a look behind the eyes of the hacker
3 did you ever wonder what made him tick what forces shaped him what may have molded him
4 i am a hacker enter my world mine is a world that begins with school im smarter than most of the other kids this crap they teach us bores
5 me damn underachiever theyre all alike
6 im in junior high or high school ive listened to teachers explain for the fifteenth time how to reduce a fraction i understand it no ms smith i didn't show my work
7 i did it in my head damn kid probably copied it theyre all alike
8 i made a discovery today i found a computer wait a second this is cool it does what i want it to if it makes a mistake its because i screwed it up
9 not because it doesn't like me or feels threatened by me or thinks im a smart ass or doesnt like teaching and shouldn't be here
10 damn kid all he does is play games they're all alike
11 and then it happened a door opened to a world rushing through the phone line like heroin through an addicts veins an electronic pulse is sent out a refuge from the day to day
12 incompetencies is sought a board is found this is it this is where i belong i know everyone here even if ive never met them never talked to them may never hear from them again i know you all
13 damn kid tying up the phone line again theyre all alike
14 you bet your ass were all alike weve been spoon-fed baby food at school when we hungered for steak the bits of meat that you did let slip through were pre-chewed and tasteless
15 weve been dominated by sadists or ignored by the apathetic the few that had something to teach found us will-ing pupils but those few are like drops of water in the desert
16 this is our world now the world of the electron and the switch the beauty of the baud we make use of a service already existing without paying for what could be dirt cheap if it wasnt run by
17 profiteering gluttons and you call us criminals we explore and you call us criminals we seek after knowledge and you call us criminals we exist without skin color without nationality without
18 religious bias and you call us criminals you build atomic bombs you wage wars you murder cheat and lie to us and try to make us believe its for our own good yet we're the criminals
19 yes i am a criminal my crime is that of curiosity my crime is that of judging people by what they say and think not what they look like my
20 crime is that of outsmarting you something that you will never forgive me for
21 i am a hacker and this is my manifesto you may stop this individual but you cant stop us all
22 after all were all alike
Of course, using the above key to decrypt the message is a royal pain, so I converted it to .csv file (remove the line numbers, find and replace spaces with commas) and opened it with Excel:
When the key has the words broken into columns, decrypting the rest of the message becomes much easier.
The full decrypted message, lined up with the original ciphertext data, is:
01 04 01 c
14 18 02 o
06 12 07 n
18 01 05 g
14 03 04 r
11 32 02 a
09 04 07 t
20 06 02 u
18 09 04 l
17 10 01 a
04 26 01 t
19 05 03 i
16 31 02 o
12 19 04 n
09 02 06 s
01 15 03 i
03 12 03
13 04 01
04 28 02 s
04 24 01 t
21 18 01 s
11 05 01 a
03 02 01 y
01 06 01 i
01 14 03 m
11 21 01 v
12 21 04
12 32 02
16 38 02 y
15 10 08 i
04 06 01 m
14 31 01 p
11 11 01 r
09 08 02 e
02 14 06
15 05 07 s
16 12 03 e
16 11 03 d
15 24 03 w
08 12 02 e
19 18 05 l
17 20 03
19 17 03 d
20 05 01 o
12 30 01
03 10 05 e
14 03 01 y
06 32 02 o
18 30 02 u
04 25 04 p
17 07 02 r
18 20 02 o
21 15 01 b
22 05 01 a
15 04 01 b
12 14 03
08 04 09 y
12 12 01
18 18 01
01 11 05
09 19 07 t
02 21 01 t
16 10 07 o
02 02 01 k
01 02 02 n
19 28 03 o
11 10 01 w
06 04 04 h
15 03 02 o
16 30 01 w
18 20 01 t
17 04 02 o
13 03 05 g
05 02 10
16 33 04 t
12 07 02
12 06 02
19 19 01 b
17 18 03 o
03 16 02 o
12 26 04
09 23 09 t
15 14 01 h
14 18 03 r
12 30 04 e
09 09 07 e
04 22 01 o
08 07 01 f
11 20 06 t
16 12 02 h
12 18 02 e
21 14 03 d
15 29 04 e
09 17 02 s
06 06 02 i
16 26 08 g
12 14 05 n
02 03 03 e
16 04 03 r
12 11 02 s
04 29 01 b
20 13 05 i
04 13 01 b
20 11 03 l
15 01 02 e
06 19 05 c
11 30 03 o
02 09 02 n
20 12 01 n
14 31 09 e
03 08 03 c
19 11 08 t
17 30 07 t
14 29 04 o
06 09 04 t
04 12 02 h
18 09 03 i
12 05 02 s
06 30 04 w
12 14 02 e
16 18 01 b
10 03 01 a
06 29 03 d
11 32 01 d
15 32 05 r
15 31 03 e
17 02 08 s
12 05 02 s
04 14 01 w
14 08 01 w
17 30 01 w
02 07 02 i
12 19 04 n
15 29 03 t
10 09 06 r
03 10 02 o
20 13 06 v
18 34 05 e
12 25 05 r
09 17 02 s
12 01 01 i
11 07 01 o
17 29 06 n
06 21 04 c
12 04 02 o
11 24 02 u
22 05 04 k
11 29 03 f
17 11 02 o
12 31 04 r
08 10 01 w
17 17 01 a
18 07 02 r
08 17 01 d
12 11 02 s
19 29 01 l
01 10 02 a
21 19 02 s
12 18 01 h
02 06 01 b
14 10 04 o
06 13 02 o
17 26 02 k
15 13 01 t
14 20 02 h
04 07 03 r
17 09 01 e
02 25 05 e
06 03 02 u
17 13 02 s
08 27 07 e
20 02 02 r
09 01 01 n
08 25 02 a
04 02 02 m
15 17 02 e
18 09 01 b
16 31 02 o
15 07 04 o
15 26 03 k
06 29 06 t
03 13 02 h
01 01 07 r
01 21 05 e
16 21 03 e
17 01 01 p
04 27 03 a
04 17 01 s
14 21 04 s
03 04 01 w
04 07 02 o
11 11 01 r
15 18 05 d
16 09 01 t
12 07 03 h
02 05 05 e
10 09 02 h
04 25 03 a
17 05 01 c
06 32 04 k
11 13 03 e
04 25 02 r
12 32 04 m
13 01 02 a
14 17 03 n
06 04 02 i
14 22 02 f
20 12 02 e
16 24 01 s
20 04 01 t
06 10 02 o
08 27 02 i
06 11 08 s
21 17 01 c
11 12 03 r
22 05 01 a
01 21 04 p
Note that there are some blanks in the above message where some of the characters from my key didn't quite make sense. It's obvious what those characters are from the context of the plaintext message, so it's no big deal. Rather than take the extra time to fix the remaining glitches in my key file, I chose to just leave the message as-is.
The fully decrypted message (punctuated and formatted) looks to be:
CONGRATULATIONS!
I must say I'm very impressed. Well done.
You probably want to know how to get to book three of the Designers Bible.
Connect to this web address: www.introversion.co.uk/bookthree.
Username: bookthree
Password: thehackermanifestoiscrap
This is a book cipher. For more information, see
http://en.wikipedia.org/wiki/Book_cipher.