Зашифруй слово с помощью Java - PullRequest
5 голосов
/ 22 ноября 2010

Я хотел зашифровать строку, сделать ее нечитабельной и поэтому предложил этот метод:

public String scrambleWord(String start_word){

     char[] wordarray = start_word.toCharArray();

        char[] dummywordarray = start_word.toCharArray();

        Random random = new Random();

        int r = random.nextInt(wordarray.length-1);
        int i = 0;

        int j = r+1;

        while(i <= r){

            dummywordarray[wordarray.length -i-1] = wordarray[i];

            i++;
        }


        while (j <= wordarray.length -1){

            dummywordarray[j-r-1] = wordarray[j];

            j++;

        }

        String newword = String.valueOf(dummywa);



        return newword;

Так что я сначала преобразовал строку в массив символов, и в моем методе мне пришлось дублировать массив символов "dummywordarray". Пройдя один раз через этот алгоритм, каждая буква слова изменит свою позицию. Но это не будет очень хорошо закодировано, в том смысле, что вы могли бы собрать его с первого взгляда. Итак, я передал заданную строку длиной менее 9 символов в метод 7 раз, и слова довольно хорошо зашифрованы, то есть нечитаемы. Но я попробовал это с 30-символьной строкой, и потребовалось 500 проходов, прежде чем я смог гарантировать, что это было хорошо закодировано. 500! Я уверен, что есть лучший алгоритм, я хотел бы несколько советов по любому а) совершенствование этого метода или же б) лучший способ.

1 Ответ

19 голосов
/ 22 ноября 2010

Как насчет

ArrayList<Character> chars = new ArrayList<Character>(word.length());
for ( char c : word.toCharArray() ) {
   chars.add(c);
}
Collections.shuffle(chars);
char[] shuffled = new char[chars.size()];
for ( int i = 0; i < shuffled.length; i++ ) {
   shuffled[i] = chars.get(i);
}
String shuffledWord = new String(shuffled);

Другими словами, вы можете воспользоваться существующим методом java.util.Collections.shuffle(List). К сожалению, вы должны перепрыгнуть через несколько обручей, чтобы использовать его, поскольку вы не можете использовать примитивы в Generics.

Edit:

Основной способ работы shuffle (полное объяснение см. В Javadoc), выглядит следующим образом:

for position = last_index to first_index
   let swap_pos = random number between first_index and position, inclusive
   swap(swap_pos, position)

Редактировать 2:

Этот подход значительно менее многословен с утилитами Chars от Guava:

List<Character> chars = Chars.asList(word.toCharArray());
Collections.shuffle(chars);
String shuffledWord = new String(Chars.toArray(chars));
...