2017-09-17 3 views
-1

J'ai eu un défi de la part de mon ami. Il a dit que je dois inverser la fonction, et j'ai besoin de trouver des entrées. Mais, je suis coincé pendant des heures à penser à la logique et à écrire ce que je pense dans un code.Déchiffrement du chiffrement XOR "chiffrement"

Il m'a donné cet algorithme:

def hash_cbc(input): 
    initial = 'a' 
    key = 'netsos' 

    output = [ord(initial)] 

    def enc(c, key, i): 
     z = key[i % len(key)] 
     return (c + ord(z))^ord(z) 

    for i in range(len(input)): 
     prev_char = output[i] 
     next_char = enc(prev_char, key, i)^ord(input[i]) 
     output.append(next_char) 

    return output 

la sortie de cet algorithme doit être:

97, 194, 299, 411, 533, 654, 768, 873, 965, 1066, 1164, 1272, 1399, 1512, 1603, 1706, 1792, 1895, 1994, 2110, 2215, 2310, 2404, 2517, 2645, 2762 

Je dois inverser la fonction pour que je puisse obtenir des entrées. Les entrées doivent être une chaîne.

S'il vous plaît aidez-moi, j'ai été bloqué pendant des heures et sans résultats. Je pensais inverser la fonction XOR, mais vraiment confus comment l'écrire.


Je pensais que ces algorithmes faisant

enc(prev_char, key, i)^1st ordinal input = 1st output 
enc(prev_char, key, i)^2nd ordinal input = 2nd output 
enc(prev_char, key, i)^3rd ordinal input = 3rd output 

etc fais que dans une boucle

mais je ne suis pas sûr de savoir comment inverser, car il est « enc (prev_char, clé, i) "partie qui me rend confus

J'ai également essayé de faire mon propre code inverse

def enc(c, key, i): 
Awalan = input("Insert numbers: ") 
Awalan_split = Awalan.split (', ') 
Awalan_len = len(Awalan_split) 

initial = 'a' 
key = 'netsos' 
output = [ord(initial)] 
z = key[i % len(key)] 
return (c + ord(z))^ord(z) 

for i in range(Awalan_len): 
    prev_char = output[i] 
    next_char = int(Awalan_split[i])^enc(prev_char, key, i) 
    char_convert = chr(next_char) 
    return(char_convert) 

print(char_convert) 

mais pas de chance, cela me donne juste une sortie vide. Quel est le problème avec mon code?

+0

Et où dans vos tentatives pour résoudre ce As-tu besoin d'aide exactement? –

+0

J'essayais de renverser la fonction XOR (^), mais pas de chance ... peut-être vous pouvez me donner une suggestion d'algorithme –

+0

Ecrire un programme qui fait quelque chose pour vous n'est pas ce que nous faisons ici. StackOverflow existe pour être une base de connaissances Q & A - une collection de questions canoniques (que quelqu'un d'autre que vous pourriez faire face) et des réponses à leur sujet. Si vous pouvez trouver une question dans laquelle vous êtes coincé qui a le potentiel d'être plus largement applicable, en supprimant les éléments qui sont périphériques à cette question pour rendre cette applicabilité plus claire (et en concentrant le titre sur * cette question *, vs ce que vous Essayons de faire) serait utile. –

Répondre

0

XOR s'inverse. A^B = C, C^B = A. Exemple:

>>> 123^456 
435 
>>> 435^456 
123 

La 2ème valeur du résultat, 194, a été calculé par XOR le caractère original inconnu avec le résultat de la fonction enc(), XOR donc 194 à nouveau avec la fonction enc() devrait produire la valeur d'origine.Rappelez-vous que initial est 'a' et le dernier paramètre de enc est l'indice courant dans la chaîne d'origine, de sorte 0:

>>> 194^enc(ord('a'),'netsos',0) 
99 
>>> chr(99) 
'c' 

La 3ème valeur du résultat, 299, a été XORed avec la fonction de chiffrement en utilisant la valeur précédente et le caractère suivant de la séquence, donc XOR avec la fonction de cryptage doit produire à nouveau il:

>>> 299^enc(194,key,1) # index (last parm) incremented 
105 
>>> chr(105) 
'i' 

suivant ce modèle, alors la fonction unencrypt doit être:

output = [] 
for i in range(len(inp) - 1): # original will be one shorter. 
    prev_char = inp[i] 
    next_char = enc(prev_char, key, i)^inp[i+1] 
    output.append(next_char) 

Ensuite, il suffit de convertir les ordinaux générés retour aux personnages:

return ''.join(chr(n) for n in output) 

est ici tout Tied ensemble:

# factor out common stuff 
initial = 'a' 
key = 'netsos' 
def enc(c, key, i): 
    z = key[i % len(key)] 
    return (c + ord(z))^ord(z) 

def hash_cbc(inp): 
    output = [ord(initial)] 

    for i in range(len(inp)): 
     prev_char = output[i] 
     next_char = enc(prev_char, key, i)^ord(inp[i]) 
     output.append(next_char) 

    return output 

def unhash_cbc(inp): 
    output = [] 
    for i in range(len(inp) - 1): 
     prev_char = inp[i] 
     next_char = enc(prev_char, key, i)^inp[i+1] 
     output.append(next_char) 

    return ''.join(chr(n) for n in output) 

expected_result = [97, 194, 299, 411, 533, 654, 768, 873, 965, 1066, 1164, 1272, 1399, 1512, 1603, 1706, 1792, 1895, 1994, 2110, 2215, 2310, 2404, 2517, 2645, 2762] 

u = unhash_cbc(expected_result) 
h = hash_cbc(u) 
print(h == expected_result) 
print(u) 

Sortie:

True 
cipheringblockingchaining 
+0

MERCI! Explication très utile et détaillée: D –