-
Notifications
You must be signed in to change notification settings - Fork 0
/
cesar_freq.py
79 lines (66 loc) · 2.28 KB
/
cesar_freq.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
'''
Cifra de cesar ataque de frequencias
'''
import string, sys, re, subprocess
"""
decifra
"""
def decrypt(key, ciphertext):
'''
parametros: char key - deslocamento de A
string texto cifrado - mensagem codificada a ser lida
desc: decifra a mensagem invertendo o deslocamento de cada letra por chave
'''
shift = ord(key.upper()) - 65
plaintext = ""
for c in ciphertext.upper():
if ord(c) != ord(" "):
nchar = chr(ord(c) - shift)
if ord(nchar) < 65:
nchar = chr(ord(nchar) + 26)
elif ord(nchar) > 90:
nchar = chr(ord(nchar) - 26)
plaintext += nchar
else:
plaintext += " "
return plaintext
if __name__ == '__main__':
subprocess.call('clear',shell=True)
try:
# modo auto: obtem texto cifrado de opt
raw_ciphertext = sys.argv[1]
except:
# Menu - input do utilizador
print("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+")
print("| * Criptoanalise* |")
print("| Cifra de Caesar - Frequencias |")
print("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n")
raw_ciphertext = input("+ Inserir A Chave Cifrada: ")
raw_bruteforce = input("\n+ forca bruta?: n ")
ciphertext = raw_ciphertext.upper()
if (raw_bruteforce.upper()).find("Y") != -1:
bruteforce = True
else:
bruteforce = False
# verifique a frequência de ocorrência de cada letra (A a Z)
for l in list(map(chr, range(ord('A'), ord('[')))):
freq = ciphertext.count(l) / float(len(ciphertext.replace(" ", "")))
# se a letra aparecer 10% ou mais, pode ser 'E'
if freq >= .1 or bruteforce:
# rodapara que a chave de descriptografia seja A
key = chr(ord(l) - 4)
if ord(key) < 65:
key = chr(ord(key) + 26)
elif ord(key) > 90:
key = chr(ord(key) - 26)
print("\n=> Chave Possivel: A=" + key + ". A decifrar..")
print(decrypt(key, ciphertext) + "\n")
print("+ Numero de frequencias encontras no criptograma")
print("Letra E")
print(len(re.findall("e", raw_ciphertext)))
print("Letra O")
print(len(re.findall("o", raw_ciphertext)))
print("letra S")
print(len(re.findall("s", raw_ciphertext)))
print("letra R")
print(len(re.findall("r", raw_ciphertext)))