0
Polyalphabetic Cipher
Now I’m working on programming a Polyalphabetic cipher. (I moved into a cryptography phase) The big issue is the actual shifting part, as if the length of the message doesn’t evenly divide into groups that are the length of the shift word. For example, if the message was “FREE PIZZA IN THE CAFETERIA”, and the shift word was “COOKIE”, then the shifts would be “COOK IECOO KI ECO OKIECOOKI”. (Cutting off at the end) https://sololearn.com/compiler-playground/ckDWZ76AjDT9/?ref=app
9 Antworten
+ 3
CONTINUE (2/2)
To break it down:
lst[i] = alphabet[lst[i]]
We already know variable lst is a string "COOK IECOO KI ECO OKIECOOKI", and "i" is an integer.
What is the value of "alphabet[lst[i]]"?
lst[i] returns a string (character), and "alphabet[string]" is not possible. (END)
+ 5
i have done and posted a similar task 2 years ago.
the iteration of the `key` variable is done with an *infinite iterator* by using the `cycle()` function from the python `itertools`.
if the iterator reaches the end of the `key` variable it does not exhaust, but starts again the next iteration from the beginning. see the code how it works:
https://sololearn.com/compiler-playground/cBj3eS3i13DB/?ref=app
+ 2
This maybe the method you are thinking of...
1. determine the length of the message
2. multiply the key, so the length is equal to or longer than the message
In your example "FREE PIZZA IN THE CAFETERIA", the length is 27, and the key is "COOKIE" (length = 6).
To "extend" the key, we can multiple the key by (27 // 6) + 1 = 5
Key become "COOKIECOOKIECOOKIECOOKIECOOKIE" (length = 30)
3. Create an empty string to store the final key
4. Loop the message for each character, take the first letter in the "temp key", put it into the "final key" string, then delete the first character from the "temp key".
4a. If the message character you are looping is a space, add a space to your "final key"
Then you get your "final key" COOK IECOO KI ECO OKIECOOKI
An alternative but advance method, use the itertools library.
There is a "cycle" in that library.
Basically it is a generator, which can keep outputting in a loop.
https://sololearn.com/compiler-playground/chWh5ULks81Y/?ref=app
+ 2
Annihilate, you should start to learn how to read the error message.
I run the program with the following inputs
FREE PIZZA IN THE CAFETERIA
COOKIE
And I got this:
Traceback (most recent call last):
File "./Playground/file0.py", line 61, in <module>
main()
File "./Playground/file0.py", line 51, in main
enc_lst = num_to_let(shifted_lst)
File "./Playground/file0.py", line 41, in num_to_let
lst[i] = alphabet[lst[i]]
TypeError: list indices must be integers or slices, not str
It says when running line 61 (which is main()), which encounter an error in line 51, where it encounter an error in line 41 (which is lst[i] = alphabet[lst[i]])
The error is a TypeError, list indices must be integers or slices, not str.
That is the same issue you faced in the previous post.
(1/2)
+ 1
It would be helpful if you give us the input and output.
If I'm not mistaken...
Input: FREE PIZZA IN CAFETERIA
Output: HSFO XMBNO SV XJS QKNIVSFSI
And we have a lesson in here too.
Community > By The Community > Cryptography > Vigenere cipher
https://www.sololearn.com/learn/10366/?ref=app
+ 1
Annihilate
your idea of not basing the encryption on ascii table but on custom list is interesting, so I modified the codes I posted to do something similar. I just joined the list into a string but it is functionally the same. I also extended the list to include uppercase, lowercase, numerals and whitespace. You can add additional characters if you want.
https://sololearn.com/compiler-playground/cmDoTywr1ZyJ/?ref=app
+ 1
Wong Hei Ming
Got it, thanks!
0
Wong Hei Ming
#this is what I have so far:
import math
def shift(lst, word):
lst_len=len(lst)
word_len=len(word)
shifts=math.ceil(lst_len/word_len)
temp_key=word*shifts
final_key=""
for i in range(lst_len):
if lst[i]==" ":
final_key+=" "
else:
final_key+=temp_key[0]
temp_key=list(temp_key)
temp_key.pop(0)
temp_key="".join(temp_key)
return final_key #this will be changed by the time I figure out the actual shifting part