2011-02-27 2 views
1

Hé, j'ai travaillé dessus pendant un moment, et je peux me souvenir que mon frère m'a fait passer par ce même alogorithme. Fondamentalement, il ajoute simplement les valeurs ASCII des deux caractères de la clé, et la phrase.Algorithme de chiffrement personnalisé Python

Je peux chiffrer avec ceci:

def encrypt(key, string): 
    encoded = '' 
    for i in range(len(string)): 
     key_c = ord(key[i % len(key)]) 
     string_c = ord(string[i % len(string)]) 
     encoded += chr((key_c + string_c) % 127) 
    return encoded 

Mais je ne peux pas sembler se rappeler ce que nous avons fait dans la mesure du décryptage. Il est difficile d'inverser un mod: P Des idées?

Répondre

8

qui est simple, nous allons voir comment cela fonctionne. Tout d'abord, le message chiffré est obtenu en soustrayant la clé.

enc = msg + key (mod 127) 
?

Comment peut-on obtenir le message d'origine est facile, soustrayez clé dans les deux côtés

enc - key = msg + key - key (mod 127) 

Et nous obtenons:

enc - key = msg (mod 127) 

Pour plus de détails, s'il vous plaît référence à Modular arithmetic, je pense qu'il devrait appartenir à un groupe/champ/anneau. Je ne suis pas expert en mathématiques, pour approfondir vos connaissances théoriques, vous pouvez les trouver dans Number theory. Voici le code raffiné:

def encrypt(key, msg): 
    encryped = [] 
    for i, c in enumerate(msg): 
     key_c = ord(key[i % len(key)]) 
     msg_c = ord(c) 
     encryped.append(chr((msg_c + key_c) % 127)) 
    return ''.join(encryped) 

def decrypt(key, encryped): 
    msg = [] 
    for i, c in enumerate(encryped): 
     key_c = ord(key[i % len(key)]) 
     enc_c = ord(c) 
     msg.append(chr((enc_c - key_c) % 127)) 
    return ''.join(msg) 

if __name__ == '__main__': 
    key = 'This_is_my_awsome_secret_key' 
    msg = 'Hello world' 
    encrypted = encrypt(key, msg) 
    decrypted = decrypt(key, encrypted) 

    print 'Message:', repr(msg) 
    print 'Key:', repr(key) 
    print 'Encrypted:', repr(encrypted) 
    print 'Decrypted:', repr(decrypted) 

Sortie

Message: 'Hello world' 
Key: 'This_is_my_awsome_secret_key' 
Encrypted: '\x1dNV`O\nkO`fD' 
Decrypted: 'Hello world' 
+0

Serais-je capable de rendre le fichier crypté que les caractères imprimables ascii si je devais faire: chr ((key_c + string_c)% 95 + 32) –

2

Le décryptage est le même, sauf avec moins au lieu de plus.

0

Mais vous n'avez pas besoin d'inverser le mod, juste le + key_c, non? Il suffit donc d'ajouter 128, soustraire key_c, et refaire le modulo 127 pour rester à portée. (Au lieu de la dernière ligne, toutes les autres lignes sont les mêmes que le cryptage.