import java.util.Random;
import java.util.stream.IntStream;
public class Cipher {
private static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
private static final Random random = new Random();
public String key;
public Cipher() {
this.key = IntStream.range(0, 100)
.map(x -> ALPHABET.toCharArray()[random.nextInt(ALPHABET.length())])
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
}
public Cipher(String key) {
if (!isValidKey(key)) {
throw new IllegalArgumentException("Invalid key");
}
this.key = key;
}
private static boolean isValidKey(String key) {
return key.matches("^[a-z]+$");
}
public String getKey() {
return key;
}
public String encode(String plainText) {
StringBuilder ciphertext = new StringBuilder(plainText.length());
for (int index = 0; index < Math.min(plainText.length(), key.length()); index++) {
ciphertext.append(encodeCharacter(plainText, index));
}
return ciphertext.toString();
}
private char encodeCharacter(String plainText, int index) {
int alphabetIdx = ALPHABET.indexOf(plainText.toCharArray()[index]) + ALPHABET.indexOf(key.toCharArray()[index]);
if (alphabetIdx >= ALPHABET.length()) {
alphabetIdx -= ALPHABET.length();
}
return ALPHABET.toCharArray()[alphabetIdx];
}
public String decode(String cipherText) {
StringBuilder plainText = new StringBuilder(cipherText.length());
for (int i = 0; i < cipherText.length(); i++) {
plainText.append(decodeCharacter(cipherText, i));
}
return plainText.toString();
}
private char decodeCharacter(String cipherText, int index) {
int alphabetIdx = ALPHABET.indexOf(cipherText.toCharArray()[index]) - ALPHABET.indexOf(key.toCharArray()[index]);
if (alphabetIdx < 0) {
alphabetIdx += ALPHABET.length();
}
return ALPHABET.toCharArray()[alphabetIdx];
}
}