2016-06-25 1 views
1

Ceci est ma première question ici, donc si vous avez quelque chose que je peux améliorer (messages ainsi que le style de codage), je suis heureux de savoir.Chiffrement personnalisé Crypter/Déchiffrer flux

Je sais que mon codage est très efficace, donc je serai ravi de prendre vos conseils et vos améliorations.

Actuellement, j'écris un programme AtbashCipher, qui doit crypter et décrypter l'entrée String. Comme pour toutes les tâches à l'Université, il y a quelques lignes directrices, que nous devons suivre, mais je vais d'abord expliquer mon code actuel:

import java.util.Scanner;

public class AtbashCipher { 

    StringBuilder code = new StringBuilder(""); 
    String inputString; 
    String coded; 

    public String getInputString() { 
     return this.inputString; 
    } 

    public void setInputString(String inputString) { 
     this.inputString = inputString; 
    } 

    public String getCoded() { 
     return this.coded; 
    } 

    public void setCoded(String coded) { 
     this.coded = coded; 
    } 

    public char encode(char c) { 
     String alphabet = "abcdefghijklmnopqrstuvwxyz"; 
     char help = Character.toLowerCase(c); 
     if (alphabet.indexOf(help) >= 0) { 
      for (int i = 0; i < alphabet.length(); i++) { 
       if (help == alphabet.toLowerCase().charAt(i)) { 
        c = alphabet.charAt(26 - i - 1); 
        code.append(c); 
       } 
      } 
     } else { 
      code.append(c); 
     } 

     if (inputString.length() == code.length()) { 
      System.out.println("Encode: " + code); 
      coded = code.toString(); 
      inputString = coded; 
      code.setLength(0); 
     } 
     return c; 
    } 

    public char decode(char c) { 
     String alphabet = "abcdefghijklmnopqrstuvwxyz"; 
     char help = Character.toLowerCase(c); 
     if (alphabet.indexOf(help) >= 0) { 
      for (int i = 0; i < alphabet.length(); i++) { 
       if (help == alphabet.toLowerCase().charAt(i)) { 
        c = alphabet.charAt(26 - i - 1); 
        code.append(c); 
       } 
      } 
     } else { 
      code.append(c); 
     } 

     if (inputString.length() == code.length()) { 
      coded = code.toString(); 
      inputString = coded; 
      System.out.println("Decode: " + code); 
      code.setLength(0); 
     } 
     return c; 
    } 

    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     AtbashCipher atb = new AtbashCipher(); 
     System.out.print("To be translated: "); 
     atb.setInputString(sc.nextLine()); 
     sc.close(); 
     for (int j = 0; j < atb.getInputString().length(); j++) { 
      char help = atb.getInputString().charAt(j); 
      atb.encode(help); 
     } 
     for (int k = 0; k < atb.getInputString().length(); k++) { 
      char help = atb.getInputString().charAt(k); 
      atb.decode(help); 
     } 
    } 
} 

Ce code et déchiffre le encrypte inputString, ce qui est encore nécessaire de le remplacer par un scanner d'entrée, mais ce n'est pas un problème. Nous devons apporter les méthodes de décodage et de codage, qui sont fondamentalement les mêmes dans mon code, mais nous devons le découper quand même. Est-ce que je fais quelque chose de mal? (voir modifier, oui, je l'ai fait quelque chose de mal.)

Le problème commence par la tâche: Nous devons écrire une classe AtbashWriter qui implémente l'java.io.Writer et après que le constructeur a besoin d'obtenir ces arguments:

public AtbashWriter(Writer base, AtbashCipher cipher) 

, nous avons également besoin de passer outre les méthodes write, flush et close, donnés par Java.

public void write(char[] cbuf, int off, int len) 
public void flush() 
public void close() 

Nous devons faire la même chose pour le Reader ainsi.

J'ai vraiment du mal à comprendre ce concept de créer mon propre Stream et de l'implémenter dans mon code.

Pouvez-vous m'expliquer comment cela fonctionne et comment mon code pourrait être plus efficace? Erreurs etc.?

Veuillez ne pas simplement lier la bibliothèque java, parce que j'ai quelques difficultés à comprendre le concept des bibliothèques, je recherche toujours quelques exemples.

Cette tâche est de l'Université, mais je ne reçois pas de notes à ce sujet, je veux juste le faire et de pratiquer pour l'examen.

Toute aide est appréciée. Merci :)

Editer: Je ne peux pas éditer la première ligne de mon message, alors ... hey les gars. Edit2: Je viens de voir que mes méthodes ne fonctionnent pas complètement comme je le veux, je vais essayer de les corriger. Edit3: J'ai édité le programme, en essayant de poster l'écrivain peut-être aujourd'hui.

Edit4: en retard, mais toujours pas oublié: je l'ai fini et l'a ajouté ici, problème est résolu :)

private Reader base; 
private AtbashCipher cipher; 

public AtbashReader(Reader base, AtbashCipher cipher) { 
    this.base = base; 
    this.cipher = cipher; 
} 

public int read (char[] cbuf, int off, int len) throws IOException{ 
    int result= base.read(cbuf, off, len); 

    for(int i = off; i < (off+len); i++){ 
     cbuf[i] = cipher.decode(cbuf[i]); 
    } 
    return result; 
} 

public void close()throws IOException { 
    base.close(); 
} 

Répondre

1

Je vais essayer de faire une analogie. Supposons que vous avez déjà une machine capable de repeindre les voitures. C'est simple: vous lui donnez une voiture et la machine la peint. Cette machine est l'équivalent d'un Writer, qui prend un tableau char, et l'écrit.

Maintenant, le problème est que les voitures doivent être lavées avant d'être peintes. Alors, comment pourriez-vous faire une machine qui lave les voitures, puis le peint. Vous pouvez construire une nouvelle machine à partir de zéro. Ou vous pouvez simplement construire une machine qui réutilise la machine à peindre. Votre machine prendrait une voiture, la laverait (c'est votre travail), puis donnerait la voiture lavée à la machine déjà existante. Cette grosse machine est votre AtbashWriter: elle écrit des tableaux char, mais avant de les écrire, elle les code. Et comment fait-il cela? En encodant le tableau char et en le passant à la machine qui sait déjà écrire: le Writer de base.

Donc, en gros, votre méthode d'écriture() devrait ressembler à ceci:

public void write(char[] cbuf, int off, int len) { 
    // transform the dirty car into a washed car 
    char[] encodedChars = encode(cbuf, off, len); 

    // paint the washed car 
    baseWriter.write(encodedChars, 0, encodedChars.length); 
} 

Espérons que cela devrait vous aider à démarrer.

+0

Merci pour votre réponse, j'y reviendrai demain, parce que je suis trop fatigué pour le moment, mais j'ai changé mon code un peu aussi. – mxOx2kL

+0

Votre analogie l'a rendu plus clair et maintenant je sais comment aborder le problème. Donc le constructeur accepte mon objet chiffré qui contient les différentes valeurs comme la chaîne (?) Et l'auteur écrit simplement tout dans un fichier ou un flux. Je ne comprends pas la différence entre mon chiffre et l'écrivain. Le scénariste n'est-il pas supposé tenir mes cordes codées? Que fait le chiffrement? Merci beaucoup – mxOx2kL

+0

Okay j'ai essayé votre réponse, mais je ne comprends pas complètement la raison derrière le "chiffrement" AtbashCipher et aussi char [] encodedChars = encoder (cbuf, off, len); Ai-je besoin de changer mes méthodes de codage/décodage, afin que je puisse lui donner les arguments requis? Notre méthode d'encodage est (pour autant que je sache) seulement supposée recevoir le char. Merci pour l'aide – mxOx2kL