import java.io.*;
public class LFSR {
static FileWriter keyIn
= null; //запись ключа при шифрации
try{
out
= new FileWriter(args
[1],
false); //файл для записи шифротекста if(args[3].equals("-cod")) coding(args[2]); //шифрация, передаем путь для ключа
else if(args[3].equals("-decod")) decoding(args[2]); //дешифрация
else {
System.
out.
println("\nЗадан неверный флаг "+ args
[3] + " допустимы -cod (шифрация) и -decod (дешифрация)"); }
System.
out.
println("\nШифрование: LFSR In.txt Out.txt. Key.txt -cod, где\n" + "In - файл, который требуется зашифровать\n"
+ "Out - файл, куда будет записан шифрованный текст\n"
+ "Key - файл, куда будет записан 16-битный ключ\n"
+ "-cod - команда шифрации\n"
+ "\nДешифрация: LFSR In.txt Out.txt. Key.txt -decod, где\n"
+ "In - файл, который требуется расшифровать\n"
+ "Out - файл, куда будет записан расшифрованный текст\n"
+ "Key - файл с 16-битным ключом\n"
+ "-decod - команда дешифрации\n");
System.
out.
println("\nФайл " + args
[0] + " не найден."); }
System.
out.
println("Successfully"); }
int key[] = new int[16];
for(int r = 0; r < key.length; r++)
key[r]=rand.nextInt(2);
return key;
}
public static long getGamma(int key[]) { //гамма 32 бит
int n = key.length; //длина регистра
int S = 0;
for (int t = 0; t < 32; t++) { // формирование гаммы с использованием многочлена
S = (key[n-1]);
S = ((( (S >> 15) ^ (S >> 4) ^ (S >> 2) ^ (S >> 1) ^ S ) & 0x00000001 ) << 15 ) | (S >> 1);
for (int i = n-1; i > 0; i--) //сдвиг ячеек регистра
key[i] = key[i-1];
key[0] = S; //запись сформированного бита
if(S>0) g += 1; //формирование гаммы
else g += 0;
}
return Long.
parseLong(g,
2); }
public static void overlayGamma
(long gamma
) throws IOException{ while((line = in.readLine()) != null)
for(int i = 0; i < line.length(); i++)
out.write((char)(line.charAt(i) ^ gamma));
}
int key[] = getKey(); //формирование ключа, инициализация регистра
try{
for(int i = 0; i < key.length; i++) //запись ключа в файл
keyIn.
write(Integer.
toString(key
[i
])); overlayGamma(getGamma(key)); //наложение полученной гаммы на открытый текст
} finally{
out.close();
in.close();
keyIn.close();
}
}
int key[] = new int[16];
try{
if((k = keyOut.readLine()) != null);
for(int i = 0; i < k.length(); i++) //получаем ключ
overlayGamma(getGamma(key)); //наложение полученной гаммы на шифротекст
System.
out.
println("\nФайл с ключом " + path
+ " не найден."); }
finally{
keyOut.close();
out.close();
in.close();
}
}
}
aW1wb3J0IGphdmEuaW8uKjsKcHVibGljIGNsYXNzIExGU1IgewogICAgc3RhdGljIEZpbGVXcml0ZXIgb3V0ID0gbnVsbDsgLy/QvtGC0LrRgNGL0YLRi9C5INGE0LDQudC7CiAgICBzdGF0aWMgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOyAvL9GI0LjRhNGA0L7QstCw0L3QvdGL0LkgICAgCiAgICBzdGF0aWMgRmlsZVdyaXRlciBrZXlJbiA9IG51bGw7IC8v0LfQsNC/0LjRgdGMINC60LvRjtGH0LAg0L/RgNC4INGI0LjRhNGA0LDRhtC40LgKICAgIHN0YXRpYyBCdWZmZXJlZFJlYWRlciBrZXlPdXQgPSBudWxsOyAvL9GH0YLQtdC90LjQtSDQutC70Y7Rh9CwINC/0YDQuCDQtNC10YjQuNGE0YDQsNGG0LjQuCAgIAogICAgCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb257IAogICAgICAgIHRyeXsKICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVXcml0ZXIoYXJnc1sxXSwgZmFsc2UpOyAvL9GE0LDQudC7INC00LvRjyDQt9Cw0L/QuNGB0Lgg0YjQuNGE0YDQvtGC0LXQutGB0YLQsAogICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzWzBdKSk7ICAvL9GE0LDQudC7INC+0YLQutGA0YvRgtC+0LPQviDRgtC10LrRgdGC0LAKICAgICAgICAgICAgaWYoYXJnc1szXS5lcXVhbHMoIi1jb2QiKSkgY29kaW5nKGFyZ3NbMl0pOyAvL9GI0LjRhNGA0LDRhtC40Y8sINC/0LXRgNC10LTQsNC10Lwg0L/Rg9GC0Ywg0LTQu9GPINC60LvRjtGH0LAKICAgICAgICAgICAgZWxzZSBpZihhcmdzWzNdLmVxdWFscygiLWRlY29kIikpIGRlY29kaW5nKGFyZ3NbMl0pOyAvL9C00LXRiNC40YTRgNCw0YbQuNGPCiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG7Ql9Cw0LTQsNC9INC90LXQstC10YDQvdGL0Lkg0YTQu9Cw0LMgIisgYXJnc1szXSArICIg0LTQvtC/0YPRgdGC0LjQvNGLIC1jb2QgKNGI0LjRhNGA0LDRhtC40Y8pINC4IC1kZWNvZCAo0LTQtdGI0LjRhNGA0LDRhtC40Y8pIik7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCl7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG7QqNC40YTRgNC+0LLQsNC90LjQtTogTEZTUiBJbi50eHQgT3V0LnR4dC4gS2V5LnR4dCAtY29kLCDQs9C00LVcbiIKICAgICAgICAgICAgKyAiSW4gLSDRhNCw0LnQuywg0LrQvtGC0L7RgNGL0Lkg0YLRgNC10LHRg9C10YLRgdGPINC30LDRiNC40YTRgNC+0LLQsNGC0YxcbiIKICAgICAgICAgICAgKyAiT3V0IC0g0YTQsNC50LssINC60YPQtNCwINCx0YPQtNC10YIg0LfQsNC/0LjRgdCw0L0g0YjQuNGE0YDQvtCy0LDQvdC90YvQuSDRgtC10LrRgdGCXG4iCiAgICAgICAgICAgICsgIktleSAtINGE0LDQudC7LCDQutGD0LTQsCDQsdGD0LTQtdGCINC30LDQv9C40YHQsNC9IDE2LdCx0LjRgtC90YvQuSDQutC70Y7Rh1xuIgogICAgICAgICAgICArICItY29kIC0g0LrQvtC80LDQvdC00LAg0YjQuNGE0YDQsNGG0LjQuFxuIgogICAgICAgICAgICArICJcbtCU0LXRiNC40YTRgNCw0YbQuNGPOiBMRlNSIEluLnR4dCBPdXQudHh0LiBLZXkudHh0IC1kZWNvZCwg0LPQtNC1XG4iCiAgICAgICAgICAgICsgIkluIC0g0YTQsNC50LssINC60L7RgtC+0YDRi9C5INGC0YDQtdCx0YPQtdGC0YHRjyDRgNCw0YHRiNC40YTRgNC+0LLQsNGC0YxcbiIKICAgICAgICAgICAgKyAiT3V0IC0g0YTQsNC50LssINC60YPQtNCwINCx0YPQtNC10YIg0LfQsNC/0LjRgdCw0L0g0YDQsNGB0YjQuNGE0YDQvtCy0LDQvdC90YvQuSDRgtC10LrRgdGCXG4iCiAgICAgICAgICAgICsgIktleSAtINGE0LDQudC7INGBIDE2LdCx0LjRgtC90YvQvCDQutC70Y7Rh9C+0LxcbiIKICAgICAgICAgICAgKyAiLWRlY29kIC0g0LrQvtC80LDQvdC00LAg0LTQtdGI0LjRhNGA0LDRhtC40LhcbiIpOwogICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxu0KTQsNC50LsgIiArIGFyZ3NbMF0gKyAiINC90LUg0L3QsNC50LTQtdC9LiIpOwogICAgICAgICAgICBTeXN0ZW0uZXhpdCgyKTsKICAgICAgICB9IAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3VjY2Vzc2Z1bGx5Iik7CiAgICB9IAogICAgcHVibGljIHN0YXRpYyBpbnQgW10gZ2V0S2V5KCkgdGhyb3dzIElPRXhjZXB0aW9uewogICAgICAgIGludCBrZXlbXSA9IG5ldyBpbnRbMTZdOwogICAgICAgIGphdmEudXRpbC5SYW5kb20gcmFuZCA9IG5ldyBqYXZhLnV0aWwuUmFuZG9tKCk7CiAgICAgICAgZm9yKGludCByID0gMDsgciA8IGtleS5sZW5ndGg7IHIrKykgICAgICAgICAgIAogICAgICAgICAgICAga2V5W3JdPXJhbmQubmV4dEludCgyKTsgICAgICAgCiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRHYW1tYShpbnQga2V5W10pIHsgLy/Qs9Cw0LzQvNCwIDMyINCx0LjRggogICAgICAgIGludCBuID0ga2V5Lmxlbmd0aDsgLy/QtNC70LjQvdCwINGA0LXQs9C40YHRgtGA0LAgICAKICAgICAgICBTdHJpbmcgZyA9ICIiOyAgICAgICAgCiAgICAgICAgaW50IFMgPSAwOyAKICAgICAgICBmb3IgKGludCB0ID0gMDsgdCA8IDMyOyB0KyspIHsgLy8g0YTQvtGA0LzQuNGA0L7QstCw0L3QuNC1INCz0LDQvNC80Ysg0YEg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LXQvCDQvNC90L7Qs9C+0YfQu9C10L3QsAogICAgICAgICAgICBTID0gKGtleVtuLTFdKTsKICAgICAgICAgICAgUyA9ICgoKCAoUyA+PiAxNSkgXiAoUyA+PiA0KSBeIChTID4+IDIpIF4gKFMgPj4gMSkgXiBTICkgJiAweDAwMDAwMDAxICkgPDwgMTUgKSB8IChTID4+IDEpOwogICAgICAgICAgICBmb3IgKGludCBpID0gbi0xOyBpID4gMDsgaS0tKSAvL9GB0LTQstC40LMg0Y/Rh9C10LXQuiDRgNC10LPQuNGB0YLRgNCwCiAgICAgICAgICAgICAgICBrZXlbaV0gPSBrZXlbaS0xXTsgICAgICAgICAgIAogICAgICAgICAgICBrZXlbMF0gPSBTOyAgLy/Qt9Cw0L/QuNGB0Ywg0YHRhNC+0YDQvNC40YDQvtCy0LDQvdC90L7Qs9C+INCx0LjRgtCwCiAgICAgICAgICAgIGlmKFM+MCkgZyArPSAxOyAvL9GE0L7RgNC80LjRgNC+0LLQsNC90LjQtSDQs9Cw0LzQvNGLCiAgICAgICAgICAgIGVsc2UgZyArPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTG9uZy5wYXJzZUxvbmcoZywgMik7ICAgIAogICAgfQogICAgcHVibGljIHN0YXRpYyB2b2lkIG92ZXJsYXlHYW1tYShsb25nIGdhbW1hKSB0aHJvd3MgSU9FeGNlcHRpb257CiAgICAgICAgU3RyaW5nIGxpbmUgPSAiIjsKICAgICAgICB3aGlsZSgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpCiAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoKCk7IGkrKykKICAgICAgICAgICAgICAgb3V0LndyaXRlKChjaGFyKShsaW5lLmNoYXJBdChpKSBeIGdhbW1hKSk7ICAgICAgCiAgICB9CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29kaW5nKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb257ICAgICAgICAgIAogICAgICAgIGludCBrZXlbXSA9IGdldEtleSgpOyAvL9GE0L7RgNC80LjRgNC+0LLQsNC90LjQtSDQutC70Y7Rh9CwLCDQuNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDRgNC10LPQuNGB0YLRgNCwCiAgICAgICAgdHJ5ewogICAgICAgICAgICBrZXlJbiA9IG5ldyBGaWxlV3JpdGVyKHBhdGgsIGZhbHNlKTsKICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKykgLy/Qt9Cw0L/QuNGB0Ywg0LrQu9GO0YfQsCDQsiDRhNCw0LnQuwogICAgICAgICAgICAgICAga2V5SW4ud3JpdGUoSW50ZWdlci50b1N0cmluZyhrZXlbaV0pKTsKICAgICAgICAgICAgb3ZlcmxheUdhbW1hKGdldEdhbW1hKGtleSkpOyAvL9C90LDQu9C+0LbQtdC90LjQtSDQv9C+0LvRg9GH0LXQvdC90L7QuSDQs9Cw0LzQvNGLINC90LAg0L7RgtC60YDRi9GC0YvQuSDRgtC10LrRgdGCCiAgICAgICAgfSBmaW5hbGx5ewogICAgICAgICAgICBvdXQuY2xvc2UoKTsKICAgICAgICAgICAgaW4uY2xvc2UoKTsKICAgICAgICAgICAga2V5SW4uY2xvc2UoKTsKICAgICAgICB9CiAgICB9CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVjb2RpbmcoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbnsKICAgICAgICBpbnQga2V5W10gPSBuZXcgaW50WzE2XTsKICAgICAgICBTdHJpbmcgayA9ICIiOwogICAgICAgIHRyeXsKICAgICAgICAgICAga2V5T3V0ID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHBhdGgpKTsKICAgICAgICAgICAgaWYoKGsgPSBrZXlPdXQucmVhZExpbmUoKSkgIT0gbnVsbCk7CiAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBrLmxlbmd0aCgpOyBpKyspIC8v0L/QvtC70YPRh9Cw0LXQvCDQutC70Y7RhwogICAgICAgICAgICAgICAga2V5W2ldID0gQ2hhcmFjdGVyLmRpZ2l0KGsuY2hhckF0KGkpLDEwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBvdmVybGF5R2FtbWEoZ2V0R2FtbWEoa2V5KSk7IC8v0L3QsNC70L7QttC10L3QuNC1INC/0L7Qu9GD0YfQtdC90L3QvtC5INCz0LDQvNC80Ysg0L3QsCDRiNC40YTRgNC+0YLQtdC60YHRgiAKICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpeyAgICAgICAgICAgIAogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxu0KTQsNC50Lsg0YEg0LrQu9GO0YfQvtC8ICIgKyBwYXRoICsgIiDQvdC1INC90LDQudC00LXQvS4iKTsKICAgICAgICAgICAgU3lzdGVtLmV4aXQoMik7CiAgICAgICAgfSAgCiAgICAgICAgZmluYWxseXsKICAgICAgICAgICAga2V5T3V0LmNsb3NlKCk7CiAgICAgICAgICAgIG91dC5jbG9zZSgpOwogICAgICAgICAgICBpbi5jbG9zZSgpOwogICAgICAgIH0KICAgIH0KfQ==