-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcaesercipher.py
177 lines (164 loc) · 5.53 KB
/
caesercipher.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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# SAMIP REGMI
# ADDED ON GITHUB JAN 29
# CAESER CIPHER COURSEWORK
# ** DOC STRINGS ADDED IN EACH FUNCTION FOR BETTER REDEABILITY **
import os
def welcome():
'''
parameter:No parameter
returns : None
prints welcome message
'''
print("Welcome to the Caesar Cipher\nThis program encrypts and decrypts text using Caesar Cipher.")
def enter_message():
'''
parameter: No parameter
returns mode , message , and shift
'''
while True:
mode = input("Would you like to encrypt (e) or decrypt (d): ").lower()
if mode in ['e', 'd']:
break
print("Invalid Mode")
message = input("What message would you like to process: ").strip().upper()
while True:
try:
shift = int(input("What is the shift number: "))
break
except ValueError:
print("Invalid Shift")
return mode, message, shift
def encrypt(message, shift_number):
'''
parameter: message, shift_number
returns : encrypted_result
just encrypts the message
'''
total_possibilities = 'abcdefghijklmnopqrstuvwxyz'
encrypted_result = ''
for character in message:
index = total_possibilities.find(character.lower())
if index == -1:
encrypted_result += character
else:
output_index = (index + shift_number) % len(total_possibilities)
encrypted_result += total_possibilities[output_index]
return encrypted_result.upper()
def decrypt(message, shift_number):
'''
parameter: message, shift_number
returns: decrypted_result
just decrupts the message
'''
total_possibilities = 'abcdefghijklmnopqrstuvwxyz'
decrypted_result = ''
for character in message:
index = total_possibilities.find(character.lower())
if index == -1:
decrypted_result += character
else:
output_index = (index - shift_number) % len(total_possibilities)
decrypted_result += total_possibilities[output_index]
return decrypted_result.upper()
def is_file(filename):
'''
parameter:filename
reuturns in boolean if the given file exists or not
'''
return os.path.isfile(filename)
def process_file(filename, mode):
'''
parameter: filename , mode
returns: processed_messages
processes the line , line by line
'''
if not is_file(filename):
print(f"File '{filename}' does not exist.")
return
processed_messages = []
with open(filename, 'r') as file:
for line in file:
line = line.strip()
if mode == 'e':
processed_messages.append(encrypt(line, shift_number))
elif mode == 'd':
processed_messages.append(decrypt(line, shift_number))
return processed_messages
def write_messages(messages):
'''
parameters:messages
return: None
writes messages in the file
'''
with open('./results.txt', 'w') as file:
for message in messages:
file.write(message + '\n')
print(f"Output written to results.txt")
def message_or_file():
'''
parameter:None
return:None
prompts user to choose console or read from file
'''
global shift_number
while True:
mode = input("Would you like to encrypt (e) or decrypt (d): ").lower()
if mode not in ['e', 'd']:
print("Invalid Mode")
continue
source = input("Would you like to read from a file (f) or the console (c)? ").lower()
if source == 'f':
while True:
filename = input("Enter a filename: ").strip()
if is_file(filename):
break
print("Invalid Filename")
while True:
try:
shift_number = int(input("What is the shift number: "))
if not (0 <= shift_number <= 25):
raise ValueError("Shift must be between 0 and 25")
break
except ValueError:
print("Invalid Shift")
return mode, None , filename
elif source == 'c':
message = input("What message would you like to process: ").strip().upper()
while True:
try:
shift_number = int(input("What is the shift number: "))
if not (0 <= shift_number <= 25):
raise ValueError("Shift must be between 0 and 25")
break
except ValueError:
print("Invalid Shift")
return mode, message, None
else:
print("Invalid input. Choose 'f' for file or 'c' for console.")
def main():
'''
main function of the program
'''
welcome()
while True:
mode, message, filename = message_or_file()
if filename:
messages = process_file(filename, mode)
if messages:
write_messages(messages)
else:
if mode == 'e':
print(encrypt(message, shift_number))
elif mode == 'd':
print(decrypt(message, shift_number))
while True:
another = input("Would you like to encrypt or decrypt another message? (y/n): ").strip().lower()
if another == 'y':
break
elif another == 'n':
print("Thanks for using the program, goodbye!")
return
else:
print('Invalid , please choose y or n')
if __name__ == "__main__":
main()