Secret Decoder Ring
Submit: Turn in two C source files called "encoder-ring.c" and "decoder-ring.c" using the turnin command on the Systems Lab computers, as noted below.
Points for this project will be assigned primarily based upon
automated testing of your submitted source code. It is imperative,
therefore, that you name your files properly as directed above, (no
changes in name, spelling, or capitalization,) and that your programs
are ready to be compiled and run using gcc on Morbius. You
should make liberal use of debugging output during development, but
your submitted version should not be embellished with unspecified
output such as additional prompts or commentary.
This assignment is to be completed individually.
Ring of Xinu
Whenever Lord Xinu (Dark Lord of the Mips) is communicating with his minions over long distances, he uses his super-secret,
Wormhole X-Treme!
cereal box decoder ring to properly encipher his messages.
Your task is to write two simple programs that automate the process of enciphering and deciphering messages without relying on the cheap plastic decoder ring.
You should use the getchar library function to read console
input one character at a time. The use of any other library functions
for input is not recommended at this time.
We have provided example programs for your reference, executable
on Morbius as ~brylow/os/Projects/encoder-ring and ~brylow/os/Projects/decoder-ring.
Simple Autokey Cipher
Autokey ciphers are a class of polyalphabetic cipher algorithms that incorporate the text of the plaintext message into the cipher key.
Envision our decoder ring as a disk with the 26 upper-case alphabet
letters arrayed around its edge in order, with a 27th place between
'Z' and 'A' containing a space. Each of the 27 slots has a number associated
with it: the space is 0, 'A' is 1, 'B' is 2, and so on, up to 'Z' = 26.
To encipher a message, Lord Xinu first chooses a positive integer
key value. His minions will use the same key value later to decode
the enciphered message. Next, he adds the key value to the value of
the first letter of his message, which is equivalent to counting that
many slots around the edge of the decoder ring. The symbol he lands
on will be the first character he sends as his encrypted message.
If Lord Xinu followed this same algorithm -- adding the key value
to each letter in turn -- he would have what is called a shift cipher,
such as the
infamous Caesar
cipher or ROT13.
This is too easy to break; to make this a more
difficult autokey
cipher, he instead
adds
the next letter value and key to
his current position on the decoder ring.
For example:
Assume a key value of zero, and a message of "Hello world!". The first
letter 'H' has value 8. The key is 0, and there is no previous value, so 'H' will be encoded as 'H' (8 + 0 + 0 = 8 = 'H'). The second letter is 'e', which has value 5. The previous value plus 'e' plus the key is 'M' (8 + 5 + 0 = 13 = 'M'.) The third letter of the message is 'L'. (Note that we immediately convert lower-case letters to upper-case for this code.) Previous value 13 plus 'L' (12) plus key (0) = 25 = 'Y'. The fourth character is also 'L'. Previous value (25) plus 'L' (12) plus key (0) = 37, which when wrapped around the decoder ring (modulo 27) is 10, or 'J'.
The enciphered result for "Hello world!" is thus
"HMYJYYUI LPP" with a key of 0, or "IOANCDAQIV A"
with a key of 1, or "JQDRHJHYREKM" with a key of 2, and so
on.
Newline characters ('\n') are transmitted unencoded.
Note that we treat spaces -- and all other non-alphabetic characters
-- as value 0. They will be decoded as blank spaces.
This assignment can be completed using simple loop and conditional
constructs, along with basic integer operations like addition and modulus.
Your encoder-ring and decoder-ring programs should take an optional
key value as a command-line argument. (See textbook section 5.10.) If no
argument is given, the key is assumed to be 0. You may use the C library
function atoi (textbook section B5), or parse the command-line
integer yourself. The encoder-ring reads in plaintext messages line
by line and outputs ciphertext encrypted with the specified key. The decoder-ring reads in ciphertext as input and outputs the plaintext
message decrypted with the specified key.
Notes
- The Systems Lab (CU 310) is the primary development environment
for COSC 3250 and COEN 4820. It is expected that you will learn to use
the required tools for developing, testing, and submitting your
projects. The
are available locally in Cudahy 310,
and can be accessed remotely via ssh using your MSCS password. Free
secure shell (ssh) clients are readily available for other platforms,
including Windows machines at home or in the dorms. See How to Get and Use Secure Shell
(SSH)
- The
run the Linux operating system. If
you need a refresher on using the UNIX environment, please see
the UNIX Tutorial. See also How to Get and Use
Secure Shell (SSH), How to Run an
X-Windows Session, or Brief UNIX
intro
- This project can seem deceptively complex, but is quite tractable
if you first take the time to design suitable helper functions,
and test those function thoroughly before moving on to the
overall project. We encourage the disciplined practice of
test-driven development.
- The reference implementation is considered an integral part of the
specifications for this assignment. Project grades will be based in
significant part upon an automated comparison of behavior against the
reference implementation. Devise test cases to discover the expected
behavior, and do your best to match it precisely. Creativity will be
valued in later assignments, but first one must master the tools.
- Use the electronic turnin system to submit your work.
The command is "turnin", followed by the name(s) of files(s) you
wish to submit. The command "turnin -v" will print a listing
verifying the contents of your submission. See "turnin -h" for
a list of other relevant options. The system does not accept work
after the deadline, and neither does the professor.
We will return to encryption in Chapter 15 of the text in April.
|