2017-06-28 3 views
-2

J'ai créé du code qui peut chiffrer le texte en convertissant le texte en clair et la clé en codes ascii et en les multipliant ensemble. Je sais que ce n'est pas sécurisé mais je le fais pour un cours de cryptographie.Comment pourrais-je décoder cela?

Voici mon code

plaintext = input(">> ") 
key = input("key: ") 

def ascii(text): 
    x = 0 

    for i in range(len(text)): 
     x += ord(text[i])*2**(8 * (len(text) -i -1)) 

    #end 

    return x 

#end 

ascii_pt = ascii(plaintext) 
ascii_key = ascii(key) 

# debug 
#print(ascii_pt) 
#print(ascii_key) 

encoded = ascii_pt * ascii_key 

print(encoded) 

J'ai essayé de faire encoded/ascii_key en vain. Toute aide est la bienvenue!

modifier

decoded = int(encoded/ascii_key) 

print(chr(decoded)) 

cela a fonctionné pour les petits caractères, mais n'a pas pu décoder les grandes: L

+2

Quelle version de python utilisez-vous? Veuillez également fournir un [MCVE] (https://stackoverflow.com/help/mcve). Fournissez un exemple d'entrée, une sortie attendue, Stacktraces si vous obtenez des erreurs. – Kraay89

+0

Aussi, je pense que vous n'utilisez pas 'chr()' correctement, lisez [ici] (https://docs.python.org/2/library/functions.html#chr). Il est destiné à être utilisé sur des codes de caractères uniques, ceci dans la plage [0, 256] – Kraay89

Répondre

0

La longueur originale du texte codé doit être connu afin de le décoder. Il peut y avoir un moyen de déduire cela à partir de la valeur codée, mais je ne pouvais pas penser à celle qui fonctionnerait toujours.

Notez que ce code ne fonctionne que pour les caractères de 8 bits (comme ASCII ou ISO-Latin). Compte tenu de cette contrainte, il a semblé fonctionner correctement dans Python 2.7.13 et 3.6.1 pour moi.

from __future__ import print_function 

#plaintext = input(">> ") 
#key = input("key: ") 

# hardcode for testing 
plaintext = 'All Your Base Are Belong To Us' 
key = 'secret' 

def encode(text): 
    x = 0 
    length = len(text) 
    for i in range(length): 
     x += ord(text[i]) * (2 ** (8 * (length-i-1))) 

    return x 

def decode(value, length): 
    x = value 
    chars = [] 
    for i in range(length-1, -1, -1): 
     shift = 2 ** (8 * (length-i-1)) 
     mask = 0xff * shift 
     ch = (x & mask) // shift 
     chars.append(chr(ch)) 
     x -= ch * shift 

    return ''.join(reversed(chars)) 

encode_key = encode(key) 
encode_pt = encode(plaintext) 

print('encode_key:', encode_key) 
print('encode_pt:', encode_pt) 

encoded = encode_pt * encode_key 

print('encoded:', encoded) 
print('encoded:', hex(encoded)) 

decoded = decode(int(encoded // encode_key), len(plaintext)) 

print('decoded:', decoded) 

Sortie:

encode_key: 126879297332596 
encode_pt: 451536573816692702021325803632147813811389735036878033208035641604986227 
encoded: 57290643205829835202633022894291838201313854456908334242503703290644426431694418155292 
encoded: 0x1d7d9dc35af66f834a837b1a90a43725666b520a0d802d785d43d3b5213352eaa293171cL 
decoded: All Your Base Are Belong To Us