Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2018, 15:17   #1
Vvvv11
 
Регистрация: 03.06.2018
Сообщений: 5
По умолчанию Шифр Гронсфельда

Нужно сделать так, чтобы если номер символа (encrypted_message[count]) при шифровке был больше 255 (ASCII кодировка) то шифровался по формуле: encrypted_message[count]=encrypted_message[count]-224. П.с. у меня при получении числа символа больше 255, отсчет начинается с начала, и тогда нужна формула encrypted_message[count]=encrypted_message[count]+32, но как реализовать это в коде не знаю.
Код:
#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; 
}
Vvvv11 вне форума Ответить с цитированием
Старый 13.06.2018, 16:56   #2
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
По умолчанию

Код:
int message_length = strlen(message), key_length = strlen(key);
	char temp_key[message_length], encrypted_message[message_length], decrypted_message[message_length];
Что это делает? объясни плиз.
2Lui вне форума Ответить с цитированием
Старый 13.06.2018, 17:15   #3
Vvvv11
 
Регистрация: 03.06.2018
Сообщений: 5
По умолчанию

Цитата:
Сообщение от 2Lui Посмотреть сообщение
Код:
int message_length = strlen(message), key_length = strlen(key);
	char temp_key[message_length], encrypted_message[message_length], decrypted_message[message_length];
Что это делает? объясни плиз.
переменной message_length присваивается длинна сообщения, а переменной key_length длинна ключа, потом обьявляются массивы куда заносятся ключ(temp_key[message_length]), зашифрованное сообщение (encrypted_message[message_length]), и расшифрованное сообщение decrypted_message[message_length];
Vvvv11 вне форума Ответить с цитированием
Старый 13.06.2018, 17:21   #4
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
По умолчанию

Такое конструкции лучше избегать потому что этот массив обычно размещается в стеке, размер которого ограничен, причём нет возможности проверить наличие места - если места не хватит, то программа в лучшем случае аварийно завершится, а может и просто вести себя непредсказуемо
Код:
char* temp_key = new char[message_length], 
	char* encrypted_message = new char[message_length],
	char* decrypted_message = new char[message_length];
2Lui вне форума Ответить с цитированием
Старый 13.06.2018, 17:41   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Vvvv11 Посмотреть сообщение
Код:
count = 0; 
while(count < message_length) 
{ 
encrypted_message[count] = ((message[count] + (temp_key[count]-48))); 
count = count + 1; 
}
попробуйте так:
Код:
for (int i = 0; i < message_length; i++)
{
  int tmp = ((message[i] + (temp_key[i]-48)));
  if(tmp > 255){
     tmp -= 224;
  }
  encrypted_message[i] = (char)tmp; 
}
или так:
Код:
for (int i = 0; i < message_length; i++)
{
  if((encrypted_message[i] + temp_key[i])>(255+48)) 
    encrypted_message[i] = (encrypted_message[i] - 48 - 224 + temp_key[i]);
  else
    encrypted_message[i] = (encrypted_message[i] - 48 + temp_key[i]);
}
p.s. вообще-то лучше не привязывать код к таблице ASCII.
лучше разместить алфавит в своей программе и по нему находить порядковый номер символа в своём алфавите и вычислять новое значение (новый символ).

см. например, тему на форуме:
http://programmersforum.ru/showthread.php?t=222296

Последний раз редактировалось Serge_Bliznykov; 13.06.2018 в 17:44.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.06.2018, 18:15   #6
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
По умолчанию

Код:
#include "stdafx.h"
#include <string> 
#include <iostream> 
#include <fstream> 
#pragma warning(disable : 4996)

using namespace std;
int main()
{
	setlocale(0, "");
	char key[20];
	char message[100];
	std::ifstream fin("d:\\message.txt", std::ios::in);
	if (!fin.is_open()) throw("error");
	fin.getline(message, 50);
	fin.close();
	printf("\nEnter Key:");
	fflush(stdin);
	scanf("%[^\n]s", key);
	int message_length = strlen(message), key_length = strlen(key);
	char* temp_key = new char[message_length] {0};
	char* encrypted_message = new char[message_length] {0};
	char* decrypted_message = new char[message_length] {0};
	for (int i = 0, j = 0; i < message_length-1; i++, j++)
	{
		if (key[i] == '\0') j = 0;
		temp_key[i] = key[j];
	}
	for (int i = 0; i < message_length-1; i++)
	{
	 int temp = ((message[i] + (temp_key[i] - 48)));
	 if (temp > 255) 	temp -= 224;
	 encrypted_message[i] = (char)temp;
	}
	for(int i = 0;i < message_length-1;i++)
		decrypted_message[i] = ((encrypted_message[i] - (temp_key[i] - 48)));
	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\n", decrypted_message);
	delete[]temp_key, encrypted_message, decrypted_message;
	system("pause");
	return 0;
}
Все работает теперь.
2Lui вне форума Ответить с цитированием
Старый 13.06.2018, 18:38   #7
Vvvv11
 
Регистрация: 03.06.2018
Сообщений: 5
По умолчанию

Где библиотеку #include "stdafx.h" взять можно?
Vvvv11 вне форума Ответить с цитированием
Старый 13.06.2018, 18:50   #8
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
По умолчанию

Это у меня Visual Studio просто
удалите и все она не нужна вам. А да и путь к файлу свой укажите у меня просто диск Д

Последний раз редактировалось 2Lui; 13.06.2018 в 19:05.
2Lui вне форума Ответить с цитированием
Старый 13.06.2018, 19:08   #9
Vvvv11
 
Регистрация: 03.06.2018
Сообщений: 5
По умолчанию

Ключ сломался, он должен дублироваться (из 153 должен быть 153153153153153 под длину сообщения),

Вот полная формулировка, задания, может так понятнее будет что именно требуется.

Программа, шифрующая и дешифрующая обыкновенные текстовые ASCII файлы с помощью усовершенствованного шифра Гронсфельда.
Указание: Шифр Гронсфельда имеет ключ - 5 (в нашем случае любое количество) цифр. Шифруемый текст разбивается на группы символов (про-белы - не исключение) по числу цифр в ключе. Код первого символа группы увеличивается на число, соответствующее первой цифре ключа, код второго на число, соответствующее второй цифре ключа и т.д. При этом коды меньше 32 (т.н. управляющие символы) преобразованию не подлежат (во избежание повреждения структуры файла и других неприятных последствий). При де-шифровке производится обратный процесс (уменьшение кодов).
Если полученный при шифровании код КОД больше 255, применяем формулу КОД = КОД - 224.
Если полученный при дешифрировании код КОД меньше 32 применяем формулу КОД = КОД + 224.
Таким образом, зацикливаем последовательность кодов 32 - 255.
Естественно, при шифровке и дешифровке программа должна запраши-вать у пользователя ключ.
Изображения
Тип файла: png Снимок.PNG (1.3 Кб, 170 просмотров)

Последний раз редактировалось Vvvv11; 13.06.2018 в 19:47.
Vvvv11 вне форума Ответить с цитированием
Старый 13.06.2018, 20:23   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Vvvv11 Посмотреть сообщение
Если полученный при дешифрировании код КОД меньше 32 применяем формулу КОД = КОД + 224.
это в коде не учитывается.
Вам нужно в дешифровке тоже добавить проверку.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++]: шифр Гронсфельда. Помогите найти ошибку в коде krasy Помощь студентам 1 02.10.2016 00:37
написать шифр ГРОНСФЕЛЬДА на JavaSkript с комментариями! Екатерина 13 Помощь студентам 3 31.03.2016 18:07
Шифр Гронсфельда (!) guzel20 Общие вопросы C/C++ 3 18.12.2012 14:01
Шифр Гронсфельда zloygeniyrus Паскаль, Turbo Pascal, PascalABC.NET 0 06.04.2009 16:53
Шифр Гронсфельда zloygeniyrus Помощь студентам 0 06.04.2009 16:45