Skip to content

Instantly share code, notes, and snippets.

@VictoriaMaia
Last active April 3, 2019 01:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save VictoriaMaia/c220ee30ff3c7ae235b4a30288413ee0 to your computer and use it in GitHub Desktop.
Save VictoriaMaia/c220ee30ff3c7ae235b4a30288413ee0 to your computer and use it in GitHub Desktop.
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