CS 303 Assignment 2 Due Tue. May 19 by 11:59 pm Name: Email: Instructions: Fill in your name and email. Answer the questions in this worksheet and use webct to submit your completed worksheet. Your work must be done individually. There are seven questions with point amounts indicated below. Questions 4-6 are from the optional lab 3. You should read through the review material on linear algebra and matrices from the lab along with the discussion of Hill Cyphers.
<Text-field style="Heading 1" layout="Heading 1">Question 1 [10 points] (Trace RSA)</Text-field> In thi squestion, you are to trace through several examples of encryption and decryption using the function Encrypt that implements RSA. 0) Study the Maple functions that were given to implement RSA and review the example provided. 1) Generate a 10 bit key (10 bits for n) using GenerateKey. 2) Create an input string 3) Encrypt and decrypt the string using the Encrypt function. Verify that the original message is returned. 4) Trace through the individual steps, by calling the intermediate functions individually, for encryption and decryption done in (3). restart;
<Text-field style="Heading 1" layout="Heading 1">RSA Implementation</Text-field>
<Text-field style="Heading 1" layout="Heading 1">Converting between Strings and Integers</Text-field> In order to implement the RSA algorithm, we need to be able to convert between strings and integers. The following procedures do this. The conversion is one to one and onto, so that every string is an integer and every integer is a string. Here are the allowed characters. Note that there are exactly 100 (this requires the inclusion of some non-printable characters like escape = \134e). The reason for including exactly 100 characters is to ensure that every encrypted message can be printed as a string. We convert back and forth between strings and integers by writing each character as a two digit number and concatentating them together. PossibilityString := "abcdefghijklmnopqrstuvwxyz0123456789!.,? ABCDEFGHIJKLMNOPQRSTUVWXYZ@#$%^&*()_-+={[}]~\134"\134'\134`:;></|\134\134\134a\134b\134e\134n\134t"; #Procedure to return the code of an string consisting of a single character #surrounded by back quotes. charcode := proc(chr) local n,i; option remember; n := length(PossibilityString); for i to n while substring(PossibilityString,i..i) <> chr do od; if i>n then ERROR(`unable to find`,chr,` in lookup table`); else RETURN(i-1); fi; end; UV9xYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IS4sP35BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWkAjJCVeJiooKV8tKz18ZnJbfGhyXXxpciInYDo7PjwvfGdyXHwofCl8PHwrfCo2Ig== Zio2I0kkY2hyRzYiNiRJIm5HRiVJImlHRiU2I0kpcmVtZW1iZXJHRiVGJUMlPkYnLUknbGVuZ3RoRyUqcHJvdGVjdGVkRzYjSTJQb3NzaWJpbGl0eVN0cmluZ0dGJT8oRigiIiJGM0YnMC1JKnN1YnN0cmluZ0dGLzYkRjE7RihGKEYkRiVAJTJGJ0YoLUkmRVJST1JHRi82JUkvdW5hYmxlfnRvfmZpbmRHRiVGJEkxfmlufmxvb2t1cH50YWJsZUdGJS1JJ1JFVFVSTkdGLzYjLCZGKEYzRjMhIiJGJUYlRiU= length(PossibilityString); IiQrIg== charcode("\134t"); IiMqKg== charcode("a"); IiIh charcode("P"); IiNj PossibilityString[1]; USJhNiI= PossibilityString[75]; USIoNiI= #Procedure to return an integer corresponding to the character string str. `convert/Block` := proc(str) local n,i,k,maxnumdigits; if not(type(str,string)) then ERROR("only strings can be converted") fi; n := length(str); k := length(PossibilityString); maxnumdigits := trunc(evalf(log[10](k-1)))+1; add(charcode(substring(str,i..i))* (10^maxnumdigits)^(n-i),i=1..n); end; Zio2I0kkc3RyRzYiNiZJIm5HRiVJImlHRiVJImtHRiVJLW1heG51bWRpZ2l0c0dGJUYlRiVDJ0AkNC1JJXR5cGVHJSpwcm90ZWN0ZWRHNiRGJEknc3RyaW5nR0YwLUkmRVJST1JHRjA2I1E+b25seX5zdHJpbmdzfmNhbn5iZX5jb252ZXJ0ZWRGJT5GJy1JJ2xlbmd0aEdGMEYjPkYpLUY5NiNJMlBvc3NpYmlsaXR5U3RyaW5nR0YlPkYqLCYtSSZ0cnVuY0dGMDYjLUkmZXZhbGZHRjA2Iy0mSSRsb2dHRiU2IyIjNTYjLCZGKSIiIkZNISIiRk1GTUZNLUkkYWRkR0YwNiQqJi1JKWNoYXJjb2RlR0YlNiMtSSpzdWJzdHJpbmdHRjA2JEYkO0YoRihGTSkpRkpGKiwmRidGTUYoRk5GTS9GKDtGTUYnRiVGJUYl str := "Hello"; USZIZWxsbzYi charcode(substring(str,1..1)); IiNb nstr := convert(str,Block); Iis5NjYvWw== for i from 1 to length(str) do convert(substring(str,i..i),Block); od; IiNb IiIl IiM2 IiM2 IiM5 48*10^8 + 4*10^6 + 11*10^4 + 11*10^2 + 14; Iis5NjYvWw== `convert/Blockstring` := proc(n) local k, maxnumdigits,i,result; if (not(type(n,integer))) then ERROR("only integers can be converted") fi; #Base of recursion -- n=0 is the null string if n=0 then RETURN(""); fi; k := length(PossibilityString); #Compute width (in digits) of a typical character. maxnumdigits := trunc(evalf(log[10](k-1)))+1; #Get the last few digits.... the last character's index. i := n mod 10^maxnumdigits; #Paste it onto the rest of the answer result := cat(convert(iquo(n, 10^maxnumdigits),Blockstring), substring(PossibilityString, (i+1)..(i+1))); end; Zio2I0kibkc2IjYmSSJrR0YlSS1tYXhudW1kaWdpdHNHRiVJImlHRiVJJ3Jlc3VsdEdGJUYlRiVDKEAkNC1JJXR5cGVHJSpwcm90ZWN0ZWRHNiRGJEkoaW50ZWdlckdGMC1JJkVSUk9SR0YwNiNRP29ubHl+aW50ZWdlcnN+Y2FufmJlfmNvbnZlcnRlZEYlQCQvRiQiIiEtSSdSRVRVUk5HRjA2I1EhRiU+RictSSdsZW5ndGhHRjA2I0kyUG9zc2liaWxpdHlTdHJpbmdHRiU+RigsJi1JJnRydW5jR0YwNiMtSSZldmFsZkdGMDYjLSZJJGxvZ0c2JEYwSShfc3lzbGliR0YlNiMiIzU2IywmRiciIiJGVCEiIkZURlRGVD5GKS1JJG1vZEdGJTYkRiQpRlFGKD5GKi1JJGNhdEdGMDYkLUkoY29udmVydEdGMDYkLUklaXF1b0dGMEZZSSxCbG9ja3N0cmluZ0dGJS1JKnN1YnN0cmluZ0dGMDYkRkI7LCZGKUZURlRGVEZjb0YlRiVGJQ== convert(nstr,Blockstring); USZIZWxsbzYi myrand := rand(10^100): myrand(); Il9xKCopUShmYUQoenJMI3ouOmpmVS1FNSRcODZoM0opZnZ0QkUjKVEkZSsnSCIqenlNay54M3dDXWdM convert(%,Blockstring); UVM3VEp5X2ktZFg4Kz08M1RmXSx8aHIweCopU11rJ2xsOHxncmswY0JTV3BkPXgucnw8ek5TKjp8PDYi convert(%,Block); Il9xKCopUShmYUQoenJMI3ouOmpmVS1FNSRcODZoM0opZnZ0QkUjKVEkZSsnSCIqenlNay54M3dDXWdM length(%); IiQrIg==
<Text-field style="Heading 3" italic="false" size="18" layout="Heading 3"><Font italic="false" size="18">RSA Algorithms</Font></Text-field> RandPrime := proc(myrand) # # Inputs: # myrand is a random number generator. # RandPrime is a random number, that is very likely prime. # local p; p := myrand(); while not isprime(p) do p := myrand() od; RETURN(p); end; Zio2I0knbXlyYW5kRzYiNiNJInBHRiVGJUYlQyU+RictRiRGJT8oRiUiIiJGLEYlNC1JKGlzcHJpbWVHRiVGJkYpLUknUkVUVVJORyUqcHJvdGVjdGVkR0YmRiVGJUYl GenerateKey := proc(k::posint,n::name,e::name,d::name) # # Generate Key to be used in the RSA Public Key Cryptosystem. # The Encryption key is the pair of integers (e,n). # The Decryption key is the pair of integers (d,n). # # Inputs: # k is a positve integer. # Outputs: (must be names passed in quotes). # n = pq is the product of two random prime numbers <= k. n is 2*k digits. # e is a random number, in the range [1..phi(n)-1], relatively prime to phi(n). # d is the multiplicative inverse of e mod phi(n). # local kp,np,p,q,nphi,te,myrand; # Create psuedo-random number generator. myrand := rand(1..10^k-1); # Generate distinct random prime numbers p and q in the range [1..k]. p := RandPrime(myrand); q := RandPrime(myrand); np := p*q; while (p = q) or (np > 10^(2*k)) or (np < 75*10^(2*k-2)) do p := RandPrime(myrand); q := RandPrime(myrand); np := p*q; end do; # Compute phi(n) where n = pq. nphi := (p-1)*(q-1); # Compute a random number e, in the range [1..phi(n)-1], with gcd(n,phi(n)) = 1. myrand := rand(1..nphi-1); te := myrand(); while not igcd(te,nphi) = 1 do te := myrand() end do; # Return output varaibles n := np; e := te; d := (1/te) mod nphi; end; Zio2JidJImtHNiJJJ3Bvc2ludEclKnByb3RlY3RlZEcnSSJuR0YmSSVuYW1lR0YoJ0kiZUdGJkYrJ0kiZEdGJkYrNilJI2twR0YmSSNucEdGJkkicEdGJkkicUdGJkklbnBoaUdGJkkjdGVHRiZJJ215cmFuZEdGJkYmRiZDLj5GNy1JJXJhbmRHNiRGKEkoX3N5c2xpYkdGJjYjOyIiIiwmKSIjNUYlRkBGQCEiIj5GMy1JKlJhbmRQcmltZUdGJjYjRjc+RjRGRj5GMiomRjNGQEY0RkA/KEYmRkBGQEYmNTUvRjNGNDIpRkMsJComIiIjRkBGJUZARkBGMjJGMiwkKiYiI3ZGQClGQywmRlNGQEZURkRGQEZAQyVGRUZJRko+RjUqJiwmRjNGQEZARkRGQCwmRjRGQEZARkRGQD5GNy1GOzYjO0ZALCZGNUZARkBGRD5GNi1GN0YmPyhGJkZARkBGJjQvLUklaWdjZEdGKDYkRjZGNUZARl9vPkYqRjI+Ri1GNj5GLy1JJG1vZEdGJjYkKiRGNkZERjVGJkYmRiY= Blocki := proc(M,k) # # Convert an integer into a list of digits base 10^k. # Inputs: # M is a positive integer and k is an integer. # Block = the list [L1..Ln], where M = sum(Li*10^(n-i),i=1..n), and # 0 <= L[i] < 10^k. # local L,Mp; L := []; Mp := M; while Mp <> 0 do L := [irem(Mp,10^k,'Mp'),op(L)]; od; RETURN(L); end; Zio2JEkiTUc2Ikkia0dGJTYkSSJMR0YlSSNNcEdGJUYlRiVDJj5GKDciPkYpRiQ/KEYlIiIiRi9GJTBGKSIiIT5GKDckLUklaXJlbUclKnByb3RlY3RlZEc2JUYpKSIjNUYmLkYpLUkjb3BHRjY2I0YoLUknUkVUVVJOR0Y2Rj1GJUYlRiU= Unblocki := proc(L,k) # # Convert a list of integers into an integer. # Inputs: # L = [L1..Ln] is a list of integers, with 0 <= Li < 10^k. # k is a positve integer. # Outputs: # Unblock is an integer = sum(L[i]*10^(n-i),i=1..n). # local i,n; n := nops(L); RETURN(sum(L[i]*10^(k*(n - i)),i=1..n)); end; Zio2JEkiTEc2Ikkia0dGJTYkSSJpR0YlSSJuR0YlRiVGJUMkPkYpLUklbm9wc0clKnByb3RlY3RlZEc2I0YkLUknUkVUVVJOR0YuNiMtSSRzdW1HRiU2JComJkYkNiNGKCIiIikiIzUqJkYmRjksJkYpRjlGKCEiIkY5RjkvRig7RjlGKUYlRiVGJQ== Crypt := proc(L,e,n) # # Encrypt or Decrypt using the RSA Public Key cryptosystem. # Inputs: # L = [L1..Ln] is a list of integers, with 0 <= Li < n. # e and n are non-negative integer. # Outputs: # Crypt is the list = [M1..Mn], where Mi = Power(Li,e) mod n. # map((x,e,n) -> Power(x,e) mod n,L,e,n); end; Zio2JUkiTEc2IkkiZUdGJUkibkdGJUYlRiVGJS1JJG1hcEclKnByb3RlY3RlZEc2JmYqNiVJInhHRiVGJkYnRiU2JEkpb3BlcmF0b3JHRiVJJmFycm93R0YlRiUtSSRtb2RHRiU2JC1JJlBvd2VyR0YlNiRGLkYmRidGJUYlRiVGJEYmRidGJUYlRiU= GenerateKey(2,'n','e','d'); IiViXw== n; IiVqdw== Encrypt := proc(str,e,n) local nstr, M, C, ncstr, k; nstr := convert(str,Block); k := length(n); M := Blocki(nstr,k); C := Crypt(M,e,n); ncstr := Unblocki(C,k); return convert(ncstr,Blockstring); end; Zio2JUkkc3RyRzYiSSJlR0YlSSJuR0YlNidJJW5zdHJHRiVJIk1HRiVJIkNHRiVJJm5jc3RyR0YlSSJrR0YlRiVGJUMoPkYpLUkoY29udmVydEclKnByb3RlY3RlZEc2JEYkSSZCbG9ja0dGJT5GLS1JJ2xlbmd0aEdGMjYjRic+RiotSSdCbG9ja2lHRiU2JEYpRi0+RistSSZDcnlwdEdGJTYlRipGJkYnPkYsLUkpVW5ibG9ja2lHRiU2JEYrRi1PLUYxNiRGLEksQmxvY2tzdHJpbmdHRiVGJUYlRiU=
<Text-field style="Heading 1" layout="Heading 1">Question 2 [10 points] (Break RSA)</Text-field> In this question you have access to someone's public key (e,n) and you are to determine the secret key (d,n) and use the secret key to decypher the given ciphertext. restart;
<Text-field style="Heading 1" layout="Heading 1">RSA Implementation</Text-field>
<Text-field style="Heading 1" layout="Heading 1">Converting between Strings and Integers</Text-field> In order to implement the RSA algorithm, we need to be able to convert between strings and integers. The following procedures do this. The conversion is one to one and onto, so that every string is an integer and every integer is a string. Here are the allowed characters. Note that there are exactly 100 (this requires the inclusion of some non-printable characters like escape = \134e). The reason for including exactly 100 characters is to ensure that every encrypted message can be printed as a string. We convert back and forth between strings and integers by writing each character as a two digit number and concatentating them together. PossibilityString := "abcdefghijklmnopqrstuvwxyz0123456789!.,? ABCDEFGHIJKLMNOPQRSTUVWXYZ@#$%^&*()_-+={[}]~\134"\134'\134`:;></|\134\134\134a\134b\134e\134n\134t"; #Procedure to return the code of an string consisting of a single character #surrounded by back quotes. charcode := proc(chr) local n,i; option remember; n := length(PossibilityString); for i to n while substring(PossibilityString,i..i) <> chr do od; if i>n then ERROR(`unable to find`,chr,` in lookup table`); else RETURN(i-1); fi; end; UV9xYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IS4sP35BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWkAjJCVeJiooKV8tKz18ZnJbfGhyXXxpciInYDo7PjwvfGdyXHwofCl8PHwrfCo2Ig== Zio2I0kkY2hyRzYiNiRJIm5HRiVJImlHRiU2I0kpcmVtZW1iZXJHRiVGJUMlPkYnLUknbGVuZ3RoRyUqcHJvdGVjdGVkRzYjSTJQb3NzaWJpbGl0eVN0cmluZ0dGJT8oRigiIiJGM0YnMC1JKnN1YnN0cmluZ0dGLzYkRjE7RihGKEYkRiVAJTJGJ0YoLUkmRVJST1JHRi82JUkvdW5hYmxlfnRvfmZpbmRHRiVGJEkxfmlufmxvb2t1cH50YWJsZUdGJS1JJ1JFVFVSTkdGLzYjLCZGKEYzRjMhIiJGJUYlRiU= length(PossibilityString); IiQrIg== charcode("\134t"); IiMqKg== charcode("a"); IiIh charcode("P"); IiNj PossibilityString[1]; USJhNiI= PossibilityString[75]; USIoNiI= #Procedure to return an integer corresponding to the character string str. `convert/Block` := proc(str) local n,i,k,maxnumdigits; if not(type(str,string)) then ERROR("only strings can be converted") fi; n := length(str); k := length(PossibilityString); maxnumdigits := trunc(evalf(log[10](k-1)))+1; add(charcode(substring(str,i..i))* (10^maxnumdigits)^(n-i),i=1..n); end; Zio2I0kkc3RyRzYiNiZJIm5HRiVJImlHRiVJImtHRiVJLW1heG51bWRpZ2l0c0dGJUYlRiVDJ0AkNC1JJXR5cGVHJSpwcm90ZWN0ZWRHNiRGJEknc3RyaW5nR0YwLUkmRVJST1JHRjA2I1E+b25seX5zdHJpbmdzfmNhbn5iZX5jb252ZXJ0ZWRGJT5GJy1JJ2xlbmd0aEdGMEYjPkYpLUY5NiNJMlBvc3NpYmlsaXR5U3RyaW5nR0YlPkYqLCYtSSZ0cnVuY0dGMDYjLUkmZXZhbGZHRjA2Iy0mSSRsb2dHRiU2IyIjNTYjLCZGKSIiIkZNISIiRk1GTUZNLUkkYWRkR0YwNiQqJi1JKWNoYXJjb2RlR0YlNiMtSSpzdWJzdHJpbmdHRjA2JEYkO0YoRihGTSkpRkpGKiwmRidGTUYoRk5GTS9GKDtGTUYnRiVGJUYl str := "Hello"; USZIZWxsbzYi charcode(substring(str,1..1)); IiNb nstr := convert(str,Block); Iis5NjYvWw== for i from 1 to length(str) do convert(substring(str,i..i),Block); od; IiNb IiIl IiM2 IiM2 IiM5 48*10^8 + 4*10^6 + 11*10^4 + 11*10^2 + 14; Iis5NjYvWw== `convert/Blockstring` := proc(n) local k, maxnumdigits,i,result; if (not(type(n,integer))) then ERROR("only integers can be converted") fi; #Base of recursion -- n=0 is the null string if n=0 then RETURN(""); fi; k := length(PossibilityString); #Compute width (in digits) of a typical character. maxnumdigits := trunc(evalf(log[10](k-1)))+1; #Get the last few digits.... the last character's index. i := n mod 10^maxnumdigits; #Paste it onto the rest of the answer result := cat(convert(iquo(n, 10^maxnumdigits),Blockstring), substring(PossibilityString, (i+1)..(i+1))); end; Zio2I0kibkc2IjYmSSJrR0YlSS1tYXhudW1kaWdpdHNHRiVJImlHRiVJJ3Jlc3VsdEdGJUYlRiVDKEAkNC1JJXR5cGVHJSpwcm90ZWN0ZWRHNiRGJEkoaW50ZWdlckdGMC1JJkVSUk9SR0YwNiNRP29ubHl+aW50ZWdlcnN+Y2FufmJlfmNvbnZlcnRlZEYlQCQvRiQiIiEtSSdSRVRVUk5HRjA2I1EhRiU+RictSSdsZW5ndGhHRjA2I0kyUG9zc2liaWxpdHlTdHJpbmdHRiU+RigsJi1JJnRydW5jR0YwNiMtSSZldmFsZkdGMDYjLSZJJGxvZ0c2JEYwSShfc3lzbGliR0YlNiMiIzU2IywmRiciIiJGVCEiIkZURlRGVD5GKS1JJG1vZEdGJTYkRiQpRlFGKD5GKi1JJGNhdEdGMDYkLUkoY29udmVydEdGMDYkLUklaXF1b0dGMEZZSSxCbG9ja3N0cmluZ0dGJS1JKnN1YnN0cmluZ0dGMDYkRkI7LCZGKUZURlRGVEZjb0YlRiVGJQ== convert(nstr,Blockstring); USZIZWxsbzYi myrand := rand(10^100): myrand(); Il9xKCopUShmYUQoenJMI3ouOmpmVS1FNSRcODZoM0opZnZ0QkUjKVEkZSsnSCIqenlNay54M3dDXWdM convert(%,Blockstring); UVM3VEp5X2ktZFg4Kz08M1RmXSx8aHIweCopU11rJ2xsOHxncmswY0JTV3BkPXgucnw8ek5TKjp8PDYi convert(%,Block); Il9xKCopUShmYUQoenJMI3ouOmpmVS1FNSRcODZoM0opZnZ0QkUjKVEkZSsnSCIqenlNay54M3dDXWdM length(%); IiQrIg==
<Text-field style="Heading 3" italic="false" size="18" layout="Heading 3"><Font italic="false" size="18">RSA Algorithms</Font></Text-field> RandPrime := proc(myrand) # # Inputs: # myrand is a random number generator. # RandPrime is a random number, that is very likely prime. # local p; p := myrand(); while not isprime(p) do p := myrand() od; RETURN(p); end; Zio2I0knbXlyYW5kRzYiNiNJInBHRiVGJUYlQyU+RictRiRGJT8oRiUiIiJGLEYlNC1JKGlzcHJpbWVHRiVGJkYpLUknUkVUVVJORyUqcHJvdGVjdGVkR0YmRiVGJUYl GenerateKey := proc(k::posint,n::name,e::name,d::name) # # Generate Key to be used in the RSA Public Key Cryptosystem. # The Encryption key is the pair of integers (e,n). # The Decryption key is the pair of integers (d,n). # # Inputs: # k is a positve integer. # Outputs: (must be names passed in quotes). # n = pq is the product of two random prime numbers <= k. n is 2*k digits. # e is a random number, in the range [1..phi(n)-1], relatively prime to phi(n). # d is the multiplicative inverse of e mod phi(n). # local kp,np,p,q,nphi,te,myrand; # Create psuedo-random number generator. myrand := rand(1..10^k-1); # Generate distinct random prime numbers p and q in the range [1..k]. p := RandPrime(myrand); q := RandPrime(myrand); np := p*q; while (p = q) or (np > 10^(2*k)) or (np < 75*10^(2*k-2)) do p := RandPrime(myrand); q := RandPrime(myrand); np := p*q; end do; # Compute phi(n) where n = pq. nphi := (p-1)*(q-1); # Compute a random number e, in the range [1..phi(n)-1], with gcd(n,phi(n)) = 1. myrand := rand(1..nphi-1); te := myrand(); while not igcd(te,nphi) = 1 do te := myrand() end do; # Return output varaibles n := np; e := te; d := (1/te) mod nphi; end; Zio2JidJImtHNiJJJ3Bvc2ludEclKnByb3RlY3RlZEcnSSJuR0YmSSVuYW1lR0YoJ0kiZUdGJkYrJ0kiZEdGJkYrNilJI2twR0YmSSNucEdGJkkicEdGJkkicUdGJkklbnBoaUdGJkkjdGVHRiZJJ215cmFuZEdGJkYmRiZDLj5GNy1JJXJhbmRHNiRGKEkoX3N5c2xpYkdGJjYjOyIiIiwmKSIjNUYlRkBGQCEiIj5GMy1JKlJhbmRQcmltZUdGJjYjRjc+RjRGRj5GMiomRjNGQEY0RkA/KEYmRkBGQEYmNTUvRjNGNDIpRkMsJComIiIjRkBGJUZARkBGMjJGMiwkKiYiI3ZGQClGQywmRlNGQEZURkRGQEZAQyVGRUZJRko+RjUqJiwmRjNGQEZARkRGQCwmRjRGQEZARkRGQD5GNy1GOzYjO0ZALCZGNUZARkBGRD5GNi1GN0YmPyhGJkZARkBGJjQvLUklaWdjZEdGKDYkRjZGNUZARl9vPkYqRjI+Ri1GNj5GLy1JJG1vZEdGJjYkKiRGNkZERjVGJkYmRiY= Blocki := proc(M,k) # # Convert an integer into a list of digits base 10^k. # Inputs: # M is a positive integer and k is an integer. # Block = the list [L1..Ln], where M = sum(Li*10^(n-i),i=1..n), and # 0 <= L[i] < 10^k. # local L,Mp; L := []; Mp := M; while Mp <> 0 do L := [irem(Mp,10^k,'Mp'),op(L)]; od; RETURN(L); end; Zio2JEkiTUc2Ikkia0dGJTYkSSJMR0YlSSNNcEdGJUYlRiVDJj5GKDciPkYpRiQ/KEYlIiIiRi9GJTBGKSIiIT5GKDckLUklaXJlbUclKnByb3RlY3RlZEc2JUYpKSIjNUYmLkYpLUkjb3BHRjY2I0YoLUknUkVUVVJOR0Y2Rj1GJUYlRiU= Unblocki := proc(L,k) # # Convert a list of integers into an integer. # Inputs: # L = [L1..Ln] is a list of integers, with 0 <= Li < 10^k. # k is a positve integer. # Outputs: # Unblock is an integer = sum(L[i]*10^(n-i),i=1..n). # local i,n; n := nops(L); RETURN(sum(L[i]*10^(k*(n - i)),i=1..n)); end; Zio2JEkiTEc2Ikkia0dGJTYkSSJpR0YlSSJuR0YlRiVGJUMkPkYpLUklbm9wc0clKnByb3RlY3RlZEc2I0YkLUknUkVUVVJOR0YuNiMtSSRzdW1HRiU2JComJkYkNiNGKCIiIikiIzUqJkYmRjksJkYpRjlGKCEiIkY5RjkvRig7RjlGKUYlRiVGJQ== Crypt := proc(L,e,n) # # Encrypt or Decrypt using the RSA Public Key cryptosystem. # Inputs: # L = [L1..Ln] is a list of integers, with 0 <= Li < n. # e and n are non-negative integer. # Outputs: # Crypt is the list = [M1..Mn], where Mi = Power(Li,e) mod n. # map((x,e,n) -> Power(x,e) mod n,L,e,n); end; Zio2JUkiTEc2IkkiZUdGJUkibkdGJUYlRiVGJS1JJG1hcEclKnByb3RlY3RlZEc2JmYqNiVJInhHRiVGJkYnRiU2JEkpb3BlcmF0b3JHRiVJJmFycm93R0YlRiUtSSRtb2RHRiU2JC1JJlBvd2VyR0YlNiRGLkYmRidGJUYlRiVGJEYmRidGJUYlRiU= GenerateKey(2,'n','e','d'); IiViXw== n; IiVqdw== Encrypt := proc(str,e,n) local nstr, M, C, ncstr, k; nstr := convert(str,Block); k := length(n); M := Blocki(nstr,k); C := Crypt(M,e,n); ncstr := Unblocki(C,k); return convert(ncstr,Blockstring); end; Zio2JUkkc3RyRzYiSSJlR0YlSSJuR0YlNidJJW5zdHJHRiVJIk1HRiVJIkNHRiVJJm5jc3RyR0YlSSJrR0YlRiVGJUMoPkYpLUkoY29udmVydEclKnByb3RlY3RlZEc2JEYkSSZCbG9ja0dGJT5GLS1JJ2xlbmd0aEdGMjYjRic+RiotSSdCbG9ja2lHRiU2JEYpRi0+RistSSZDcnlwdEdGJTYlRipGJkYnPkYsLUkpVW5ibG9ja2lHRiU2JEYrRi1PLUYxNiRGLEksQmxvY2tzdHJpbmdHRiVGJUYlRiU=
n := 7660667891964681342229581758160298975411; Ikk2YSgqKUhnImU8ZUhBTSJvaz4qeW1ndw== e := 2875500547395035340238947036342505627883; IkkkKXlpMERNT3ElKlEtTU5dUlowXXZH M := 69669548359529679781650615597066177196185738199745639131420950990573260278118717622652531058841194062768039872058123833775722218323582960397436168267080882452592275074849411940891942644526924645144547725713709975699114450009037741862855388901707656748620863217721391457148399840474989331303396267238231548502126647286097; IltfbCg0J0dabTctJls6QlFzRSdSLjhMKilcWlMpKlJbclgiUkB4QGozaVtubDI8ISopUWJHJz11UCE0K1g5Iipwdio0UHJEeGFXXmtDcF9XRSU+KjMlPlRcWzJ2QWZfQykzM24jb2hWKFJnSGVCJD1Bc3ZQJFE3ZT8oKVIhb0YxJT5UKWU1YF9FaTwoPSJ5LUV0MCo0JjRVSiJSY3UqPlFkPSc+eGgxKGY6MWwieXonSCZmJFsmcCdw cstr := convert(M,Blockstring); UVt1JFp8KEg5fCgzQHw8W1lncFMlWnJefClzUSx0fDxFVzw1QmpKfCpmKjBjK2xgclYwTE1rUnxpcmxcZzEjZHwrJmZbeF0uKSZ3czY5fGhyfClkfDxDVSMwJXxmcjp5TFN3KWhISUF0fjt0QlhFMC9GRW9FRyZRbiV8KikkPG9FYWpkLUEnMk8sO2IlX1AoJ3UnNnImbjxFXkg/fCt+R0k7N25kP1ZAeHxocjVOImNtWkcyVHw8NiI=
<Text-field style="Heading 1" layout="Heading 1">Question 3 [20 points] (Chinese Remainder Theorem)</Text-field> Exercise 4.11 from the text - use Maple's chrem command and then implement algorithm 4.5 to perform the computation. Note that in algorithm 4.5 you do not have to implement INVERSE - you can simply use Maple to compute the modular inverse. Also do exercises 4.15 and 4.16.
<Text-field style="Heading 1" layout="Heading 1">Question 4 [15 points] (Implement Block Cypher using Hill)</Text-field> Using block length 8 implement a block cypher using a Hill cypher for each block. You will write two Maple procedures: 1) one to encypher strings of length equal to the block size, and 2) one that encyphers strings of arbitrary length by applying the first procedure to consecutive substrings of length equal to the block size. Note that if the length of the string is not a multiple of the block size, then you will need to pad the string with extra blanks. restart; with(LinearAlgebra): with(StringTools): Letter2Number := proc(str,Convert) local i, L; L := []; for i from StringTools:-Length(str) by -1 to 1 do L := [Convert[str[i]],op(L)]; end do; return L; end; Zio2JEkkc3RyRzYiSShDb252ZXJ0R0YlNiRJImlHRiVJIkxHRiVGJUYlQyU+Rik3Ij8oRigtX0ksU3RyaW5nVG9vbHNHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHRiVJJ0xlbmd0aEdGJTYjRiQhIiIiIiJJJXRydWVHRjI+Rik3JCZGJjYjJkYkNiNGKC1JI29wR0YyNiNGKU9GKUYlRiVGJQ== Number2Letter := proc(L,alphabet) local i, str; str := ""; for i from 1 to nops(L) do str := cat(alphabet[L[i]+1],str); end do; return StringTools:-Reverse(str); end; Zio2JEkiTEc2IkkpYWxwaGFiZXRHRiU2JEkiaUdGJUkkc3RyR0YlRiVGJUMlPkYpUSFGJT8oRigiIiJGLi1JJW5vcHNHJSpwcm90ZWN0ZWRHNiNGJEkldHJ1ZUdGMT5GKS1JJGNhdEdGMTYkJkYmNiMsJiZGJDYjRihGLkYuRi5GKU8tX0ksU3RyaW5nVG9vbHNHNiRGMUkoX3N5c2xpYkdGJUkoUmV2ZXJzZUdGJTYjRilGJUYlRiU= alphabet := cat(Iota("a".."z")," "); UTxhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5en42Ig== Convert := table(); PTYiSSZmYWxzZUclKnByb3RlY3RlZEdFXFtsIQ== for i from 1 to Length(alphabet) do Convert[alphabet[i]] := i-1; end do: 1) Find an invertible matrix of dimension 8 with entries in LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUklbXN1YkdGJDYlLUkjbWlHRiQ2JVEoJiM4NDg0O0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GIzYkLUkjbW5HRiQ2JFEjMjdGJy9GNlEnbm9ybWFsRidGPi8lL3N1YnNjcmlwdHNoaWZ0R1EiMEYnLUkjbW9HRiQ2LVEiLkYnRj4vJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRkkvJSlzdHJldGNoeUdGSS8lKnN5bW1ldHJpY0dGSS8lKGxhcmdlb3BHRkkvJS5tb3ZhYmxlbGltaXRzR0ZJLyUnYWNjZW50R0ZJLyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGWC1GRDYtUSJ+RidGPkZHRkpGTEZORlBGUkZURlZGWUZlbkY+Find its inverse and verify that multiplying the first matrix by its inverse returns the identity matrix of size 8. Do not forget to reduce mod 27. Implement a Maple procedure, HillCypher, which takes as input an invertible LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUkjbWlHRiQ2JVEibkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RKCZ0aW1lcztGJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EsMC4yMjIyMjIyZW1GJy8lJ3JzcGFjZUdGTEYrLUY2Ni1RIn5GJ0Y5RjtGPkZARkJGREZGRkgvRktRJjAuMGVtRicvRk5GU0Y5matrix and a string of length LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2JVEibkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIi5GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGTEY5 The matrix should have entries in LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUklbXN1YkdGJDYlLUkjbWlHRiQ2JVEoJiM4NDg0O0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GIzYkLUYvNiVRIm1GJ0YyRjUvRjZRJ25vcm1hbEYnLyUvc3Vic2NyaXB0c2hpZnRHUSIwRictSSNtb0dGJDYtUSIsRidGPS8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGNC8lKXN0cmV0Y2h5R0ZILyUqc3ltbWV0cmljR0ZILyUobGFyZ2VvcEdGSC8lLm1vdmFibGVsaW1pdHNHRkgvJSdhY2NlbnRHRkgvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR1EsMC4zMzMzMzMzZW1GJy1GQzYtUSJ+RidGPUZGL0ZKRkhGS0ZNRk9GUUZTRlUvRllGV0Y9where LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbWlHRiQ2JVEibUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy9GM1Enbm9ybWFsRic= is the length of the alphabet from which the string was encoded. You may assume that the above alphabet is used and hence may use the functions Letter2Number and Number2Letter. HillCypher := proc(A,str) end; Zio2JEkiQUc2Ikkkc3RyR0YlRiVGJUYlRiVGJUYlRiU= Test your function by encyphering and decyphering some sample strings. Implement a Maple function that encyphers and decyphers strings of arbitrary length using the function HillCypher to encypher and decypher consecutive substrings whose length is equal to the blocksize.
<Text-field style="Heading 1" layout="Heading 1">Question 5 [15 points] (Breaking a Hill Cypher given the Black Box)</Text-field> In this question you have captured a encryption function called BlackBox. You believe that the black box uses a Hill Cypher. Your goal is to verify that BlackBox uses a Hill Cypher and use it find the matrix used in the Hill cypher. This will enable you to decrypt the following string: LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2JVEhRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbXNHRiQ2I1FBY2N1eGplYWN5cWVzeWR1a296dGx0cG1ucW11enp1fnZGJ0YrL0YzUSdub3JtYWxGJw== restart; with(LinearAlgebra): with(StringTools): Letter2Number := proc(str,Convert) local i, L; L := []; for i from StringTools:-Length(str) by -1 to 1 do L := [Convert[str[i]],op(L)]; end do; return L; end; Zio2JEkkc3RyRzYiSShDb252ZXJ0R0YlNiRJImlHRiVJIkxHRiVGJUYlQyU+Rik3Ij8oRigtX0ksU3RyaW5nVG9vbHNHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHRiVJJ0xlbmd0aEdGJTYjRiQhIiIiIiJJJXRydWVHRjI+Rik3JCZGJjYjJkYkNiNGKC1JI29wR0YyNiNGKU9GKUYlRiVGJQ== Number2Letter := proc(L,alphabet) local i, str; str := ""; for i from 1 to nops(L) do str := cat(alphabet[L[i]+1],str); end do; return StringTools:-Reverse(str); end; Zio2JEkiTEc2IkkpYWxwaGFiZXRHRiU2JEkiaUdGJUkkc3RyR0YlRiVGJUMlPkYpUSFGJT8oRigiIiJGLi1JJW5vcHNHJSpwcm90ZWN0ZWRHNiNGJEkldHJ1ZUdGMT5GKS1JJGNhdEdGMTYkJkYmNiMsJiZGJDYjRihGLkYuRi5GKU8tX0ksU3RyaW5nVG9vbHNHNiRGMUkoX3N5c2xpYkdGJUkoUmV2ZXJzZUdGJTYjRilGJUYlRiU= alphabet := cat(Iota("a".."z")," "); UTxhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5en42Ig== Convert := table(); PTYiSSZmYWxzZUclKnByb3RlY3RlZEdFXFtsIQ== for i from 1 to Length(alphabet) do Convert[alphabet[i]] := i-1; end do: standardbasis := proc(n,i) local V; V := Vector(n); V[i] := 1; return V; end; Zio2JEkibkc2IkkiaUdGJTYjSSJWR0YlRiVGJUMlPkYoLUknVmVjdG9yR0YlNiNGJD4mRig2I0YmIiIiT0YoRiVGJUYl BlackBox is a maple function that takes a vector as input and returns a vector. It assumes that the input vector has size equal to a power of two and that the elements of the vector are in LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUklbXN1YkdGJDYlLUkjbWlHRiQ2JVEoJiM4NDg0O0YnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GIzYkLUkjbW5HRiQ2JFEjMjdGJy9GNlEnbm9ybWFsRidGPi8lL3N1YnNjcmlwdHNoaWZ0R1EiMEYnRj4= and correspond to our normal numeric coding of strings. Your goal is to figure out how to break BlackBox and use it to decrypt the following cyphertext. cypher := "ccuxjeacyqesydukoztltpmnqmuzzu v"; UUFjY3V4amVhY3lxZXN5ZHVrb3p0bHRwbW5xbXV6enV+djYi BlackBox := proc(M) local n, m, C1, C2; n := Dimension(M); m := n/2; if (n = 2) then return <18*M[1] + 22*M[2] mod 27,17*M[1]+20*M[2] mod 27>; else C1 := BlackBox(M[1..m]); C2 := BlackBox(M[m+1..n]); return <18*C1+22*C2 mod 27,17*C1+20*C2 mod 27>; end if; end; Zio2I0kiTUc2IjYmSSJuR0YlSSJtR0YlSSNDMUdGJUkjQzJHRiVGJUYlQyU+RictX0kuTGluZWFyQWxnZWJyYUc2JCUqcHJvdGVjdGVkR0koX3N5c2xpYkdGJUkqRGltZW5zaW9uR0YlRiM+RigsJComIyIiIiIiI0Y4RidGOEY4QCUvRidGOU8tSSQ8LD5HRiU2JC1JJG1vZEdGJTYkLCYqJiIjPUY4JkYkNiNGOEY4RjgqJiIjQUY4JkYkNiNGOUY4RjgiI0YtRkE2JCwmKiYiIzxGOEZGRjhGOComIiM/RjhGSkY4RjhGTEMlPkYpLUkpQmxhY2tCb3hHRiU2IyZGJDYjO0Y4Rig+RiotRlc2IyZGJDYjOywmRihGOEY4RjhGJ08tRj42JC1GQTYkLCYqJkZFRjhGKUY4RjgqJkZJRjhGKkY4RjhGTC1GQTYkLCYqJkZRRjhGKUY4RjgqJkZTRjhGKkY4RjhGTEYlRiVGJQ== First verify that BlackBox is linear. Then use standardbasis above to find the LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbW5HRiQ2JFEjMzJGJy8lLG1hdGh2YXJpYW50R1Enbm9ybWFsRictSSNtb0dGJDYtUSJ+RidGLy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGOC8lKXN0cmV0Y2h5R0Y4LyUqc3ltbWV0cmljR0Y4LyUobGFyZ2VvcEdGOC8lLm1vdmFibGVsaW1pdHNHRjgvJSdhY2NlbnRHRjgvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZHLUYzNi1RKCZ0aW1lcztGJ0YvRjZGOUY7Rj1GP0ZBRkMvRkZRLDAuMjIyMjIyMmVtRicvRklGTkYrRjJGLw==matrix that corresponds to BlackBox when the input vector is of size 32. Use the matrix you found to break the Hill Cypher and decrypt the above cyphertext.
<Text-field style="Heading 1" layout="Heading 1">Question 6 [15 points] (Breaking a Hill Cypher given Intercepted Messages)</Text-field> In this question you have intercepted a sequence of cyphertext and plaintext blocks corresponding to a Hill cypher of size 8. Your goal is to use this information to construct the matrix corresponding to the Hill cypher and consequently decrypt the following cyphertext: LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2JVEhRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUkjbXNHRiQ2I1Epd2F1d2ttcWdGJy1JI21vR0YkNi1RIi5GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRkEvJSlzdHJldGNoeUdGQS8lKnN5bW1ldHJpY0dGQS8lKGxhcmdlb3BHRkEvJS5tb3ZhYmxlbGltaXRzR0ZBLyUnYWNjZW50R0ZBLyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGUEY9 In the transcript below you have the output from a sequence of calls to HillCypher, but you do not have the matrix LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2JVEiQUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIn5GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGTEY5used by the cypher. You know that the alphabet is our standard alphabet with 27 symbols. restart; with(LinearAlgebra): with(StringTools): Letter2Number := proc(str,Convert) local i, L; L := []; for i from StringTools:-Length(str) by -1 to 1 do L := [Convert[str[i]],op(L)]; end do; return L; end; Zio2JEkkc3RyRzYiSShDb252ZXJ0R0YlNiRJImlHRiVJIkxHRiVGJUYlQyU+Rik3Ij8oRigtX0ksU3RyaW5nVG9vbHNHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHRiVJJ0xlbmd0aEdGJTYjRiQhIiIiIiJJJXRydWVHRjI+Rik3JCZGJjYjJkYkNiNGKC1JI29wR0YyNiNGKU9GKUYlRiVGJQ== Number2Letter := proc(L,alphabet) local i, str; str := ""; for i from 1 to nops(L) do str := cat(alphabet[L[i]+1],str); end do; return StringTools:-Reverse(str); end; Zio2JEkiTEc2IkkpYWxwaGFiZXRHRiU2JEkiaUdGJUkkc3RyR0YlRiVGJUMlPkYpUSFGJT8oRigiIiJGLi1JJW5vcHNHJSpwcm90ZWN0ZWRHNiNGJEkldHJ1ZUdGMT5GKS1JJGNhdEdGMTYkJkYmNiMsJiZGJDYjRihGLkYuRi5GKU8tX0ksU3RyaW5nVG9vbHNHNiRGMUkoX3N5c2xpYkdGJUkoUmV2ZXJzZUdGJTYjRilGJUYlRiU= alphabet := cat(Iota("a".."z")," "); UTxhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5en42Ig== Convert := table(); PTYiSSZmYWxzZUclKnByb3RlY3RlZEdFXFtsIQ== for i from 1 to Length(alphabet) do Convert[alphabet[i]] := i-1; end do: standardbasis := proc(n,i) local V; V := Vector(n); V[i] := 1; return V; end; Zio2JEkibkc2IkkiaUdGJTYjSSJWR0YlRiVGJUMlPkYoLUknVmVjdG9yR0YlNiNGJD4mRig2I0YmIiIiT0YoRiVGJUYl cypher := "wauwkmqg"; USl3YXV3a21xZzYi lstr := "once upon a time you dressed so fine you through the bums a dime in your prime didnt you"; UWRwb25jZX51cG9ufmF+dGltZX55b3V+ZHJlc3NlZH5zb35maW5lfn55b3V+dGhyb3VnaH50aGV+YnVtc35hfmRpbWV+aW5+eW91cn5wcmltZX5kaWRudH55b3U2Ig== Length(lstr); IiMqKQ== Do not reexecute this statement has you do not have A and it will not be able to evaluate. for i from 0 to 7 do str || i := lstr[i*8+1..(i+1)*8]; c ||i := HillCypher(A,str||i); end do; USlvbmNlfnVwbzYi USlmdGx2eWlkeTYi USlufmF+dGltZTYi USllcnN6c2R3ZzYi USl+eW91fmRyZTYi USllc2l+Z25tYjYi USlzc2VkfnNvfjYi USl+eGVtdH54bDYi USlmaW5lfn55bzYi USlmYmZqeXFobTYi USl1fnRocm91ZzYi USlwendhcmJvcDYi USlofnRoZX5idTYi USljdml2cH56aDYi USltc35hfmRpbTYi USl2bnZrcGh5czYi str0 := "once upo"; c0 := "ftlvyidy"; str1 := "n a time"; c1 := "erszsdwg"; USlvbmNlfnVwbzYi USlmdGx2eWlkeTYi USlufmF+dGltZTYi USllcnN6c2R3ZzYi str2 := " you dre"; c2 := "esi gnmb"; str3 := "ssed so "; c3 := " xemt xl"; USl+eW91fmRyZTYi USllc2l+Z25tYjYi USlzc2VkfnNvfjYi USl+eGVtdH54bDYi str4 := "fine yo"; c4 := "fbfjyqhm"; str5 := "u throug"; c5 := "pzwarbop"; USlmaW5lfn55bzYi USlmYmZqeXFobTYi USl1fnRocm91ZzYi USlwendhcmJvcDYi str6 := "h the bu"; c6 := "cvivp zh"; str7 := "ms a dim"; c7 := "vnvkphys"; USlofnRoZX5idTYi USljdml2cH56aDYi USltc35hfmRpbTYi USl2bnZrcGh5czYi Find the numeric vectors corresponding to all of the intercepted plaintext and cyphertext blocks. Verify that the 8 vectors obtained from the plaintext are a basis for the vector space of 8 tuples. Use the above information to construct the matrix that corresponds to the Hill cypher. Hint: Construct the matrix LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbWlHRiQ2JVEiUEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy9GM1Enbm9ybWFsRic= such that LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUklbXN1YkdGJDYlLUkjbWlHRiQ2JVEkc3RyRicvJSdpdGFsaWNHUSV0cnVlRicvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YnLUYjNiQtRi82JVEiaUYnRjJGNS9GNlEnbm9ybWFsRicvJS9zdWJzY3JpcHRzaGlmdEdRIjBGJy1JI21vR0YkNi1RIj1GJ0Y9LyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0ZILyUpc3RyZXRjaHlHRkgvJSpzeW1tZXRyaWNHRkgvJShsYXJnZW9wR0ZILyUubW92YWJsZWxpbWl0c0dGSC8lJ2FjY2VudEdGSC8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRlctSShtc3Vic3VwR0YkNigtRi82JVEjUGVGJ0YyRjVGOC1GIzYkLUkjbW5HRiQ2JFEiOEYnRj1GPS8lMXN1cGVyc2NyaXB0c2hpZnRHRkFGPy9JK21zZW1hbnRpY3NHRiRRLFtub25lLG5vbmVdRidGPQ==LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbW9HRiQ2LVEiLkYnLyUsbWF0aHZhcmlhbnRHUSdub3JtYWxGJy8lJmZlbmNlR1EmZmFsc2VGJy8lKnNlcGFyYXRvckdGNC8lKXN0cmV0Y2h5R0Y0LyUqc3ltbWV0cmljR0Y0LyUobGFyZ2VvcEdGNC8lLm1vdmFibGVsaW1pdHNHRjQvJSdhY2NlbnRHRjQvJSdsc3BhY2VHUSYwLjBlbUYnLyUncnNwYWNlR0ZDRi8= Let LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2JVEiQUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIn5GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGTEY5be the unknown matrix, then LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYpLUklbXN1cEdGJDYlLUkjbWlHRiQ2JVEiUEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GIzYlLUkjbW9HRiQ2LVEqJnVtaW51czA7RicvRjZRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0ZCLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRLDAuMjIyMjIyMmVtRicvJSdyc3BhY2VHRlEtSSNtbkdGJDYkUSIxRidGPkY+LyUxc3VwZXJzY3JpcHRzaGlmdEdRIjBGJy1JJW1zdWJHRiQ2JS1GLzYlUSJjRidGMkY1LUYjNiQtRi82JVEiaUYnRjJGNUY+LyUvc3Vic2NyaXB0c2hpZnRHRlotRjs2LVEiPUYnRj5GQEZDRkVGR0ZJRktGTS9GUFEsMC4yNzc3Nzc4ZW1GJy9GU0Zmby1JKG1mZW5jZWRHRiQ2JC1GIzYlRistRi82JVEjQVBGJ0YyRjVGPkY+LUkobXN1YnN1cEdGJDYoLUYvNiVRImVGJ0YyRjVGW28tRiM2JC1GVTYkUSI4RidGPkY+RlhGYG8vSSttc2VtYW50aWNzR0YkUSxbbm9uZSxub25lXUYnLUY7Ni1RIixGJ0Y+RkAvRkRGNEZFRkdGSUZLRk0vRlBRJjAuMGVtRicvRlNRLDAuMzMzMzMzM2VtRidGPg== and you can recover the "conjugated" matrix LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUkjbWlHRiQ2JVEiQUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIidGJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EsMC4xMTExMTExZW1GJy8lJ3JzcGFjZUdRJjAuMGVtRictRjY2LVEifkYnRjlGO0Y+RkBGQkZERkZGSC9GS0ZPRk0tRjY2LVEiPUYnRjlGO0Y+RkBGQkZERkZGSC9GS1EsMC4yNzc3Nzc4ZW1GJy9GTkZYRjk=LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUklbXN1cEdGJDYlLUkjbWlHRiQ2JVEiUEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GIzYlLUkjbW9HRiQ2LVEqJnVtaW51czA7RicvRjZRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0ZCLyUpc3RyZXRjaHlHRkIvJSpzeW1tZXRyaWNHRkIvJShsYXJnZW9wR0ZCLyUubW92YWJsZWxpbWl0c0dGQi8lJ2FjY2VudEdGQi8lJ2xzcGFjZUdRLDAuMjIyMjIyMmVtRicvJSdyc3BhY2VHRlEtSSNtbkdGJDYkUSIxRidGPkY+LyUxc3VwZXJzY3JpcHRzaGlmdEdRIjBGJy1GLzYlUSNBUEYnRjJGNUY+ and from LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2JVEiQUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIidGJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EsMC4xMTExMTExZW1GJy8lJ3JzcGFjZUdRJjAuMGVtRidGOQ== you construct LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUkjbWlHRiQ2JVEiQUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIi5GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGTC1GNjYtUSJ+RidGOUY7Rj5GQEZCRkRGRkZIRkpGTUZPRjk=Note that matrix conjugation corresponds to representing the same linear transformation in two different bases, where LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbWlHRiQ2JVEiUEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy9GM1Enbm9ybWFsRic= is the change of basis matrix.
<Text-field style="Heading 1" layout="Heading 1">Question 7 [20 points] (Euler's Criterion)</Text-field> Exercises 6.8, 6.11, and 6.12 from the text. Exercise 6.8) Prove that if LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbWlHRiQ2JVEicEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy9GM1Enbm9ybWFsRic= is prime and if LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUklbXN1cEdGJDYlLUkjbWlHRiQ2JVEiaUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GIzYlLUkjbW5HRiQ2JFEiMkYnL0Y2USdub3JtYWxGJ0YyRjUvJTFzdXBlcnNjcmlwdHNoaWZ0R1EiMEYnLUkjbW9HRiQ2LVEsJkNvbmdydWVudDtGJ0Y+LyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0ZJLyUpc3RyZXRjaHlHRkkvJSpzeW1tZXRyaWNHRkkvJShsYXJnZW9wR0ZJLyUubW92YWJsZWxpbWl0c0dGSS8lJ2FjY2VudEdGSS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRlgtRiw2JS1GLzYlUSJqRidGMkY1RjhGQC1JKG1mZW5jZWRHRiQ2JC1GIzYmLUZENi9RJG1vZEYnLyUlYm9sZEdGNC9GNlElYm9sZEYnLyUrZm9udHdlaWdodEdGZW9GR0ZKRkxGTkZQRlJGVC9GV1EmMC4wZW1GJy9GWkZpby1GRDYtUSJ+RidGPkZHRkpGTEZORlBGUkZURmhvRmpvLUYvNiVRInBGJ0YyRjVGPkY+LUZENi1RIixGJ0Y+RkcvRktGNEZMRk5GUEZSRlRGaG8vRlpRLDAuMzMzMzMzM2VtRidGPg== then LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUkjbWlHRiQ2JVEiaUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RLCZDb25ncnVlbnQ7RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkwtRiw2JVEiakYnRi9GMi1GNjYtUSJ+RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSYwLjBlbUYnL0ZORlZGOQ==or LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYnLUkjbW9HRiQ2LVEqJnVtaW51czA7RicvJSxtYXRodmFyaWFudEdRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y0LyUpc3RyZXRjaHlHRjQvJSpzeW1tZXRyaWNHRjQvJShsYXJnZW9wR0Y0LyUubW92YWJsZWxpbWl0c0dGNC8lJ2FjY2VudEdGNC8lJ2xzcGFjZUdRLDAuMjIyMjIyMmVtRicvJSdyc3BhY2VHRkMtSSNtaUdGJDYlUSJqRicvJSdpdGFsaWNHUSV0cnVlRicvRjBRJ2l0YWxpY0YnLUkobWZlbmNlZEdGJDYkLUYjNiYtRiw2L1EkbW9kRicvJSVib2xkR0ZML0YwUSVib2xkRicvJStmb250d2VpZ2h0R0ZaRjJGNUY3RjlGO0Y9Rj8vRkJRJjAuMGVtRicvRkVGaG4tRiw2LVEifkYnRi9GMkY1RjdGOUY7Rj1GP0ZnbkZpbi1GRzYlUSJwRidGSkZNRi9GLy1GLDYtUSIuRidGL0YyRjVGN0Y5RjtGPUY/RmduRmluRi8= Exercise 6.11) What goes wrong if we try to replace the prime LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbWlHRiQ2JVEicEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy9GM1Enbm9ybWFsRic= in Theorem 6.2 with a composite number LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbWlHRiQ2JVEibkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy9GM1Enbm9ybWFsRic=? Find values of LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbWlHRiQ2JVEiYkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy9GM1Enbm9ybWFsRic= and odd LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbWlHRiQ2JVEibkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy9GM1Enbm9ybWFsRic= which are relatively prime and for which there is a LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbWlHRiQ2JVEidEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy9GM1Enbm9ybWFsRic= such that LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYpLUkjbWlHRiQ2JVEiYkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RLCZDb25ncnVlbnQ7RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkwtSSVtc3VwR0YkNiUtRiw2JVEidEYnRi9GMi1GIzYlLUkjbW5HRiQ2JFEiMkYnRjlGL0YyLyUxc3VwZXJzY3JpcHRzaGlmdEdRIjBGJy1GNjYtUSJ+RidGOUY7Rj5GQEZCRkRGRkZIL0ZLUSYwLjBlbUYnL0ZORlxvLUkobWZlbmNlZEdGJDYkLUYjNiYtRjY2L1EkbW9kRicvJSVib2xkR0YxL0YzUSVib2xkRicvJStmb250d2VpZ2h0R0Zpb0Y7Rj5GQEZCRkRGRkZIRltvRl1vRmhuLUYsNiVRIm5GJ0YvRjJGOUY5LUY2Ni1RIixGJ0Y5RjsvRj9GMUZARkJGREZGRkhGW28vRk5RLDAuMzMzMzMzM2VtRidGOQ== but LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUklbXN1cEdGJDYlLUkjbWlHRiQ2JVEiYkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GIzYlLUkmbWZyYWNHRiQ2KC1JKG1mZW5jZWRHRiQ2JC1GIzYnLUYvNiVRIm5GJ0YyRjUtSSNtb0dGJDYtUSgmbWludXM7RicvRjZRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0ZNLyUpc3RyZXRjaHlHRk0vJSpzeW1tZXRyaWNHRk0vJShsYXJnZW9wR0ZNLyUubW92YWJsZWxpbWl0c0dGTS8lJ2FjY2VudEdGTS8lJ2xzcGFjZUdRLDAuMjIyMjIyMmVtRicvJSdyc3BhY2VHRmZuLUkjbW5HRiQ2JFEiMUYnRklGMkY1RkktRiM2JS1Gam42JFEiMkYnRklGMkY1LyUubGluZXRoaWNrbmVzc0dRIjFGJy8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0Znby8lKWJldmVsbGVkR0ZNRjJGNS8lMXN1cGVyc2NyaXB0c2hpZnRHUSIwRictRkY2LVEvJk5vdENvbmdydWVudDtGJ0ZJRktGTkZQRlJGVEZWRlgvRmVuUSwwLjI3Nzc3NzhlbUYnL0ZobkZjcEZpbi1GPjYkLUYjNiYtRkY2L1EkbW9kRicvJSVib2xkR0Y0L0Y2USVib2xkRicvJStmb250d2VpZ2h0R0ZfcUZLRk5GUEZSRlRGVkZYL0ZlblEmMC4wZW1GJy9GaG5GY3EtRkY2LVEifkYnRklGS0ZORlBGUkZURlZGWEZicUZkcUZCRklGSS1GRjYtUSIuRidGSUZLRk5GUEZSRlRGVkZYRmJxRmRxRkk= Exercise 6.12) Find values of LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbWlHRiQ2JVEiYkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy9GM1Enbm9ybWFsRic= and odd LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYlLUkjbWlHRiQ2JVEibkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RIn5GJy9GM1Enbm9ybWFsRicvJSZmZW5jZUdRJmZhbHNlRicvJSpzZXBhcmF0b3JHRj0vJSlzdHJldGNoeUdGPS8lKnN5bW1ldHJpY0dGPS8lKGxhcmdlb3BHRj0vJS5tb3ZhYmxlbGltaXRzR0Y9LyUnYWNjZW50R0Y9LyUnbHNwYWNlR1EmMC4wZW1GJy8lJ3JzcGFjZUdGTEY5which are relatively prime and for which LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYpLUklbXN1cEdGJDYlLUkjbWlHRiQ2JVEiYkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1GIzYlLUkmbWZyYWNHRiQ2KC1JKG1mZW5jZWRHRiQ2JC1GIzYnLUYvNiVRIm5GJ0YyRjUtSSNtb0dGJDYtUSgmbWludXM7RicvRjZRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0ZNLyUpc3RyZXRjaHlHRk0vJSpzeW1tZXRyaWNHRk0vJShsYXJnZW9wR0ZNLyUubW92YWJsZWxpbWl0c0dGTS8lJ2FjY2VudEdGTS8lJ2xzcGFjZUdRLDAuMjIyMjIyMmVtRicvJSdyc3BhY2VHRmZuLUkjbW5HRiQ2JFEiMUYnRklGMkY1RkktRiM2JS1Gam42JFEiMkYnRklGMkY1LyUubGluZXRoaWNrbmVzc0dRIjFGJy8lK2Rlbm9tYWxpZ25HUSdjZW50ZXJGJy8lKW51bWFsaWduR0Znby8lKWJldmVsbGVkR0ZNRjJGNS8lMXN1cGVyc2NyaXB0c2hpZnRHUSIwRictRkY2LVEsJkNvbmdydWVudDtGJ0ZJRktGTkZQRlJGVEZWRlgvRmVuUSwwLjI3Nzc3NzhlbUYnL0ZobkZjcEZpbi1GRjYtUSJ+RidGSUZLRk5GUEZSRlRGVkZYL0ZlblEmMC4wZW1GJy9GaG5GaXAtRj42JC1GIzYmLUZGNi9RJG1vZEYnLyUlYm9sZEdGNC9GNlElYm9sZEYnLyUrZm9udHdlaWdodEdGZXFGS0ZORlBGUkZURlZGWEZocEZqcEZlcEZCRklGSS1GRjYtUSIsRidGSUZLL0ZPRjRGUEZSRlRGVkZYRmhwL0ZoblEsMC4zMzMzMzMzZW1GJ0ZJ but for which there is no JSFHLUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYkLUkjbWlHRiQ2JVEidEYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy9GM1Enbm9ybWFsRic= such that LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYoLUkjbWlHRiQ2JVEiYkYnLyUnaXRhbGljR1EldHJ1ZUYnLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy1JI21vR0YkNi1RLCZDb25ncnVlbnQ7RicvRjNRJ25vcm1hbEYnLyUmZmVuY2VHUSZmYWxzZUYnLyUqc2VwYXJhdG9yR0Y9LyUpc3RyZXRjaHlHRj0vJSpzeW1tZXRyaWNHRj0vJShsYXJnZW9wR0Y9LyUubW92YWJsZWxpbWl0c0dGPS8lJ2FjY2VudEdGPS8lJ2xzcGFjZUdRLDAuMjc3Nzc3OGVtRicvJSdyc3BhY2VHRkwtSSVtc3VwR0YkNiUtRiw2JVEidEYnRi9GMi1GIzYlLUkjbW5HRiQ2JFEiMkYnRjlGL0YyLyUxc3VwZXJzY3JpcHRzaGlmdEdRIjBGJy1JKG1mZW5jZWRHRiQ2JC1GIzYmLUY2Ni9RJG1vZEYnLyUlYm9sZEdGMS9GM1ElYm9sZEYnLyUrZm9udHdlaWdodEdGY29GO0Y+RkBGQkZERkZGSC9GS1EmMC4wZW1GJy9GTkZnby1GNjYtUSJ+RidGOUY7Rj5GQEZCRkRGRkZIRmZvRmhvLUYsNiVRIm5GJ0YvRjJGOUY5LUY2Ni1RIi5GJ0Y5RjtGPkZARkJGREZGRkhGZm9GaG9GOQ==