-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathencryption.py
145 lines (123 loc) · 4.49 KB
/
encryption.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
from string import printable,\
ascii_letters,\
ascii_lowercase,\
ascii_uppercase
import random
import pickle
def generate_code():
# Generates a random number for each printable ASCII character,
# Returns a list of tuples containing each character/number pair.
characters = printable
numbers = random.sample(range(len(characters) + 1000), len(characters))
code = list(zip(characters, numbers))
return code
def encode(string, code):
# Replaces each character of string with its code-number
# and adds a random number of random letters
coded_string = []
# find matching number for each character
for character in string:
for letter, number in code:
if character == letter:
# add the matching number
coded_string.append(str(number))
coded_string.append(''.join(
random.sample(
ascii_lowercase,
random.randint(2,6)
)
)
)# random letters used to separate numbers
for _ in range(random.randrange(len(string))):
coded_string.insert(
random.randrange(len(coded_string)),
''.join(random.sample(
ascii_uppercase, random.randint(1, 3)
))
) # random uppercase letters randomly inserted
return ''.join(coded_string)
def decode(string, code):
def retrieve_letter(n):
for letter, number in code:
if int(n) == number:
return letter
else:
continue
return "No Match found"
decoded_list = []
decoded_string = ''
character = ''
for item in string:
if item.isdigit():
character += item
else:
if character != '':
decoded_list.append(character)
character = ''
for n in decoded_list:
decoded_string += retrieve_letter(n)
return decoded_string
def save_code(object):
with open("code.p", "wb") as f:
pickle.dump(object, f)
def load_code():
try:
with open("code.p", "rb") as f:
return pickle.load(f)
except FileNotFoundError:
print("No saved code found.")
return None
def main():
import time
code = generate_code()
print("Welcome to my encryption program!")
while True: #Code selection menu
print("Please select an option:")
print("1: Use saved code")
print("2: Use new code and overwrite saved code")
print("3: Use new code and keep saved code")
prompt = input(">")
if prompt == "1":
if load_code() == None:
code = generate_code()
else:
code = load_code()
break
elif prompt == "2":
save_code(code)
break
elif prompt == "3":
break
else:
"This option is not available"
continue
while True: #Main Loop, asks user if he wants to encode/decode
print("Would you like to encrypt a phrase?(Y/N)")
prompt = input(">")
if prompt in ("N", "no", "No", "n"):
print("Press Enter to exit or type in anything to continue:")
prompt = input(">")
if prompt == '':
print ("Thank you for using the program, good bye!")
time.sleep(2)
break
else:
phrase = input("Enter your text here :\n>")
print (f"\nHere is your code : {encode(phrase, code)}\n")
print("Would you like to decrypt a phrase?(Y/N)")
prompt = input(">")
if prompt in ("N", "no", "No", "n"):
print("Press Enter to exit or type in anything to continue:")
prompt = input(">")
if prompt == '':
print ("Thank you for using the program, good bye!")
time.sleep(2)
break
else:
coded_phrase = input("Enter your code here :\n>")
print(f"\nHere is your original text: {decode(coded_phrase, code)}\n")
time.sleep(1)
input("Press Enter to continue")
print("\n")
if __name__ == '__main__':
main()