Teacher tools for Classical cryptosystems \302\251Mike May, S. J., 2007, Saint Louis University, maymk@slu.edu A worksheet that collects tools used in the worksheets on classical systems so a teacher would have them near at hand for creating problems, test questions, and answer keys.
<Text-field style="Heading 1" layout="Heading 1">Type conversion</Text-field> restart:with(StringTools): charToBinByte := proc(character) local binChar: binChar := convert(op(convert(character, bytes))+256,binary): substring(convert(binChar,string),2..9): end: binToHexByte := binString -> substring(convert(convert(parse(binString),decimal,binary)+256, hex),2..3): hexToBinByte := hexString -> substring(convert(convert(convert(hexString, decimal,hex)+256, binary), string),2..9): binByteToChar := binString -> convert([convert(binString,decimal,binary)],bytes): blocker := proc(hexvec,bsize) local numCharacters, paddingNum, numWords, i, j, temp, hexblock; temp := hexvec; numCharacters :=linalg[vectdim](hexvec); numWords := ceil(numCharacters/bsize); paddingNum := numWords*bsize - numCharacters; temp := [op(temp),seq("00",j = 1..paddingNum)]; hexblock := array(1..numWords, [seq( cat(seq(temp[bsize*i + j], j = 1..bsize)), i=0..numWords-1)]): convert(hexblock,list): end: unblocker := (hexblock,bsize) -> map(hexString -> seq(substring(hexString,2*j-1..2*j), j = 1..bsize), hexblock): stringToHexWordList := (string, blocksize) -> blocker(map(binToHexByte, map(charToBinByte, Explode(string))), blocksize): mess1 := "AZaz Good morning Mr. Phelps. Your job today, should you choose to accept it, is to learn to use one time pad stream ciphers. AZaz"; hexWordList := stringToHexWordList(mess1,5); UV5zQVphen5Hb29kfm1vcm5pbmd+TXIuflBoZWxwcy5+fllvdXJ+am9ifnRvZGF5LH5zaG91bGR+eW91fmNob29zZXwrdG9+YWNjZXB0fml0LH5pc350b35sZWFybn50b351c2V+b25lfnRpbWV+cGFkfnN0cmVhbX5jaXBoZXJzLn5BWmF6NiI= Nz1JKzQxNUE2MTdBMjBHNiJJKzQ3NkY2RjY0MjBHRiRJKzZENkY3MjZFNjlHRiRJKzZFNjcyMDRENzJHRiRJKzJFMjA1MDY4NjVHRiRJKzZDNzA3MzJFMjBHRiRJKzIwNTk2Rjc1NzJHRiRJKzIwNkE2RjYyMjBHRiRJKzc0NkY2NDYxNzlHRiRJKzJDMjA3MzY4NkZHRiRJKzc1NkM2NDIwNzlHRiRJKzZGNzUyMDYzNjhHRiRJKzZGNkY3MzY1MEFHRiRJKzc0NkYyMDYxNjNHRiRJKzYzNjU3MDc0MjBHRiRJKzY5NzQyQzIwNjlHRiRJKzczMjA3NDZGMjBHRiRJKzZDNjU2MTcyNkVHRiRJKzIwNzQ2RjIwNzVHRiRJKzczNjUyMDZGNkVHRiRJKzY1MjA3NDY5NkRHRiRJKzY1MjA3MDYxNjRHRiRJKzIwNzM3NDcyNjVHRiRJKzYxNkQyMDYzNjlHRiRJKzcwNjg2NTcyNzNHRiRJKzJFMjA0MTVBNjFHRiRJKzdBMDAwMDAwMDBHRiQ= hexWordListToString := (hexList, blocksize) -> Implode(map(binByteToChar, map(hexToBinByte, unblocker(hexwordlist1, blocksize)))): mess2 := hexWordListToString(hexWordList, 5); UV5zQVphen5Hb29kfm1vcm5pbmd+TXIuflBoZWxwcy5+fllvdXJ+am9ifnRvZGF5LH5zaG91bGR+eW91fmNob29zZXwrdG9+YWNjZXB0fml0LH5pc350b35sZWFybn50b351c2V+b25lfnRpbWV+cGFkfnN0cmVhbX5jaXBoZXJzLn5BWmF6NiI=
<Text-field style="Heading 1" layout="Heading 1">Vigenere</Text-field> restart: encodevigenere := proc(message, key, klength) #This procedure uses the vigenere cipher to encode a string #key should be a list of integers from 0 to 25 #message is an ASCII string. klength is the length of the key local temp1, messageLength, position, counter: #first convert the message to numerical equivalents temp1 := convert(convert(message, bytes),array): #then uses vigenere to scrable the letters. # c1 is the number of characters in the message. messageLength:= linalg[vectdim](temp1): # counter is the number of letters converted counter := 0: for position from 1 to messageLength do if (temp1[position] > 64) and (temp1[position] < 91) then counter := (counter mod klength) + 1: temp1[position] := 65 + ((temp1[position] - 65 + key[counter]) mod 26): fi: if (temp1[position] > 96) and (temp1[position] < 123) then counter := (counter mod klength) + 1: temp1[position] := 97 + ((temp1[position] - 97 + key[counter]) mod 26): fi: od: #then convert back to the ASCII code convert(convert(temp1,list), bytes): end: wordtoekey := x -> map(a -> a-97, convert(x,bytes)): wordtodkey := x -> map(a -> 123-a,convert(x,bytes)): vigenerekey := wordtoekey("zsedc"); keylength := nops(vigenerekey); NyciI0QiIz0iIiUiIiQiIiM= IiIm message := "There are two kinds of cryptography in this world: cryptography that will stop your kid sister from reading your files, and cryptography that will stop major govenrmanets from reading your files. This book is about the latter. If I take a letter, lock it in a safe, hide the safe somewhere in New York, then tell you to read the letter, that's not security. That's obscurity. On the other hand, if I take a letter and lock it in a safe, and then give you the safe along with the design specifications of the safe and a hundred identical safes with their combinations so that you and the world's best safecrackers can study the locking mechanism - and you still can't open the safe and read the letter - that's security"; UV1obVRoZXJlfmFyZX50d29+a2luZHN+b2Z+Y3J5cHRvZ3JhcGh5fmlufnRoaXN+d29ybGQ6fmNyeXB0b2dyYXBoeX50aGF0fndpbGx+c3RvcH55b3VyfmtpZH5zaXN0ZXJ+ZnJvbX5yZWFkaW5nfnlvdXJ+ZmlsZXMsfmFuZH5jcnlwdG9ncmFwaHl+dGhhdH53aWxsfnN0b3B+bWFqb3J+Z292ZW5ybWFuZXRzfmZyb21+cmVhZGluZ355b3VyfmZpbGVzLn5+VGhpc35ib29rfmlzfmFib3V0fnRoZX5sYXR0ZXIufCtJZn5JfnRha2V+YX5sZXR0ZXIsfmxvY2t+aXR+aW5+YX5zYWZlLH5oaWRlfnRoZX5zYWZlfnNvbWV3aGVyZX5pbn5OZXd+WW9yayx+dGhlbn50ZWxsfnlvdX50b35yZWFkfnRoZX5sZXR0ZXIsfnRoYXQnc35ub3R+c2VjdXJpdHkufn5UaGF0J3N+b2JzY3VyaXR5Ln5+T25+dGhlfm90aGVyfmhhbmQsfmlmfkl+dGFrZX5hfmxldHRlcn5hbmR+bG9ja35pdH5pbn5hfnNhZmUsfmFuZH50aGVufmdpdmV+fnlvdX50aGV+c2FmZX5hbG9uZ353aXRofnRoZX5kZXNpZ25+c3BlY2lmaWNhdGlvbnN+b2Z+dGhlfnNhZmV+YW5kfmF+aHVuZHJlZH5pZGVudGljYWx+c2FmZXN+d2l0aH50aGVpcn5jb21iaW5hdGlvbnN+c29+dGhhdH55b3V+YW5kfnRoZX53b3JsZCdzfmJlc3R+c2FmZWNyYWNrZXJzfmNhbn5zdHVkeX50aGV+bG9ja2luZ35tZWNoYW5pc21+LX5hbmR+eW91fnN0aWxsfmNhbid0fm9wZW5+dGhlfnNhZmV+YW5kfnJlYWR+dGhlfmxldHRlcn4tfnRoYXQnc35zZWN1cml0eTYi ciphertext1 := encodevigenere(message, vigenerekey, keylength); UV1obVN6aXVnfnpqaX53eW5+Y21xZnJ+Z2p+ZnR4aHhyaXFzdGthfmhmfnhra3J+b3N1bmM6fnV2YnJzZ2t1Y296Y353anpsfmFsbmt+a3hycn54Z3l1fm1odn53bHVzd3Z+aXRuZX52aGNjYXJqfmFubXZ+aWtrd3csfmRwY351dmJyc2drdWNvemN+d2p6bH5hbG5rfmt4cnJ+bHNucnR+Zmd6aHBxZWVxZ3Nrfmp1cWx+amlkZmhma35icXRqfmpsbmRrLn5+WGtrcn50c3JtfmhrfmVlcXRsfnhrZ35rc3h3Z3EufCtBan5MfnZ6Y2l+ZH5uZGx4aHQsfmtnZ25+a3N+YXJ+ZH51enhpLH5ra2N3fnhrZ35yc2pofnVuZWl6amRqaX5scH5Nd2F+QnFxYyx+eGtnbX5saW9ufnhneX53cX5xd2VnfnZnd35waHZzd3Ysfndqemwnd35xcXN+a2lmd3FheGIufn5WZ3N4J3Z+cWFrZ3h0aGxjLn5+UnB+c3ppfnJ2Z3d2fmtjbXYsfm1pfkt+c3NvaH5jfmt3eHdncX5zcmd+bm51b35sdn5oZn5lfnZjZXcsfmVxZn5zemlxfmlobml+fmJxdH5sbGh+dXp4aX5kbm5ma356a3N6fnhrZ35jd3dsaW1+a3RoZWh4bWZjc2FzcXV+bnh+eGtnfnJzamh+Y212fmV+a3dtdnZoZn5odmlxdmh1ZW9+dXp4aXZ+eWhsbH53amRhdn5mcWx0bXFjc2FzcXV+cmd+eGtjc35xc3h+Y212fnhrZ352Z3ZvZidyfnRpdnZ+cnNqaGVxc2duZ3FrfmdkcH5ybHlnYX5zeml+b3FiY21xaX5sd2drY21hd3B+LX5jbXZ+Y3J3fnJsbW9ufmJzcid3fnFvd3J+d2pkfmtlaWd+emZofnVnenZ+eGtnfmt3eHdncX4tfmxsZHYncn5raWZ3cWF4YjYi decryptkey := wordtodkey("zsedc"); encodevigenere(ciphertext1, decryptkey, keylength); NyciIiIiIikiI0EiI0IiI0M= UV1obVRoZXJlfmFyZX50d29+a2luZHN+b2Z+Y3J5cHRvZ3JhcGh5fmlufnRoaXN+d29ybGQ6fmNyeXB0b2dyYXBoeX50aGF0fndpbGx+c3RvcH55b3VyfmtpZH5zaXN0ZXJ+ZnJvbX5yZWFkaW5nfnlvdXJ+ZmlsZXMsfmFuZH5jcnlwdG9ncmFwaHl+dGhhdH53aWxsfnN0b3B+bWFqb3J+Z292ZW5ybWFuZXRzfmZyb21+cmVhZGluZ355b3VyfmZpbGVzLn5+VGhpc35ib29rfmlzfmFib3V0fnRoZX5sYXR0ZXIufCtJZn5JfnRha2V+YX5sZXR0ZXIsfmxvY2t+aXR+aW5+YX5zYWZlLH5oaWRlfnRoZX5zYWZlfnNvbWV3aGVyZX5pbn5OZXd+WW9yayx+dGhlbn50ZWxsfnlvdX50b35yZWFkfnRoZX5sZXR0ZXIsfnRoYXQnc35ub3R+c2VjdXJpdHkufn5UaGF0J3N+b2JzY3VyaXR5Ln5+T25+dGhlfm90aGVyfmhhbmQsfmlmfkl+dGFrZX5hfmxldHRlcn5hbmR+bG9ja35pdH5pbn5hfnNhZmUsfmFuZH50aGVufmdpdmV+fnlvdX50aGV+c2FmZX5hbG9uZ353aXRofnRoZX5kZXNpZ25+c3BlY2lmaWNhdGlvbnN+b2Z+dGhlfnNhZmV+YW5kfmF+aHVuZHJlZH5pZGVudGljYWx+c2FmZXN+d2l0aH50aGVpcn5jb21iaW5hdGlvbnN+c29+dGhhdH55b3V+YW5kfnRoZX53b3JsZCdzfmJlc3R+c2FmZWNyYWNrZXJzfmNhbn5zdHVkeX50aGV+bG9ja2luZ35tZWNoYW5pc21+LX5hbmR+eW91fnN0aWxsfmNhbid0fm9wZW5+dGhlfnNhZmV+YW5kfnJlYWR+dGhlfmxldHRlcn4tfnRoYXQnc35zZWN1cml0eTYi LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2I1EhRic=
Legal Notice: The copyright for this application is owned by the author(s). Neither Maplesoft nor the author are responsible for any errors contained within and are not liable for any damages resulting from the use of this material. This application is intended for non-commercial, non-profit use only. Contact the author for permission if you wish to use this application in for-profit activities.