Реализовал сам шифр Виженера, затестил всем алфавитом (английским), разные вводы пробовал, все идеально отрабатывало и при -e, и при -d. Однако валидатор решил, что неправильно дешифрует. Только что, пока создавал вопрос, решил, что все из-за использования русских букв (isLetter на них работает? Интересно, ответьте, кому известно) или вроде того. Сделал шифровку строго английского алфавита через ASCII номера. Все равно валидатор отвечает, что не дешифрует, хотя на практике дешифрует все и правильно.
Пример:
Изначальный текст
qwertyuiopasdfghjklzxcvbnm
Зашифрованный
htjjnxugribwklknlgoquhnvmm
Дешифрованный
qwertyuiopasdfghjklzxcvbnm
Как можно увидеть, все хорошо отработало. При этом ключ тоже сложный, там 100% были выходы за количество букв в алфавите и все эти выходы учтены и правильно обработаны. В чем проблема? Если это проблема валидатора (потому что один человек из похожего вопроса тоже жаловался, что -d не хочет принимать), то я сделаю банальное шифрование каждого символа на фиксированное число.package com.javarush.task.task18.task1826;
/*
Шифровка
*/
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
public class Solution {
private static String keyword = "qwertyzxcsadgfdfbvc";
public static void main(String[] args) {
ArrayList<String> content = new ArrayList<>();
try {
BufferedReader reader = new BufferedReader(new FileReader(args[1]));
PrintWriter writer = new PrintWriter(args[2]);
while(reader.ready())
content.add(reader.readLine());
if(args[0].equals("-e"))
for(String s : content)
writer.println(encode(s));
if(args[0].equals("-d"))
for(String s : content)
writer.println(decode(s));
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static String encode(String input) {
char[] text = input.toCharArray();
char[] key = keyword.toCharArray();
for(int i = 0, k = 0; i < text.length; i++) {
if((text[i] >= 'a' && text[i] <= 'z') || (text[i] >= 'A' && text[i] <= 'Z')) {
char ta = Character.isUpperCase(text[i]) ? (char) (text[i] - 65) : (char) (text[i] - 97);
char ka = Character.isUpperCase(key[k%key.length]) ? (char) (key[k%key.length] - 65) : (char) (key[k%key.length] - 97);
if(Character.isUpperCase(text[i]))
text[i] = (char) ((ta + ka + 1) % 26 + 65);
else
text[i] = (char) ((ta + ka + 1) % 26 + 97);
k++;
}
}
return String.copyValueOf(text);
}
private static String decode(String input) {
char[] text = input.toCharArray();
char[] key = keyword.toCharArray();
for(int i = 0, k = 0; i < text.length; i++) {
if((text[i] >= 'a' && text[i] <= 'z') || (text[i] >= 'A' && text[i] <= 'Z')) {
char ta = Character.isUpperCase(text[i]) ? (char) (text[i] - 65) : (char) (text[i] - 97);
char ka = Character.isUpperCase(key[k%key.length]) ? (char) (key[k%key.length] - 65) : (char) (key[k%key.length] - 97);
if(Character.isUpperCase(text[i]))
text[i] = (char) ((26 + (ta - ka - 1)) % 26 + 65);
else
text[i] = (char) ((26 + (ta - ka - 1)) % 26 + 97);
k++;
}
}
return String.copyValueOf(text);
}
}