forked from TheAlgorithms/Python
- Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgronsfeld_cipher.py
45 lines (37 loc) · 1.2 KB
/
gronsfeld_cipher.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
fromstringimportascii_uppercase
defgronsfeld(text: str, key: str) ->str:
"""
Encrypt plaintext with the Gronsfeld cipher
>>> gronsfeld('hello', '412')
'LFNPP'
>>> gronsfeld('hello', '123')
'IGOMQ'
>>> gronsfeld('', '123')
''
>>> gronsfeld('yes, ¥€$ - _!@#%?', '0')
'YES, ¥€$ - _!@#%?'
>>> gronsfeld('yes, ¥€$ - _!@#%?', '01')
'YFS, ¥€$ - _!@#%?'
>>> gronsfeld('yes, ¥€$ - _!@#%?', '012')
'YFU, ¥€$ - _!@#%?'
>>> gronsfeld('yes, ¥€$ - _!@#%?', '')
Traceback (most recent call last):
...
ZeroDivisionError: integer modulo by zero
"""
ascii_len=len(ascii_uppercase)
key_len=len(key)
encrypted_text=""
keys= [int(char) forcharinkey]
upper_case_text=text.upper()
fori, charinenumerate(upper_case_text):
ifcharinascii_uppercase:
new_position= (ascii_uppercase.index(char) +keys[i%key_len]) %ascii_len
shifted_letter=ascii_uppercase[new_position]
encrypted_text+=shifted_letter
else:
encrypted_text+=char
returnencrypted_text
if__name__=="__main__":
fromdoctestimporttestmod
testmod()