Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/55: Рейтинг темы: голосов - 55, средняя оценка - 4.73
2 / 2 / 0
Регистрация: 16.05.2019
Сообщений: 47

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

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

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

Задание 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.11.2019, 10:55
Ответы с готовыми решениями:

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

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

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

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

Решение

Катара, у тебя ключ латиницей и закодировать его в твоем коде невозможно, т.к. латиницы нет в 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  [ТС]
Сдвиги это первая часть задания по которой вопросов нет, тема относится только к "case 2"

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

Решение

В 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.11.2019, 23:21
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru