RCM3720 Cryptography, Network and Computer Security
Laboratory Class 2: Strings and Values
Characters and Strings
All printable characters have a fixed ASCII value; some of which are:
Character | A B Y Z a b y z
------------+-------------------------------
ASCII Value | 65 66 89 90 97 98 121 122
|
Character | 0 1 8 9 , - . /
------------+-------------------------------
ASCII Value | 48 49 56 57 44 45 46 47
To obtain values 0 to 25 for A to Z, we need to subtract 65 from
the ASCII values.
In Axiom, the ord command gives the ASCII value of a
character. Create a string such as:
str:="THISISASTRING"
A string can be turned into a list of characters using members:
members(str)
This means a string can be turned into a list of ASCII values by
mapping the ord function onto the list of members:
map(ord,members(str))
To obtain values in the 0--25 range, try using an unnamed function:
strn:=map(x +-> ord(x)-65,members(str))
Use this last command to create a function str2lst which will
take a string (assumed to be of capital letters, with no spaces or
punctuation), and return a list of values between 0 and 25.
To go the other way, we first need to add 65 to all elements of
strn:
map(x +-> x+65,strn)
Turn this into characters with char:
map(char,%)
These can be done as a single command:
map(x +-> char(x+65),strn)
To put them all together as a single string we can concatenate them
with the concat function from the String domain:
concat(%)$String
In one line:
concat(map(x +-> char(x+65),strn))$String
Alternatively, we could convert the characters to type String
before concatenation:
concat(map(x +-> char(x+65)::String,strn))
Use either version of this last command to create a function
lst2str which will take a list of values between 0 and 25 and
return a string.
Create a text file in one of your private directories called
my3720.input and copy your str2lst and
lst2str functions to it.
You can read command line input from a file with the extension
.input using the )read command:
)read my3720
The Caesar cipher can be implemented by the following three steps:
Turn the string into a list,
Add 3 to every number in the list,
Turn this new list back into a string.
To ensure that step (2) remains in the 0--25 range, we need to use the
rem function. These can all be put together as:
caesar(str) == lst2str(map(x +-> (x+3) rem 26, str2lst(str)))
Try this out on a few strings of your choice.
By replacing the "+3" in the caesar function with
"+n" create a new function called trans(str,n) which
implements a general translation cipher.
Test it out; these two commands should produce the same results.
caesar("MYSTRING")
trans("MYSTRING",3)
If you like, add the caesar and trans functions to
your my3720.input file.
Test your trans function out on a few other strings and
translation values.
The ROT13 cipher is used in Usenet postings to hide information
which might be considered offensive. It is a translation cipher with a
shift of 13. Since 13 is half of 26, this means that encrytion and
decryption are exactly the same. Apply ROT13 to:
GUVFVFNIRELFREVBHFOHFVARFF
Consider this string which has been produced with a translation cipher.
To decrypt it, simply apply all possible shifts until you obtain
understandable text.