Last active
April 3, 2019 01:14
-
-
Save VictoriaMaia/c220ee30ff3c7ae235b4a30288413ee0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
a1 = "0e0011101f060b040c410b4f44051a41080601064310021013014517490316060c03010912001245040e16171c4e19080e07141b4918005353080b18010b1d4144000002171c121e11121700" | |
a2 = "000005101e000002004c12064d010715034f04004e11071a070a00000c46011b161a1d0b0741004512000008125350160a4414001c170c124f4d030d0b061e08540e00134510070515020500" | |
tam = 152 | |
y1 = [] | |
y2 = [] | |
vetEntrada = [] | |
vetTextoClaro1 = [] | |
vetTextoClaro2 = [] | |
vetKey = [] | |
def imprimirvetor(vetor): | |
# Imprime um vetor com seus valores em ASCII | |
# Verifica se o vetor ja foi totalmente descriptografado verificando se ainda tem ou não 0 no vetor | |
zeros = 0 | |
for i in range(0, len(vetor)): | |
print(i, end=" ") | |
print() | |
j = 0 | |
for i in vetor: | |
if(j < 10): | |
print(chr(i), end=" ") | |
if (chr(i) == "0"): | |
zeros = zeros+1 | |
else: | |
print(chr(i), end=" ") | |
if (chr(i) == "0"): | |
zeros = zeros+1 | |
j = j+1 | |
print() | |
if zeros == 0: | |
return 1 | |
def convDecimal(palavra): | |
# Converte uma string em um vetor de valores inteiros | |
vetDecimais = [] | |
for i in range(0, len(palavra)): | |
vetDecimais.append(ord(palavra[i])) | |
return vetDecimais | |
def testarResposta(wordAchada, wordTestada, i): | |
# Recebe: | |
# wordAchada : palavra definida pelo usuário para testar | |
# wordTestada : parte do vetor de entrada | |
# i : indice do vetor de entrada em que a wordAchada foi testada | |
tam = i + len(wordAchada) | |
tamk = len(wordAchada) | |
k1 = [0] | |
k2 = [0] | |
ynw1 = [] | |
ynw2 = [] | |
acertos1 = 0 | |
acertos2 = 0 | |
indk = 0 | |
temk1 = 0 | |
temk2 = 0 | |
for j in range (i, tam): | |
k1.insert(indk, (wordAchada[indk] ^ y1[j])) | |
if not( (k1[indk] >= 97 and k1[indk] <= 122) or k1[indk] == 46 or k1[indk] == 32): | |
break | |
ynw1 = k1[indk] ^ wordTestada[indk] | |
if(ynw1 == y2[j]): | |
acertos1 += 1 | |
indk = indk+1 | |
indk = 0 | |
for j in range (i, tam): | |
k2.insert(indk, (wordAchada[indk] ^ y2[j])) | |
if not( (k2[indk] >= 97 and k2[indk] <= 122) or k2[indk] == 46 or k2[indk] == 32): | |
break | |
ynw2 = k2[indk] ^ wordTestada[indk] | |
if(ynw2 == y1[j]): | |
acertos2 += 1 | |
indk = indk+1 | |
if(acertos1 == len(wordAchada)): | |
temk1 = 1 | |
print("\nchave k1 : ") | |
for j in range(0, tamk): | |
print(chr(k1[j]), end=" ") | |
print() | |
if(acertos2 == len(wordAchada)): | |
temk2 = 1 | |
print("\nchave k2 : ") | |
for j in range(0, tamk): | |
print(chr(k2[j]), end=" ") | |
print() | |
while True: | |
print() | |
if temk1 == 1: | |
print("Selecione 1 para escolher k1") | |
elif temk2 == 1: | |
print("Selecione 2 para escolher k2") | |
else: | |
print("Nao tem chave que gere esses valores") | |
return 0 | |
k = input("Ou digite N para não aceitar nenhuma das opções\n") | |
if k == "1": | |
ind = 0 | |
for j in range(i, tam): | |
vetTextoClaro1[j] = wordAchada[ind] | |
vetTextoClaro2[j] = wordTestada[ind] | |
vetKey[j] = k1[ind] | |
ind = ind+1 | |
return 1 | |
elif k == "2": | |
ind = 0 | |
for j in range(i, tam): | |
vetTextoClaro1[j] = wordTestada[ind] | |
vetTextoClaro2[j] = wordAchada[ind] | |
vetKey[j] = k2[ind] | |
ind = ind+1 | |
return 1 | |
elif k == "N" or k == "n": | |
return 0 | |
else: | |
print("Escolha uma opção para prosseguir") | |
def testar(palavraTeste): | |
# Testar palavra recebida pelo usuário em todas as possibilidades do vetor de entrada | |
vetTeste = convDecimal(palavraTeste) | |
i = 0 | |
ind = 0 | |
tamVetTeste = len(vetTeste) | |
vetResposta = [] | |
vetOpcoes = [] | |
vetIndices = [] | |
while ((i+tamVetTeste) <= len(vetEntrada)): | |
cons = 0 | |
for j in range(0, tamVetTeste): | |
rXor = vetTeste[j] ^ vetEntrada[i+j] | |
if( (rXor >= 97 and rXor <= 122) or rXor == 46 or rXor == 32 or (rXor >= 130 and rXor <= 141) or rXor == 149 or rXor == 198): | |
vetResposta.append(rXor) | |
else: | |
vetResposta.clear() | |
break | |
if(len(vetResposta) > 0): | |
print(ind, " -> ", end='') | |
for k in vetResposta: | |
print(chr(k), end=" ") | |
print(" : i = ", i) | |
vetOpcoes.append(vetResposta.copy()) | |
vetIndices.append(i) | |
ind = ind + 1 | |
vetResposta.clear() | |
i = i + 1 | |
if(len(vetOpcoes) == 0): | |
return | |
while True: | |
op = input("\nDigite o indice para testar a resposta ou N para nao testar \n") | |
if op == "n" or op == "N": | |
return | |
op = int(op) | |
deucerto = testarResposta(vetOpcoes[op], vetTeste, vetIndices[op]) | |
if deucerto == 1: | |
return | |
def xorEntrada(): | |
# Faz o xor com as entradas do problema e gera um vetorEntrada com o resultado em um vetor de intei | |
for i in range(0,tam,2): | |
s1 = a1[i] + a1[i+1] | |
s2 = a2[i] + a2[i+1] | |
dec1 = int(s1, 16) | |
dec2 = int(s2, 16) | |
y1.append(dec1) | |
y2.append(dec2) | |
result = dec1 ^ dec2 | |
vetEntrada.append(result) | |
if __name__ == "__main__": | |
# Inicializa os vetores de resposta com 0 para facilitar a visualização | |
print("Digite uma strign como entrada. Será mostrado opções para você escolher e no fim será mostrado um vetor correspondente do texto claro1, do texto claro 2 e da chave, contendo 0 se não tiver descriptografado ainda ou o caracter correspondente\n") | |
print("Se quiser sair antes de terminar digite q no campo da entrada") | |
for i in range(0, int(tam/2)): | |
vetTextoClaro1.append(48) | |
vetTextoClaro2.append(48) | |
vetKey.append(48) | |
xorEntrada() | |
while True: | |
i = input("entrada: ") | |
if i == "q": | |
break | |
print("\n##############\nTESTAR ", i, "\n##############\n") | |
testar(i) | |
print("\033[1m", "\n Texto claro 1: ", "\033[22m") | |
imprimirvetor(vetTextoClaro1) | |
print("\033[1m", "Texto claro 2: ", "\033[22m") | |
imprimirvetor(vetTextoClaro2) | |
print("\033[1m", "Chave: ", "\033[22m") | |
terminou = imprimirvetor(vetKey) | |
print() | |
if terminou: | |
print("Você conseguiu descriptografar a mensagem ^.^") | |
break | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment