Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шифр Гронсфельда / 8 сообщений из 8, страница 1 из 1
13.06.2018, 15:18
    #39660351
Vvvv111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шифр Гронсфельда
Нужно сделать так, чтобы если номер символа (encrypted_message[count]) при шифровке был больше 255 (ASCII кодировка) то шифровался по формуле:

Код: plaintext
encrypted_message[count]=encrypted_message[count]-224. 

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

Код: plaintext
encrypted_message[count]=encrypted_message[count]+32
,

но как реализовать это в коде не знаю.
Код: sql
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.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

int main(){
    setlocale(0, "");
    int count, j;
    char key[20];
    char message[100];
    std::ifstream fin("E:\\message.txt", std::ios::in);
    if (fin.is_open()) {
        fin.getline(message, 50);
        fin.close();
    }
    printf("\nEnter Key:\t");
    fflush(stdin);
    scanf("%[^\n]s", key);
    int message_length = strlen(message), key_length = strlen(key);
    char temp_key[message_length], encrypted_message[message_length], decrypted_message[message_length];
    for (count = 0, j = 0; count < message_length; ++count, ++j) {
        if (j == key_length) {
            j = 0;
        }
        temp_key[count] = key[j];
    }
    temp_key[count] = '\0';
    count = 0;
    while (count < message_length) {
        encrypted_message[count] = ((message[count] + (temp_key[count] - 48)));
        count = count + 1;
    }
    for (int count = 0; count < message_length; count + 1)
        encrypted_message[count] = '\0';
    count = 0;
    while (count < message_length) {
        decrypted_message[count] = ((encrypted_message[count] - (temp_key[count] - 48)));
        count = count + 1;
    }
    decrypted_message[count] = '\0';
    printf("\n-------------------------------\n");
    printf("\nIntial String:\t%s", message);
    printf("\nKey:\t%s", key);
    printf("\nGenerated Key:\t%s", temp_key);
    printf("\nEncrypted Message:\t%s", encrypted_message);
    printf("\nDecrypted Message:\t%s", decrypted_message);
    return 0;
}
...
Рейтинг: 0 / 0
13.06.2018, 15:30
    #39660353
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шифр Гронсфельда
Vvvv111, я ничего не понял. Научитесь выражать мысль и писать читаемый код.
...
Рейтинг: 0 / 0
13.06.2018, 16:52
    #39660394
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шифр Гронсфельда
Vvvv111,

понятно, алфавит мощностью 224 (256 кодов из "полной" таблицы ASCII минус 32 "первых" непечатных символа).

Скажи, что вот это такое:
Код: plaintext
1.
temp_key[count]-48


Почему именно 48? Ты где-то взял этот код, "там так было"?
...
Ты учитываешь, что char - это знаковый тип? Ну, то, что коды от 0 до 127 - положительные, а остальные - отрицательные (обратный дополнительный код)?
...
Отформатируй код, пожалуйста, и подпиши в комментариях, что ты делаешь в каждом блоке, непонятно ибо.
...
Рейтинг: 0 / 0
13.06.2018, 19:24
    #39660474
Vvvv111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шифр Гронсфельда
Котовасия, единице соответствует 49 код в ASCII кодировке, и для корректного ввода вычитаем 48, т.е. при вводе ключа 1 (49-48=1) к символьному коду буквы прибавляется 1, и так далее с другими цифрами
...
Рейтинг: 0 / 0
13.06.2018, 19:46
    #39660479
Vvvv111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шифр Гронсфельда
Вот полная формулировка задания, может так понятнее будет.
Задание
Код: plaintext
Программа, шифрующая и дешифрующая обыкновенные текстовые ASCII файлы с помощью  усовершенствованного шифра Гронсфельда.

Указание:
Код: plaintext
1.
2.
3.
Шифр Гронсфельда имеет ключ - 5 (в нашем случае любое количество) цифр. Шифруемый текст разбивается на группы символов (пробелы - не исключение) по числу цифр в ключе. 
Код первого символа группы увеличивается на число, соответствующее первой цифре ключа, код второго на число, соответствующее второй цифре ключа и т.д.  
При этом коды меньше 32 (т.н. управляющие символы) преобразованию не  подлежат 
(во избежание повреждения структуры файла и других неприятных последствий). При де-шифровке производится обратный процесс (уменьшение кодов).

Если полученный при шифровании код КОД больше 255, применяем формулу КОД = КОД - 224.
Если полученный при дешифрировании код КОД меньше 32 применяем формулу КОД = КОД + 224.
Таким образом, зацикливаем последовательность кодов 32 - 255.
Естественно, при шифровке и дешифровке программа должна запраши-вать у пользователя ключ.
...
Рейтинг: 0 / 0
13.06.2018, 20:00
    #39660487
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шифр Гронсфельда
Vvvv111Вот полная формулировка задания, может так понятнее будет.

Главная непонятка в том какое место из этого очень простого задания у тебя вызывает
затруднение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.06.2018, 21:46
    #39660517
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шифр Гронсфельда
Vvvv111Вот полная формулировка задания, может так понятнее будет.
Программа, шифрующая и дешифрующая обыкновенные текстовые ASCII файлы с помощью усовершенствованного шифра Гронсфельда.
Указание: Шифр Гронсфельда имеет ключ - 5 (в нашем случае любое количество) цифр. Шифруемый текст разбивается на группы символов (про-белы - не исключение) по числу цифр в ключе. Код первого символа группы увеличивается на число, соответствующее первой цифре ключа, код второго на число, соответствующее второй цифре ключа и т.д. При этом коды меньше 32 (т.н. управляющие символы) преобразованию не подлежат (во избежание повреждения структуры файла и других неприятных последствий). При де-шифровке производится обратный процесс (уменьшение кодов).
Если полученный при шифровании код КОД больше 255, применяем формулу КОД = КОД - 224.
Если полученный при дешифрировании код КОД меньше 32 применяем формулу КОД = КОД + 224.
Таким образом, зацикливаем последовательность кодов 32 - 255.
Естественно, при шифровке и дешифровке программа должна запраши-вать у пользователя ключ.
Я надеюсь ты не пишешь весь свой код спложной простыней без отступов. Обрати на это внимание.
Пришлось отформатировать за тебя.

По коду. Подобного рода утилиты удобно разрабатывать через TDD. Тоесть ты сначала пишешь набор тестов.
Вбиваешь в них константы которые ты заведомом знаешь либо они пришли из ТЗ. И далее пишешь код таким
образом чтобы эти тесты стали инвариантом по отношению к твоему коду. Работу с файлами нужно временно
выкинуть. И добавить ее в самом последнем этапе когда модульные тесты вошли в зеленый сектор. После
этого софт готов.

Почему это важно? Поясню. Если ты где-то напортачил с форматным выводом или вводом в файл - у тебя в коде
будет комплексная ошибка и тебе сложно будет понять на какой фазе она возникла. В дешифровании или
в чтении файла.
...
Рейтинг: 0 / 0
13.06.2018, 22:10
    #39660524
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шифр Гронсфельда
Тут даже я впал бы в ступор...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Шифр Гронсфельда / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]