-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvigenere.py
More file actions
70 lines (53 loc) · 1.6 KB
/
vigenere.py
File metadata and controls
70 lines (53 loc) · 1.6 KB
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
import sys
ORDA = ord('a') #Order of 'a' character
ORDZ = ord('z') #Order of 'z' character
ALPHALENGTH = 26 #Alphabet length
def vigenere(key, string, encrypt):
encryptedString = '' #Encrypted string
offset = 0 #Offset key for non alpha characters
#Encrypt
for i in range(len(string)):
capitalized = string[i].isupper()
#Get character order
stringOrd = ord(string[i].lower())
#Get key character as if it were looped and get order
keyOrd = ord(key[(i-offset)%len(key)])
if stringOrd not in range(ORDA, ORDZ+1):
#Character is not alpha
encryptedString += string[i]
offset += 1
else:
if encrypt:
newOrd = vigenereEncrypt(stringOrd, keyOrd)
else:
newOrd = vigenereDecrypt(stringOrd, keyOrd)
#Add to string
if capitalized:
encryptedString += chr(newOrd).upper()
else:
encryptedString += chr(newOrd)
return encryptedString
def vigenereEncrypt(cOrd, kOrd):
#Compute encrypted character order
order = cOrd + kOrd - ORDA
#If new order is greater than z's order, loop back to beginning of alphabet
if order > ORDZ:
order -= ALPHALENGTH
return order
def vigenereDecrypt(cOrd, kOrd):
#Compute encrypted character order
order = cOrd - kOrd + ORDA
#If new order is less than a's order, loop it back in range
if order < ORDA:
order += ALPHALENGTH
return order
def main(args):
if len(args) > 3:
key = args[1]
string = args[2]
doEncrypt = (args[3] == 'True')
print(vigenere(key, string, doEncrypt))
else:
print('Incorrect arguments. Usage: vigenere.py key string encrypt(True/False)')
if __name__ == "__main__":
main(sys.argv)