The project:CryptographySubstitutionDecode the following message, encoded by substitution.ciphertext:="PSAXJZUSNXVA HL JVK LPHKMPK ZG CSHJHMU HM LKPSKJ PZQK NMQ HL NM NMPHKMJ NSJ; JVK GHSLJ QZPTFKMJKQ TLK ZG PSAXJZUSNXVA HM CSHJHMU QNJKL ONPD JZ PHSPN 1900 O.P. CVKM NM KUAXJHNM LPSHOK TLKQ MZM-LJNMQNSQ VHKSZUEAXVL HM NM HMLPSHXJHZM. LZFK KRXKSJL NSUTK JVNJ PSAXJZUSNXVA NXXKNSKQ LXZMJNMKZTLEA LZFKJHFK NGJKS CSHJHMU CNL HMWKMJKQ, CHJV NXXEHPNJHZML SNMUHMU GSZF QHXEZFNJHP FHLLHWKL JZ CNS-JHFK ONJJEK XENML. HJ HL MZ LTSXSHLK, JVKM, JVNJ MKC GZSFL ZG PSAXJZUSNXVA PNFK LZZM NGJKS JVK CHQKLXSKNQ QKWKEZXFKMJ ZG PZFXTJKS PZFFTMHPNJHZML. HM QNJN NMQ JKEKPZFFTMHPNJHZML, PSAXJZUSNXVA HL MKPKLLNSA CVKM PZFFTMHPNJHMU ZWKS NMA TMJSTLJKQ FKQHTF, CVHPV HMPETQKL ITLJ NOZTJ NMA MKJCZSD, XNSJHPTENSEA JVK HMJKSMKJ.";with(StringTools):u:=[CharacterFrequencies(ciphertext)];sort([seq(rhs(u[i]), i=1..nops(u))]);for i from 1 to nops(u) do
if rhs(u[i])=100 then print(u[i]); fi;
od;for i from 1 to nops(u) do
if rhs(u[i])=57 then print(u[i]); fi;
od;for i from 1 to nops(u) do
if rhs(u[i])=56 then print(u[i]); fi;
od;CharacterMap("KJVPZQLGSHMNAXUTFCOEWDIR","ethcodsfrinaypgumwblvkjx" ,ciphertext );Ceasar with our own alphabeth Exercise: Store in a variable named "Alphabet" a string containing all printable symbols.with(StringTools):Alphabet:=cat("\134t\134n", Select( IsPrintable , Implode([seq(convert([i],bytes),i=1..127)])));StringToList:=proc(plaintext)
global Alphabet;
local i;
[seq( -1+ SearchText(plaintext[i],Alphabet) ,i=1..length(plaintext))];
end proc:ListToString:=proc(listnum)
global Alphabet;
Implode([seq(Alphabet[listnum[i]+1],i=1..nops(listnum))]);
end proc:Caesar:=proc(plaintext, shift)
local aux;
aux:=StringToList(plaintext);
aux:=map(x->modp(x+shift, length(Alphabet)), aux);
ListToString(aux);
end proc:Caesar("Now we are implementing Caesar",1);
The Vignere cipherExercise: Modify the Ceasar cipher in the following way: The input should be the plaintext and a list of positive integers.
Shift the first letter by the first number on the list, the second by the second number on the list and so on. This implementation will only work if your list of numbers is longer than the plaintex. How can you modify this if the list is shorter than your plaintext?Vignere2:=proc(plaintext,key)
local aux,i,lengthKey;
lengthKey:=nops(key);
aux:=StringToList(plaintext);
aux:=[seq(modp(aux[i]+key[modp(i-1,nops(key))+1] , length(Alphabet)), i = 1..nops(aux) )];
return ListToString(aux);
end proc:Vignere2("abcdabcd",[1,1,0,0,0]);Exercise: Modify the Ceasar cipher in the following way: The input should be the plaintext and a string of symbols of the Alphabet.
Shift the i-th letter by the position of the i-th symbol of the string in the Alphabeth. This implementation will only work if your string is longer than the plaintex. How can you modify this if the string is shorter than your plaintext?Vignere3:=proc(plaintext,key)
local aux,i,lengthKey, keyNum;
lengthKey:=nops(key);
keyNum:=StringToList(key);
aux:=StringToList(plaintext);
aux:=[seq(modp(aux[i]+keyNum[i] , length(Alphabet)), i = 1..nops(aux) )];
return ListToString(aux);
end proc:Vignere3("abcdabcd","this is the key");LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbW9HRiQ2LVEhRicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y0LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjQvJShsYXJnZW9wR0Y0LyUubW92YWJsZWxpbWl0c0dGNC8lJ2FjY2VudEdGNC8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkMvJStleGVjdXRhYmxlR0Y0Ri8=Affine EncodingAffine:=proc(plaintext, shift, a)
local aux;
aux:=StringToList(plaintext);
aux:=map(x->modp(a*x+shift, length(Alphabet)), aux);
ListToString(aux);
end proc:text:="Today is Thursday";Affine(text,6,3);Exercise: Encode the lower case alphabet (abcd...) using affine encoding with1. x->3x+5.
2. x->2x+17Exercise: Decode the following message, (encoded with our usual Alphabet and affine encoding).ciphertext := "pJUTQs0[T4tUSb4Yop4uY4Uo1pOu4Y.uY4OqSSRYvpTpYh.uqp2.uQO4Y.s/YjOQpsOpbYuSYuqpY/Q42.6YSPYqQ4Yup.OqpT4]YqpY4qSvp/YRQuuRpYSTYsSYQsupTp4uYQsYSuqpTY4Uo1pOu4Y.s/Yv.4Y3R.Op/YQsYuqpYoSuuS2Y4pu4YPSTYoSuqYEs0RQ4qY.s/Y'.uQs~Y|FS/0p4]Y Aa`]Y3~?>\134YKqQRpY.uY4OqSSR]YdR.sY4qSvp/YqQ4Yup.OqpTY4S2pY./5.sOp/Yh.uqp2.uQO4YvSTrYqpYq./Y/SspY.s/Yv.4Y/pOR.Tp/YuSYopY.Y0psQU4~YFSvp5pT]YuqpY4.2pYup.OqpTYOS23R.Qsp/Yuq.uY[R4tUSbqpY43ps/4Y.Y0Tp.uY/p.RYSPYuQ2pY.33.TpsuR6YQsYQs5p4uQ0.uQSs4YQsY./5.sOp/Yh.uqp2.uQO4YuSYuqpYsp0RpOuYSPYpRp2psu.T6YvSTr~[T4tUSbY|FS/0p4]Y Aa`]Y3~_@\134YJqQ4Y4OqSSRYTp3STuY.OOUT.upR6YTpPRpOu4YuqpYv.6YQsYvqQOqYJUTQs0YvSUR/Y5QpvYqQ4YvSTrYQsYqQ4Y./URuYRQPp~YJUTQs0Y0T./U.up/YPTS2Y$.2oTQ/0pYQsY A?YopPSTpY.uups/Qs0YGQs04YvqpTpYqpYvTSupY(sY$S23Uu.oRpYHU2opT4]YvqQOqYv.4Y3UoRQ4qp/YQsY A? Y|j.oSR]Y_>>@]YFQ4uST6~\134YJqQ4YOSsOpTsp/YQu4pRPYvQuqYuqpYQ/p.YSPY.YUsQ5pT4.RY2.OqQsp]YsSvYrsSvsY.4YuqpYJUTQs0Y2.OqQsp~YjUOqY.Y2.OqQspYvSUR/YopY.oRpYuSY[R4tUSbO.TT6YSUuY.s6Y464up2.uQOY3TSOp44Y2.sYOSUR/Y/p5Q4p~YYJqp4pY2.OqQsp4Y3.5p/YuqpYv.6YPSTYuqpY/Q0Qu.RYOS23UupTY.4YvpRRY.4YoTS./psQs0YQ/p.4Y.oSUuYvq.uY2.OqQsp4YOSUR/Y.OqQp5p~Y&sY A?a]YuqpYDTQuQ4qY0S5pTs2psuY.s/YQsupRRQ0psOpY.0psOQp4YvpTpYP.Op/YvQuqYuqpYfpT2.sYEsQ02.Yh.OqQspbY.YOS/pYopRQp5p/YuSYopYUsoTp.r.oRp]YvqQOqYv.4YU4p/Yo6YuqpYfpT2.s4YuSY3.44YSsYQs4uTUOuQSs4Y.s/Y/QTpOuYQu4YPSTOp4~Y|FS/0p4]Y Aa`]Y3~ a\134YJUTQs0Yv.4YTpOTUQup/YuSY.44Q4uYuqpY0S5pTs2psuY.s/YTp2.Qsp/Y.Yrp6YPQ0UTp]Y/p5pRS3Qs0YuqpY[R4tUSboS2op[T4tUSbY2.OqQsp]YvqQOqY4UOOp44PURR6Y/pOS/p/YpsOT63up/YfpT2.sY2p44.0p4~Y|j.oSR]Y_>>@]Y[R4tUSbFQ4uST6~[T4tUSb\134Y%SRRSvQs0YuqQ4YoTp.ruqTSU0q]YJUTQs0YuSSrYuqpYTSRpYSPYOSs4URu.suY.s/YQs5SR5p/YqQ24pRPYQsYSuqpTY3TS1pOu4YQsORU/Qs0YvSTrQs0YSsY43ppOqY4pOTpO6]Y/p4Q0sQs0YuqpYd$EYOS23UupT]YuqpsYuqpY4SPuv.TpYPSTYh.TrY&Y.uYh.sOqp4upTY*sQ5pT4Qu6~Y|j.oSR]Y_>>@]Y[R4tUSbFQ4uST6~[T4tUSb\134Y&sY A`>]YJUTQs0Y3UoRQ4qp/Y$S23UuQs0Yh.OqQspT6Y.s/Y&supRRQ0psOp]Y3pTq.34YqQ4Y2S4uYP.2SU4YvSTr]YvqQOqYSUuRQsp/YqQ4Y5Qpv4YSsY.TuQPQOQ.RYQsupRRQ0psOpY.s/YQu4YPUuUTp~";u:=[CharacterFrequencies(ciphertext)];sort([seq(rhs(u[i]), i=1..nops(u))]);for i from 1 to nops(u) do
if rhs(u[i])=301 then print(u[i]); fi;
od;for i from 1 to nops(u) do
if rhs(u[i])=187 then print(u[i]); fi;
od;for i from 1 to nops(u) do
if rhs(u[i])=112 then print(u[i]); fi;
od;x1:=StringToList(" ")[1];
x2:=StringToList("e")[1];
y1:=StringToList("Y")[1];
y2:=StringToList("p")[1];
eq1:=a*x1+b=y1;
eq2:=a*x2+b=y2;msolve({eq1,eq2},length(Alphabet));msolve(y=1/65,length(Alphabet));modp(3*65,97);Affine(ciphertext,-3*26,3);