-
Notifications
You must be signed in to change notification settings - Fork 0
/
encrypt_decrypt.py
162 lines (144 loc) · 6.64 KB
/
encrypt_decrypt.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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# ************************************************************************************************************ #
# Caesar cipher, also known as Caesar's cipher, the shift cipher, Caesar's code or Caesar shift, is one of #
# the simplest and most widely known encryption techniques. It is a type of substitution cipher in which #
# each letter in the plain text is replaced by a letter some fixed number of positions down the alphabet. For #
# example, with a left shift of 3, D would be replaced by A, E would become B, and so on. The method is named #
# after Julius Caesar, who used it in his private correspondence. #
# ************************************************************************************************************ #
import pyperclip
# Save colors in constants to decorate the console output
GREEN = '\033[92m'
RED = '\033[91m'
END = '\033[0m'
def alphabet():
# Add chars to alphabet tuple for better results
# Add chars to alphabet tuple for better results
alphabet = []
try:
with open('alphabet.txt') as txt:
chars = txt.read().strip().splitlines()
for char in chars:
alphabet.append(f'{char}')
alphabet = tuple(alphabet)
print(f'{RED}Use custom alphabet from alphabet.txt{END}')
except Exception:
print("error loading alphabet from file")
alphabet = (
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0')
return alphabet
alphabet=alphabet()
# ******************************** class Cipher ******************************************
# Use alphabet tuple to replace every char with another that have index+step
class Cipher:
# Add chars to alphabet tuple for better results
# Add chars to alphabet tuple for better results
def __init__(self, step, alphabet):
self.alphabet = alphabet
if step <= 0 or step > len(self.alphabet) - 1:
# Unreachable line left her for class safety
self.step = len(self.alphabet) // 2
print(
f'Chosen step must be between {GREEN}0{END} and {GREEN}{len(self.alphabet) - 1}{END}.'
f' Your chosen step is out of range and will be automatically set at {GREEN}{step}{END}\n')
else:
self.step = step
# Getter alphabet size
def alphabet_size(self):
return len(self.alphabet) - 1
# *********** Encrypt method ***************
def encrypt(self, c):
if c in self.alphabet:
index = self.alphabet.index(c) + self.step
if index <= len(self.alphabet) - 1:
return self.alphabet[index]
else:
return self.alphabet[index - len(self.alphabet)]
else:
return c
# *********** Decrypt method ***************
def decrypt(self, c):
if c in self.alphabet:
index = self.alphabet.index(c) - self.step
if index >= 0:
return self.alphabet[index]
else:
return self.alphabet[len(self.alphabet) + index]
else:
return c
# *************************** def do_operation(step, operation, message)**************************
# Return encrypted/decrypted message
# You can apply multiple crypt and decrypt for better results
# (keep in mind this algorithm is basic)
def do_operation(step, operation, message):
op = Cipher(step,alphabet)
#print(step)
#print(alphabet)
if operation == 'e':
return "".join(map(op.encrypt, message))
else:
return "".join(map(op.decrypt, message))
# ************** Main menu *********
# Initialise main menu vars
info = Cipher(1,alphabet)
message, operation, step = '', '', 0
do_continue, do_clip = '', ''
while True:
# ********** Request user input *************
# operation, step and message
if operation == '':
operation = input(f'Do you want to {GREEN}(e){END}ncrypt or {GREEN}(d){END}ecrypt?\n>').strip().lower()
if len(operation) > 1:
operation = operation[0]
if operation not in ('e', 'd'):
print('\nPlease enter d to decrypt or e to encrypt')
operation = input(f'Do you want to {GREEN}(e){END}ncrypt or {GREEN}(d){END}ecrypt?\n>').strip().lower()
continue
try:
step = int(step)
if step <= 1 or step > info.alphabet_size():
step = input(f'Please enter the key {GREEN}(1 to {info.alphabet_size()}){END} to use.\n>')
continue
except ValueError:
print(f'{RED}Please enter a number{END}')
step = input(f'Please enter the key {GREEN}(1 to {info.alphabet_size()}){END} to use.\n>')
continue
if message == '' and operation == 'e':
message = input(
f'Enter the message to {GREEN}encrypt{END} or press {GREEN}(p){END}paste to past your clipboard content\n> ')
if message in ('p', 'P', 'Paste', 'PASTE', 'paste'):
message = pyperclip.paste()
print(f'Your message is:\n{GREEN}{message}{END}')
continue
elif message == '' and operation == 'd':
message = input(
f'Enter the message to {GREEN}decrypt.{END} or press {GREEN}(p){END}paste to past your clipboard content\n> ')
if message in ('p', 'P', 'Paste', 'PASTE', 'paste'):
message = pyperclip.paste()
print(f'Your message is:\n {GREEN}{message}{END}')
continue
continue
elif do_clip == '':
# Print the result (if "y" is press, when requested, save the result to clipboard)
result = do_operation(step, operation, message)
print(f'\nYour result is: \n{GREEN}{result}{END}')
do_clip = input(
f'\nIf you want to save your resulted message to clipboard press {GREEN}(c){END}opy,'
f' to skip press any other key\n>').strip().lower()
if do_clip in ('c', 'copy'):
pyperclip.copy(result)
print(f'{GREEN}Your result has been copied to your clipboard{END}')
# If "y" is press reset vars and start another operation
# any other key exit program
if do_continue == '':
do_continue = input(
f'\nTo do another operation pres {GREEN}(y){END}es,'
f' to exit program press any other key\n>').strip().lower()
if len(do_continue) > 1:
do_continue = do_continue[0]
continue
elif do_continue == 'y':
operation, message, do_continue, do_clip, step = '', '', '', '', 0
continue
else:
quit()