Вы можете использовать некоторый тип структуры данных для хранения транспонирования.
- Вы можете отобразить каждый символ. Таким образом, вы не будете заменять любые уже замененные замены.
- Кроме того, можно также использовать маску для быстрого переключения букв, которые следует игнорировать.
- Наконец, вы можете прочитать ключ шифрования в в виде текстового файла и динамически построить карту.
Это похоже на шифр Цезаря, вы можете просто сдвинуть символы, используя известный алгоритм.
import java.util.*;
public class Encryption {
static final Map<Character, Character> mapping;
static final Set<Character> mask;
public static void main(String[] args) {
System.out.print("Input a word: ");
Scanner inputscan = new Scanner(System.in);
System.out.println("After replace: " + encrypt(inputscan.nextLine()));
inputscan.close();
}
private static String encrypt(String plaintext) {
StringBuffer buff = new StringBuffer();
for (char ch : plaintext.toCharArray()) {
buff.append(!mask.contains(ch) && mapping.containsKey(ch)
? mapping.get(ch)
: ch);
}
return buff.toString();
}
static {
mapping = new HashMap<Character, Character>();
mask = new HashSet<Character>();
mapping.put('A', 'N');
mapping.put('B', 'O');
mapping.put('C', 'P');
mapping.put('D', 'Q');
mapping.put('E', 'R');
mapping.put('F', 'S');
mapping.put('G', 'T');
mapping.put('H', 'U');
mapping.put('I', 'V');
mapping.put('J', 'W');
mapping.put('K', 'X');
mapping.put('L', 'Y');
mapping.put('M', 'Z');
mapping.put('N', 'A');
mapping.put('O', 'B');
mapping.put('P', 'C');
mapping.put('Q', 'D');
mapping.put('R', 'E');
mapping.put('S', 'F');
mapping.put('T', 'G');
mapping.put('U', 'H');
mapping.put('V', 'I');
mapping.put('W', 'J');
mapping.put('X', 'K');
mapping.put('Y', 'L');
mapping.put('Z', 'M');
mapping.put('a', 'n');
mapping.put('b', 'o');
mapping.put('c', 'p');
mapping.put('d', 'q');
mapping.put('e', 'r');
mapping.put('f', 's');
mapping.put('g', 't');
mapping.put('h', 'u');
mapping.put('i', 'v');
mapping.put('j', 'w');
mapping.put('k', 'x');
mapping.put('l', 'y');
mapping.put('m', 'z');
mapping.put('n', 'a');
mapping.put('o', 'b');
mapping.put('p', 'c');
mapping.put('q', 'd');
mapping.put('r', 'e');
mapping.put('s', 'f');
mapping.put('t', 'g');
mapping.put('u', 'h');
mapping.put('v', 'i');
mapping.put('w', 'j');
mapping.put('x', 'k');
mapping.put('y', 'l');
mapping.put('z', 'm');
mask.add('a');
mask.add('h');
}
}
Здесь является реализацией шифра Цезаря (адаптировано из this Ruby пример ).
import java.util.*;
public class EncryptionUtil {
private static final Set<Character> MASK;
static {
MASK = new HashSet<Character>(Arrays.asList('a', 'h'));
}
public static void main(String[] args) {
String phrase = "action >> hello world";
System.out.println(phrase);
String encrypted = caesarCipher(phrase, 13, MASK);
System.out.println(encrypted);
String plaintext = caesarCipher(encrypted, 13, MASK);
System.out.println(plaintext);
}
private static String caesarCipher(String plaintext, int shift, Set<Character> mask) {
StringBuffer buff = new StringBuffer();
for (char ch : plaintext.toCharArray()) {
if (!mask.contains(ch) && Character.isAlphabetic(ch)) {
int baseOrd = (int) (ch >= 'a' ? 'a' : 'A');
int origPos = ((int) ch) - baseOrd;
int newPos = (origPos + shift) % 26;
buff.append((char) (baseOrd + newPos));
} else {
buff.append(ch);
}
}
return buff.toString();
}
private static String caesarCipher(String plaintext, int shift) {
return caesarCipher(plaintext, shift, Collections.<Character>emptySet());
}
}
Вывод:
action >> hello world
apgvba >> hryyb jbeyq
actioa >> hello world