Шифрование методом гаммирования java

Шифрование данных методом гаммирования и поразрядного циклического сдвига

* Условие задачи.
*
* Разработать программу текстовый редактор с функциями криптозащиты данных. В
* приложении для реализации алгоритма шифрования при сохранении данных в файле
* и расшифрования данных (при чтении из файла), использовать метод гаммирования
* и поразрядного циклического сдвига.
*
* Алгоритм шифрования:
* для блока данных заданного размера берется такого же размера фрагмент
* гаммы и выполняется операция поразрядного исключающего «ИЛИ», далее,
* выполняется операция поразрядного циклического сдвига на заданное число бит
* влево или вправо с полученным новым блоком.
*
* Алгоритм расшифрования:
* Расшифрование выполняется в обратном порядке, вначале
* циклический сдвиг в противоположную сторону, а затем операция поразрядного
* исключающего «ИЛИ» с блоками той же самой гаммы.
*
* Для получения гаммы можно использовать стандартный воспроизводимый генератор
* псевдослучайный чисел (значение начальной инициализации является частью
* секретного ключа, другой частью ключа является размер поразрядного сдвига и
* его направление).
*
* Условия:
* — циклический сдвиг влево на 1 бит
* — размер обрабатываемого блока: 1 байта
*
******************************************************************************

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
/** * **************************************************************************** * * * Условие задачи. * * Разработать программу текстовый редактор с функциями криптозащиты данных. В * приложении для реализации алгоритма шифрования при сохранении данных в файле * и расшифрования данных (при чтении из файла), использовать метод гаммирования * и поразрядного циклического сдвига. * * Алгоритм шифрования: * для блока данных заданного размера берется такого же размера фрагмент * гаммы и выполняется операция поразрядного исключающего «ИЛИ», далее, * выполняется операция поразрядного циклического сдвига на заданное число бит * влево или вправо с полученным новым блоком. * * Алгоритм расшифрования: * Расшифрование выполняется в обратном порядке, вначале * циклический сдвиг в противоположную сторону, а затем операция поразрядного * исключающего «ИЛИ» с блоками той же самой гаммы. * * Для получения гаммы можно использовать стандартный воспроизводимый генератор * псевдослучайный чисел (значение начальной инициализации является частью * секретного ключа, другой частью ключа является размер поразрядного сдвига и * его направление). * * Условия: * - циклический сдвиг влево на 1 бит * - размер обрабатываемого блока: 1 байта * ******************************************************************************/ import java.util.*; import java.io.*; public class Crypt { public static void main(String[] args) throws IOException { BufferedReader IN=new BufferedReader(new InputStreamReader(System.in)); System.out.print("Введите строку: "); String str=IN.readLine(); System.out.println("Ключ: "); int key=IN.read(); GAMMO x=new GAMMO(str, key); x.Print(); System.out.println("Шифрование.."); x.SHIFR(); x.Print(); System.out.println("Расшифровывание.."); x.DESHIFR(); x.Print(); } } class GAMMO{ private String DATA; private int KEY; GAMMO(){ this.DATA=""; this.KEY=0; } GAMMO(String D,int K){ this.DATA=D; this.KEY=K; } //////////////////////////////////////////////////////////////////////////////// void SHIFR() Random R=new Random(KEY); byte[] X=DATA.getBytes(), Y=new byte[DATA.length()]; byte Gamma; for (int i=0; iDATA.length(); i++){ Gamma=(byte)R.nextInt(); Y[i]=(byte)(X[i] ^ Gamma); X[i]=(byte)(Y[i] & 0x80); X[i]=(byte)(X[i]>>>=7); Y[i]=(byte)(Y[i]<1); Y[i]=(byte)(Y[i]  DATA=new String(Y); } //////////////////////////////////////////////////////////////////////////////// void DESHIFR() Random R=new Random(KEY); byte[] X=DATA.getBytes(), Y=new byte[DATA.length()]; byte Gamma; for (int i=0; iDATA.length(); i++){ Y[i]=(byte)(X[i] & 0x01); Y[i]=(byte)(Y[i]<7); X[i]=(byte)(X[i]>>>1); X[i]=(byte)(X[i]  DATA=new String(Y); } void Print(){System.out.println("Строка: "+DATA);} }

Вроде бы код правильный, но не знаю почему не расшифровывает нормально. Все испробовал(

Источник

Шифрование и дешифрование методом гаммирования и поразрядного циклического сдвига

Добрый день!
У меня не получается шифрование и расшифрование методом гаммирования и поразрядного циклического сдвига.
Размер обрабатываемого блога 2 байта, а поразрядный циклический сдвиг влево на 3 бита.
Я хочу ввести любое слово, а он выводит только цифры, что делать, где ошибка, в чём проблема?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
package dz1; import java.util.*; public class DZ1  public static void myGamma(byte [] in, byte [] out, int key) { Random r1=new Random(key); for(int i=0; iin.length; i+=2) { short a1, a2; short gam=(short)r1.nextInt(); a1=in[i]; a1<=8; if (i+1in.length) { a2=in[i+1]; a2&=0xff; a1 // При расшифровании сдвиг для a1 a1>>=3; a2=(short)(a1 ^ gam); // Сдвиг при шифровании для a2 a2<=3; if (i+1in.length) out[i+1]=(byte)a2; a2>>>=8; out[i]=(byte)a2; } } public static void main(String[] args) { // TODO code application logic here int key=12; byte [] b1={10, 20, 30, 40, 50, 60, 70}; String str="Hello World"; b1=str.getBytes(); byte [] b2=new byte[b1.length]; byte [] b3=new byte[b1.length]; myGamma(b1, b2, key); for(int i=0; ib2.length; i++) System.out.print(b2[i]+" "); System.out.println(); System.out.println(); myGamma(b2, b3, key); for(int i=0; ib3.length; i++) System.out.print(b3[i]+" "); String str3=new String(b3); } }

Шифрование и расшифрование методом гаммирования и поразрядного циклического сдвига
Добрый день! У меня не получается написать программу шифрования и расшифрования методом.

Выполнить шифрование/дешифрование строки символов, используя операцию циклического сдвига байтов
Выполнить шифрование/де шифрование строчки(рядка) символов, используя операцию циклического здвига.

Шифрование текста методом циклического сдвига букв алфавита
помогите пожалуйста решить задачи))) Задача№1 Составить программу, которая вводит текст.

Шифрование/дешифрование данных в режиме однократного гаммирования
Как можно шифровать и дешифровать данные в режиме однократного гаммирования?

for(int i=0; ib3.length; i++) System.out.print(b3[i]+" "); String str3=new String(b3);
System.out.print(new String(b3));

ЦитатаСообщение от verylazy Посмотреть сообщение

for(int i=0; ib3.length; i++) System.out.print(b3[i]+" "); String str3=new String(b3);
System.out.print(new String(b3));

потому что это функция строки, я нашёл в документации, тем более надо генератор псевдослучайных чисел

а вывод, т.е расшифровка вот так? System.out.print(new String(b1));

Я не разбираюсь в шифровке/расшифровке, просто показал два куска кода, которые мне показались . бредовыми или ненужными.
— объявляем массив byte с какими-то цифрами, а потом через строку переопределяем его wtf ?
— печатаем в цикле байты, а только потом делаем строку, которую как-бы и надо вывести на экран

xparovozx, я в прошлой теме скидывал рабочий код вашего шифра, там и генератор псевдослучайных чисел есть и сдвиги тоже

Народ, вот я сделал с циклическим сдвигом, правильно ли я сделал, шифрование/расшифрование не работает (не правильно), где ошибка? Лишнее есть где нибудь? В чём дело?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
package dz1; import java.util.*; public class DZ1  public static void myGamma1(byte [] in, byte [] out, int key) { Random r1=new Random(key); for(int i=0; iin.length; i+=2) { short a1, a2; short gam=(short)r1.nextInt(); a1=in[i]; a1<=8; if (i+1in.length) { a2=in[i+1]; a2&=0xff; a1 short maska=(short)0xe000; short rez; gam=(short)r1.nextInt(); a2=(short)(a1 ^ gam); rez=(short)(a2 & maska); rez>>=5; a2<=3; a2+=rez; if (i+1in.length) out[i+1]=(byte)a2; a2>>>=8; out[i]=(byte)a2; } } public static void myGamma2(byte [] in, byte [] out, int key)  Random r1=new Random(key); for(int i=0; iin.length; i+=2) { short a1, a2; short gam=(short)r1.nextInt(); a1=in[i]; a1<=8; if (i+1in.length) { a2=in[i+1]; a2&=0xff; a1 short maska=0x07, maska2=0x1f; short rez; rez=(short)(a1 & maska); a1>>=3; a1&=maska2; a1+=rez; rez<=5; gam=(short)r1.nextInt(); a2=(short)(a1 ^ gam); if (i+1in.length) out[i+1]=(byte)a2; a2>>>=8; out[i]=(byte)a2; } } public static void main(String[] args) { int key=12; byte [] b1={10, 20, 30, 40, 50, 60, 70}; String str="Hello World привет"; b1=str.getBytes(); byte [] b2=new byte[b1.length]; byte [] b3=new byte[b1.length]; for(int i=0; ib1.length; i++) System.out.print(b1[i]+" "); myGamma1(b1, b2, key); System.out.println(); System.out.println(); for(int i=0; ib2.length; i++) System.out.print(b2[i]+" "); System.out.println(); System.out.println(); myGamma2(b2, b3, key); for(int i=0; ib3.length; i++) System.out.print(b3[i]+" "); System.out.println(); System.out.println(); System.out.print(new String(b3)); System.out.println(); System.out.print(new String(b1)); } }

Источник

Побитовое шифрование (по модулю 2)

По заданию нужно реализовать шифр гаммирования по модулю 2. При данном способе шифрования символы текста и гаммы представляются в двоичном виде, а затем каждая пара двоичных разрядов складывается по модулю 2.

Даны только заглавные буквы русского алфавита. Двоичный код символов нужно брать по Windows 1251. Начинаем с буквы «А», то есть её десятеричное представление — это 192, а двоичное — 1100 0000 . Заканчиваем символом «Я», двоичное представление — 223, десятеричное — 1101 1111.

Пример шифрования:
Пример шифрования сообщения «ВОВА» с помощью ключа «ЮЛЯ». Так как длина ключа меньше длины открытого сообщения, то для генерации гаммы он циклически повторяется. Пример показан на картинке.

У меня же символы начинаются с 1. Не могу переделать, чтобы они начинались с 192. Также программа отказывается работать без пробела, пришлось его в конце добавить, но он лишний, не могу он него избавиться.
Ещё нужно вывести двоичное представление исходного текста, гаммы (ключа) и зашифрованного сообщения.
Также у меня не получается в этой программе сделать ввод с клавиатуры.

Подскажите, пожалуйста, как можно исправить в программе все эти моменты?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
package com.company; import java.util.Scanner; public class Main { static String alfa = "АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫьЭЮЯ "; public static void main(String[] args) { String ret; Scanner scanner = new Scanner(System.in); //String str = scanner.toString(); String str = "ВОВА"; //sc.nextLine(); //String key = scanner.toString(); String key = "ЮЛЯ"; //sc.nextLine(); //System.out.println(""); System.out.print("Введите текст: "); System.out.println(str); System.out.print("Введите гамму (ключ): "); System.out.println(key); ret = cryptStr(str, key); System.out.print("Зашифрованный текст: "); System.out.println(ret); ret = cryptStr(ret, key); System.out.print("Расшифрованный текст: "); System.out.println(ret); } private static String cryptStr(String str, String key) { StringBuilder res = new StringBuilder(); char[] codeKey = key.toCharArray(); // разложили ключ в байты for (int i = 0; i  codeKey.length; i++) codeKey[i] = (char) alfa.indexOf(codeKey[i]); // привели символы к номерам символов в alfa char[] codeStr = str.toCharArray(); // разложили строку в байты for (int i = 0; i  codeStr.length; i++) { codeStr[i] = (char) alfa.indexOf(codeStr[i]); // привели символ к номеру из alfa res.append(alfa.charAt(codeStr[i] ^ codeKey[i % codeKey.length])); // сохранили символ alfa с номером XOR кодов } return res.toString(); } }

Источник

Читайте также:  Python turtle color list
Оцените статью