2015-03-01 2 views
1

У меня был проект с шифром Цезаря и шифром Вигена. Я уже понял Цезаря, но я борюсь с шифром Вигенре.Шифрование Vigenère

Код моего шифрования состоит из двух частей: encrypt() и encrypt1(). encrypt() метод извлекает каждый символ и передает его encrypt1(), где все шифрование происходит в основном. Я сделал здесь код, но это не дает мне хороших результатов.

Например, если new VigenereCipher("SLIME").encrypt("GREEN") где "SLIME" является ключевым паролем и "GREEN" является строка, которая должна быть зашифрована YcMQR. Но мой код дает ?&|{.

Рассмотрим, что объект алфавита охватывает все = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz [email protected]#$%^&*()_+-=[]{}\\|;:'\",./?<>"

Может кому-то понравиться мне помочь с этим?

public class VigenereCipher extends SymmetricCipher { 

    protected String password; 
    protected int passwordPos; 

    public VigenereCipher(String password, Alphabet alphabet) 
    { 
     super(alphabet); 
     this.password = password; 
    } 
    public VigenereCipher(String password) 
    { 
     super(Alphabet.DEFAULT); 
     this.password = password ; 
    } 

    public String getPassword() 
    { 
     return this.password; 
    } 



    public String encrypt(String s) 
    { 
     passwordPos = 0; 
     String encrypted = ""; 
     for(int i = 0; i < s.length(); i++) 
     { 
      char c = s.charAt(i); 
      encrypted += encrypt1(c); 

     } 


     return encrypted; 
    } 

    protected char encrypt1(char c) 
    { 
     //Alphabet temp = new Alphabet(s); 
     int index = 0; 
     char result = 0; 

     index = alphabet.indexOf(c); //Found index of a character 

     if(index != -1) 
     { 
      int keyIndex = alphabet.get(passwordPos++ % password.length()); 
      result = alphabet.get((keyIndex + index) % alphabet.length()); 
     } 
     else 
      throw new NotInAlphabetException(c, alphabet); 
     return result; 
    } 

    public String decrypt(String c) 
    { 
     return c; 
    } 

    protected char decrypt1(char c) 
    { 
     return c; 
    } 

    public String toString() 
    { 
     return "Vigenere Cipher (password =\'"+this.password+"\')"; 
    } 



} 


public abstract class SymmetricCipher extends Cipher { 

    protected Alphabet alphabet; 

    public SymmetricCipher (Alphabet alphabet) 
    { 
     this.alphabet = alphabet; 
    } 

    public int wrapInt(int i) 
    { 
     int index = 0; 
     if (i >= alphabet.length()) 
      index = Math.abs(i) % alphabet.length(); 
     else if (i < 0) 
     { 
      int temp = Math.abs(i) % alphabet.length(); 
      index = alphabet.length() - temp; 
     } 
     else 
      index = i; 

     return index; 
    } 

    public int rotate(int index, int shift) 
    { 
     int result = 0; 

     if (shift > 0) 
     { 
      result = (index + shift) % alphabet.length(); 
     } 

     else if (shift < 0) 
     { 
      if(index < Math.abs(shift)) 
      { 
       int temp = Math.abs(index + shift); 
       result = alphabet.length() - temp; 

      } 
      else 
       result = index + shift ; 
     } 


     return result; 
    } 

    public Alphabet getAlphabet() 
    { 
     return this.alphabet; 
    } 

    public String encrypt(String s) 
    { 
     String string = ""; 
     char c = 0; 
     char encrypted = 0; 
     for (int i = 0; i < s.length(); i++) 
     { 
      c = s.charAt(i); 
      encrypted = encrypt1(c); 
      string += encrypted; 
     } 
     return string; 


    } 

    public String decrypt(String s) throws NotInAlphabetException 
    { 
     String string = ""; 
     char c = 0; 
     char encrypted = 0; 
     for (int i = 0; i < s.length(); i++) 
     { 
      c = s.charAt(i); 
      encrypted = encrypt1(c); 
      string += encrypted; 
     } 
     return string; 


    } 

    protected abstract char encrypt1(char c); 

    protected abstract char decrypt1(char c); 


} 



public class Alphabet { 


    private String symbols; 
    public static final Alphabet DEFAULT = new Alphabet("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz [email protected]#$%^&*()_+-=[]{}\\|;:'\",./?<>"); 

    public Alphabet(String symbols) 
    { 
     this.symbols = symbols; 
    } 

    public int indexOf(char c) 
    { 
     Alphabet temp = new Alphabet(symbols); 
     for(int i = 0; i < symbols.length(); i++) 
     { 
      if(c == symbols.charAt(i)) 
       return symbols.indexOf(c) ; 
     } 

     throw new NotInAlphabetException (c, temp); 
    } 

    public char get(int i) 
    { 
     Alphabet temp = new Alphabet(symbols); 
     char c = 0; 
     if (i > this.symbols.length()) 
      throw new NotInAlphabetException (c, temp); 
     else 
      return symbols.charAt(i); 
    } 

    public int length() 
    { 
     return symbols.length(); 
    } 

    public String getSymbols() 
    { 
     return symbols; 
    } 

    public String toString() 
    { 
     return "Alphabet("+this.symbols+")"; 
    } 

    public boolean equals(Object other) 
    { 
     if(other instanceof Alphabet) 
     { 
      Alphabet temp = (Alphabet) other; 
      return this.symbols.equals(temp.symbols); 

     } 
     else 
      return false; 
    } 
} 
+0

Продвигайтесь, чтобы решить проблему правильно. Спасибо. – EJP

ответ

1

Проблема заключается в этой линии в encrypt1 функции:

int keyIndex = alphabet.get(passwordPos++ % password.length()); 

Здесь вы пытаетесь искать ключ в пароль, но вы на самом деле получить его из алфавит. Вы хотите найти соответствующего символа из пароля (зацикливаясь, когда достигнете конца), а затем узнайте, какой индекс этого символа находится в вашем алфавите, чтобы вы могли взять текст плоскости и перенести его на этот (индекс) много символов в алфавите.

Чтобы сделать это, вы можете использовать этот код:

char pwChar = password.charAt(passwordPos++ % password.length()); 
int keyIndex = alphabet.indexOf(pwChar); 

Когда я изменить эту строку и запустить свой код с SLIME в качестве ключа и GREEN как открытый текст, я получаю Ресул YcMQR, что и вы сказали, что ожидаете.

+0

Эй @ ErwinBolwidt, я добавил остальные классы. Вы предполагаете, что int keyIndex = alphabet.get (passwordPos ++% password.length()); является источником неправильного вывода? – joshua

+0

Да, я предполагаю, что это причина. Теперь попробуйте запустить ваш код. –

+0

Да - когда я заменил первую строку, о которой я упомянул, с двумя строками, которые я упомянул во второй, вывод «YcMQR», который, как вы сказали, ожидали. –

Смежные вопросы