2 / 2 / 0
Регистрация: 16.05.2019
Сообщений: 47
1

Побитовое шифрование текста

07.11.2019, 10:55. Показов 9513. Ответов 4

Author24 — интернет-сервис помощи студентам
Случился очередной "затык", помогите пожалуйста реализовать задачу.

Задание 2(case 2): Используя операцию «исключающее ИЛИ», произвести побитовое шифрование текста длиной не менее двух строк стандартного листа А4. Ключ – слово СЕКРЕТ. Вывести на экран исходный, зашифрованный и расшифрованный тексты.

В данном случае под побитным шифрованием подразумевается следующее:

Побитовое шифрование производится над каждым битом двоичного кода символа в сообщении. Для этого каждой букве алфавита ставится в соответствие двоичный код. Для шифрования выбирается ключ – произвольная последовательность символов. Двоичный код каждой буквы сообщения складывается по модулю 2 с двоичным кодом соответствующего символа ключа. Полученный двоичный код преобразуется обратно в символ. В Java эти преобразования выполняются с помощью операции «исключающее ИЛИ».
Ключ по длине должен совпадать с сообщением. Если он меньше, то следует его записать несколько раз без пробелов.
Коды букв представлены в таблице.
Буква А Б В Г Д Е Ж З И К Л М Н О П Р
Код 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
Буква С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я пробел
Код 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 00

Рассмотрим пример. Исходное слово: ЭВМ. Ключ: МТС.
Выписываем из таблицы десятичные коды букв слова ЭВМ: 29 03 12. И коды ключа МТС: 12 18 17. Переводим их в двоичную систему и складываем по модулю 2.

11101 00011 01100
01100 10010 10001

10001 10001 11101
19 19 29

Полученный шифротекст: УУЭ.
Для расшифрования применяется обратная операция: по модулю 2 складываются двоичные коды букв шифрокода и ключа.

P.S. Это шифр Виженера?

Java
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
package work.pkg2;
 
import java.util.Scanner; 
public class Work2 {  
    public static void main(String[] args) { 
        Scanner in = new Scanner(System.in); 
        String text; //задаем текст
        text = "Все умолкает в чертогах мертвых..."; 
        String alfa;//задаем алфавит
        alfa = "абвгдежзиклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫьЭЮЯ!?., "; 
        String key; //задаемключ
        key = "sekret"; 
        int n; 
        int x = 3; 
        while (x != 0) { 
            System.out.println();    
            System.out.println("1 - Кодирование шифром замены"); 
            System.out.println("2 - Побитовое кодирование"); 
            System.out.println("Для выхода введите 0"); 
            System.out.print("Команда №"); 
            x = in.nextInt(); 
            System.out.println(); 
 
            switch (x) { 
                case 1: {  
                    System.out.print("Введите величину сдвига:"); 
                    n = in.nextInt(); 
                    char[] textArray = text.toCharArray(); 
                    char[] alfaArray = alfa.toCharArray(); 
                    text.getChars(0, text.length(), textArray, 0); 
                    alfa.getChars(0, alfa.length(), alfaArray, 0); 
                    for (int i = 0; i<textArray.length; i++) { 
                        for (int j = 0; j <alfaArray.length; j++) { 
                            if (textArray[i] == alfaArray[j]) { 
                                textArray[i] = alfaArray[(j + n) % alfaArray.length]; 
                                break; 
                            } 
                        } 
                    } 
                    
                    System.out.print("Текст: "); 
                    System.out.println(text); 
                    System.out.print("Закодированный текст: "); 
                    System.out.println(textArray); 
                    break; 
                } 
 
                case 2: { 
                    System.out.print("Текст: "); 
                    System.out.println(text); 
                    System.out.print("Ключ: "); 
                    System.out.println(key); 
                    //!?
 
 
                } 
            } 
        } 
    } 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2019, 10:55
Ответы с готовыми решениями:

Побитовое шифрование файлов
Народ, срочно нужна помощь, мне нужна зашифровать файл путем наложение на него другого файла за...

Как реализовать побитовое шифрование файла в Bash?
И вообще как в Bash работать с битами?

Шифрование текста, табличная замена текста
Один из простейших способов шифровки текста состоит в табличной замене каждого символа другим...

Шифрование текста
Здравствуйте, заранее прошу прощения за тугой вопрос, т.к. только начал изучать С# и сразу же...

4
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
07.11.2019, 11:37 2
причем тут шифр виженера, у тебя же конкретный алгоритм расписан, какие сдвиги, чо ты вообще делаешь?
0
66 / 43 / 24
Регистрация: 18.08.2019
Сообщений: 129
07.11.2019, 17:36 3
Лучший ответ Сообщение было отмечено Катара как решение

Решение

Катара, у тебя ключ латиницей и закодировать его в твоем коде невозможно, т.к. латиницы нет в alfa.
Ниже код, который кодирует туда-сюда, но на символах отсутствующих в alfa, а также на символах "?.," он будет падать.
Кликните здесь для просмотра всего текста
Java
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
import java.util.Scanner;
import java.util.stream.IntStream;
 
public class Crypto {
    static String alfa = "абвгдежзиклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫьЭЮЯ !?.,"; 
    public static void main(String[] args) {
        String ret;
        Scanner sc = new Scanner(System.in);
        System.out.print("Введите строку:");
        String str = "просто пример строки"; //sc.nextLine();
        System.out.print("Введите строку:");
        String key = "ключ"; //sc.nextLine();
        System.out.println("");
        System.out.println(str);
        System.out.println(key);
        ret = cryptStr(str, key);
        System.out.println("туда");
        System.out.println(ret);
        ret = cryptStr(ret, key);
        System.out.println("обратно");
        System.out.println(ret);
        
    }
 
    private static String cryptStr(String str, String key) {
        int[] codeStr = str.chars().map(i -> alfa.indexOf(i)).toArray();
        int[] codeKey = IntStream.range(0, codeStr.length / key.length() + 2)
                                 .flatMap(i -> key.chars())
                                 .map(i -> alfa.indexOf(i))
                                 .limit(codeStr.length)
                                 .toArray();
        StringBuilder res = new StringBuilder();
        IntStream.range(0, codeStr.length)
                 .map(i -> (codeStr[i] ^ codeKey[i]))
                 .map(i -> alfa.charAt(i))
                 .forEach(c -> res.append((char)c));
        return res.toString();
    }
    
}
1
2 / 2 / 0
Регистрация: 16.05.2019
Сообщений: 47
07.11.2019, 19:41  [ТС] 4
Сдвиги это первая часть задания по которой вопросов нет, тема относится только к "case 2"

Добавлено через 3 минуты
А можно пожалуйста максимально нубовским способом?
0
66 / 43 / 24
Регистрация: 18.08.2019
Сообщений: 129
07.11.2019, 23:21 5
Лучший ответ Сообщение было отмечено Катара как решение

Решение

В main все прозрачно, а cryptStr вот
Java
1
2
3
4
5
6
7
8
9
10
11
    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();
    }
1
07.11.2019, 23:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2019, 23:21
Помогаю со студенческими работами здесь

Шифрование текста
Подскажите пожалуйста!Как открыть текстовый фаил.txt и если в нём есть строки то зашифровать их?...

Шифрование текста
нужно сделать такую программу : загрузить текстовый файл в мемо поле(или еще чтото наглядное),...

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

Шифрование текста
Всем привет!!! кто подскажет каким образом можно зашифровать текст при записи в текстовый файл и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru