2014-04-25 1 views
0

On m'a demandé d'implémenter l'algorithme de chiffrement suivant. Le cryptage est un peu vague mais au moins ça a un peu de sens mais je n'ai aucune idée du fonctionnement du décryptage! Comme il est dit, pour le décryptage, la substitution inverse devrait avoir lieu. Comme vous pouvez le voir dans cet exemple 'chou', Comment savoir que b a répété deux fois ou a s'est déjà produit! Peut-être y a-t-il un indice que je ne peux pas le voir ou que je me trompe quelque part.
J'ai pris l'image de l'exigence afin que je puisse aussi vous montrer la table. Appréciez toute explication ou algorithme.Comment fonctionne cet algorithme de chiffrement?

enter image description here

+0

Vous avez simplement besoin de mapper un caractère à l'autre. L'AFAICT, que 'b' soit répété ou non, ou qu'il soit précédé de' a' ne devrait pas avoir d'importance. – devnull

+0

Je me demande après avoir cartographié ces lettres. Comment puis-je le déchiffrer pour obtenir le mot d'origine? – Bernard

+0

Vous pourriez vouloir regarder 'tr'. Voir 'man tr'. – devnull

Répondre

2

Vous êtes chargé avec un chiffrement par substitution simple. Pour chiffrer un texte, recherchez tous les caractères de la première ligne et remplacez-les par le caractère de la deuxième ligne, de sorte que a-> c, b-> a, c-> b, etc. Pour déchiffrer un texte, recherchez tous les caractères du deuxième ligne et remplacez-le par le caractère de la première ligne, donc a-> b, b-> c, c-> a, etc. Comme devnull a souligné la commande à rechercher est tr. L'exemple dans vos devoirs (?) Peut être réalisé par

tr abcdefghijklmnopqrstuvwxyz cabgedfhijklmnopqrstuvwxyz # encryption 
tr cabgedfhijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz # decryption 

Pour construire la table dont vous avez besoin pour calculer la deuxième ligne (la première est toujours un z). Pour autant que j'interprète la tâche, vous démarrez le mot-clé et supprimez chaque occurrence d'un caractère mais le premier, donc abcadc devient abcd et rlxxdllllq devient rlxdq. Ces caractères construisent le début de la deuxième ligne de votre table. Vous remplissez maintenant avec les caractères restants de l'alphabet dans l'ordre alphabétique. Vous pouvez donc obtenir le deuxième mot pour tr en concaténant le mot-clé singularisé avec le résultat des caractères de mot-clé singularisés retirés de abcd ... xyz. Comme tr a également une fonctionnalité de suppression, cela devrait être simple.

3

Cela ressemble à des devoirs si je viens d'ajouter quelques conseils comment ça marche pas de code complet réel ...

1.substitution

  • premier mot-clé converti pour être de lettres distinctes que
  • supprimer toutes les lettres qui a été utilisé avant (2 boucles imbriquées) fera

    cabbage -> cabge // b,a removed 
    
  • pas w faire la table de substitution de l'alphabet

    abcdefghijklmnopqrstuvwxyz // plain text alphabet(input unencrypted alphabet) 
    ------------------------- 
    cabge      // keyword 
    ---d-f-hijklmnopqrstuvwxyz // unused letters 
         dfhijklmnopqrstuvwxyz // unused letters merged together 
    ------------------------- 
    cabgedfhijklmnopqrstuvwxyz // output text alphabet (output encrypted alphabet) 
    

2.encryption

  • lire tout texte et convertir une lettre de l'alphabet non crypté crypté
  • quelque chose comme ceci:

    char enc[]="cabgedfhijklmnopqrstuvwxyz"; 
    char in,out; 
    // loop for input text reading to in 
    out=enc[int(in-'a')]; 
    // and writing back out 
    

3.décryptage

  • créer le déchiffrement de table alphabet

    abcdefghijklmnopqrstuvwxyz // plain text alphabet 
    cabgedfhijklmnopqrstuvwxyz // enc table 
    // now find the letter for decryption in enc and write the plain text value at the same position 
    // a->b, b->c, c->a ... z->z also 2 nested loops will do it 
    abcdefghijklmnopqrstuvwxyz // plain text alphabet 
    bcafegdhijklmnopqrstuvwxyz // dec table 
    
  • decrypt maintenant de la même manière que Crypter utiliser juste la table décembre au lieu de enc

    char dec[]="bcafegdhijklmnopqrstuvwxyz"; 
    char in,out; 
    // loop for input text reading to in 
    out=dec[int(in-'a')]; 
    // and writing back out 
    

[Notes]

  • N'oubliez pas d'ajouter si vous voulez gérer des lettres autres que 'a' - 'z'
+0

Je pense que l'autre réponse pour crypter et décrypter est plus facile et j'ai testé que je n'ai pas besoin de deux tables pour crypter et décrypter une table est assez bon. En tout cas merci pour votre remplacement de temps vraiment aidé. – Bernard

+1

Si vous n'utilisez qu'une seule table, vous avez un chiffrement ou un déchiffrement plus lent (vous avez besoin d'une boucle de recherche supplémentaire pour chaque caractère), mais vous épargnez de la mémoire à la place. Les deux approches sont valables alors choisissez ce qui est mieux pour votre tâche ... – Spektre

Questions connexes