From 218aca1a6c58dc54ec90a378f4933b072f679dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Henrique?= Date: Wed, 23 Aug 2023 09:38:41 -0300 Subject: [PATCH] coisas --- trabalho1/afreq.py | 40 ++++++++++++++++++++++++++++++---------- trabalho1/cesar.py | 40 ++++++++++++++++++++++------------------ trabalho1/input.txt | 1 + trabalho1/texto.txt | 6 ++++++ trabalho1/vernam.py | 22 ++++++++++++++++++++++ 5 files changed, 81 insertions(+), 28 deletions(-) create mode 100644 trabalho1/input.txt create mode 100644 trabalho1/texto.txt create mode 100644 trabalho1/vernam.py diff --git a/trabalho1/afreq.py b/trabalho1/afreq.py index faec043..4d2e984 100644 --- a/trabalho1/afreq.py +++ b/trabalho1/afreq.py @@ -1,3 +1,9 @@ +import sys + +if len(sys.argv) < 2: + print("Usage: python3 afreq.py [arquivo]") + sys.exit(1) + frequencias = { 'A': 14.63, 'B': 1.04, @@ -27,6 +33,10 @@ frequencias = { 'Z': 0.47 } +frequencias = sorted(frequencias.keys(), key=lambda x: frequencias[x]) +frequencias.reverse() +caracteres = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + def afreq(string): # determinar a frequencia de cada caractere na string # comparar com a frequencia de cada caractere na lingua portuguesa @@ -42,19 +52,29 @@ def afreq(string): else: str_freq[c] = 1 - for c in str_freq: - if not c.isalnum(): - continue + freq_sorted = sorted(str_freq.items(), key=lambda item: item[1]) + freq_sorted = [x[0] for x in freq_sorted] + freq_sorted.reverse() - str_freq[c] /= len(string) - - freq_sorted = dict(sorted(str_freq.items(), key=lambda item: item[1])) + print(freq_sorted[0], frequencias[0]) + print(freq_sorted[1], frequencias[1]) possiveis_chaves = [] - for c in frequencias: - for k in freq_sorted: - if abs(frequencias[c] - freq_sorted[k]) < 0.5: - possiveis_chaves.append(ord(k) - ord(c)) + + for i, c in enumerate(frequencias): + if c not in freq_sorted: + continue + + index_c = caracteres.index(c) + index_freq = caracteres.index(freq_sorted[i]) + + print(c, index_c, index_freq) + + possiveis_chaves.append((index_freq - index_c) % 26) # (indice da freq da letra na str - indice da letra em PT) % ignorar letras maiusculas return possiveis_chaves +file_str = open(sys.argv[1], 'r').read() +possiveis_chaves = afreq(file_str) + +print(possiveis_chaves) \ No newline at end of file diff --git a/trabalho1/cesar.py b/trabalho1/cesar.py index 7c68024..b54513e 100644 --- a/trabalho1/cesar.py +++ b/trabalho1/cesar.py @@ -39,6 +39,8 @@ special_chars = { ")": ")" } +caracteres = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + def cesar(string, key): new_string = "" @@ -50,26 +52,28 @@ def cesar(string, key): if letter in special_letters: letter = special_letters[letter] - new_letter = ord(letter) + key + index = caracteres.index(letter) + new_index = (index + key) % len(caracteres) + new_letter = caracteres[new_index] - # [A-Z, a-z, 0-9] - if ord('0') <= ord(letter) <= ord('9'): - if new_letter > ord('9'): - new_letter += 7 # 9 + 1 = A - elif new_letter < ord('0'): - new_letter += 75 # 0 - 1 = z - elif letter.isupper(): - if new_letter > ord('Z'): - new_letter += 6 # Z + 1 = a - elif new_letter < ord('A'): - new_letter -= 7 # A - 1 = 9 - else: - if new_letter > ord('z'): - new_letter -= 75 # z + 1 = 0 - elif new_letter < ord('a'): - new_letter -= 6 # a - 1 = Z + # # [A-Z, a-z, 0-9] + # if ord('0') <= ord(letter) <= ord('9'): + # if new_letter > ord('9'): + # new_letter += 7 # 9 + 1 = A + # elif new_letter < ord('0'): + # new_letter += 75 # 0 - 1 = z + # elif letter.isupper(): + # if new_letter > ord('Z'): + # new_letter += 6 # Z + 1 = a + # elif new_letter < ord('A'): + # new_letter -= 7 # A - 1 = 9 + # else: + # if new_letter > ord('z'): + # new_letter -= 75 # z + 1 = 0 + # elif new_letter < ord('a'): + # new_letter -= 6 # a - 1 = Z - new_string += chr(new_letter) + new_string += new_letter return new_string diff --git a/trabalho1/input.txt b/trabalho1/input.txt new file mode 100644 index 0000000..ca31bc3 --- /dev/null +++ b/trabalho1/input.txt @@ -0,0 +1 @@ +Pouco conhecimento faz com que as pessoas se sintam orgulhosas. Muito conhecimento, que se sintam humildes. Eh assim que as espigas sem graos erguem desdenhosamente a cabeca para o ceu, enquanto as cheias as baixam para a terra, sua mae. Leonardo Da Vinci. diff --git a/trabalho1/texto.txt b/trabalho1/texto.txt new file mode 100644 index 0000000..2ff6ba7 --- /dev/null +++ b/trabalho1/texto.txt @@ -0,0 +1,6 @@ +g5Bt5 t54yvtz3v4A5 wrG t53 7Bv r9 6v995r9 9v 9z4Ar3 +58xB2y59r9. dBzA5 t54yvtz3v4A5, 7Bv 9v 9z4Ar3 +yB3z2uv9. Vy r99z3 7Bv r9 v96zxr9 9v3 x8r59 v8xBv3 +uv9uv4y59r3v4Av r trsvtr 6r8r 5 tvB, v47Br4A5 r9 +tyvzr9 r9 srzEr3 6r8r r Av88r, 9Br 3rv. +cv54r8u5 Ur mz4tz. \ No newline at end of file diff --git a/trabalho1/vernam.py b/trabalho1/vernam.py new file mode 100644 index 0000000..c66de8d --- /dev/null +++ b/trabalho1/vernam.py @@ -0,0 +1,22 @@ +import sys + +if len(sys.argv) != 3: + print("Usage: python3 vernam.py [key] [string]") + sys.exit(1) + +key = sys.argv[1] +string = sys.argv[2] + +if len(string) != len(key): + print("Key and string must have the same length") + sys.exit(1) + +encrypted = "" + +for i in range(len(string)): + encrypted += chr(ord(string[i]) ^ ord(key[i])) + # print(ord(string[i]) ^ ord(key[i])) + +print(encrypted) + +# python3 vernam.py ABCDEF TOMATE | xargs python3 vernam.py ABCDEF