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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2022, 04:17   #1
Myrov
Новичок
Джуниор
 
Регистрация: 29.12.2021
Сообщений: 2
По умолчанию с++. шифрование файла с помощью xor

задание и код прикреплены ниже. не совсем понятны [1],[2],[3],[0] при аргументе argv. прошу объяснить


Шифрование/дешифрование осуществляется группами по 8 бит
(1 байт). Ключ также имеет размер 1 байт.


Код:
#include <iostream>
#include <fstream>
using namespace std;


int main(int argc, char* argv[])//аргументы командной строки
{
	char ch;
	ifstream infile(argv[1], ios_base::binary); 
	ofstream outfile(argv[2], ios_base::binary); 
	if (infile.is_open())
	{
		if (outfile.is_open())
		{
			while (infile.get(ch))
			{
			ch^= argv[3][0]; 
				outfile.write(&ch , sizeof(ch));
			}
		}
	}
}

Последний раз редактировалось Myrov; 30.09.2022 в 07:27.
Myrov вне форума Ответить с цитированием
Старый 30.09.2022, 07:30   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

https://cpp.com.ru/shildt_spr_po_c/06/0604.html
waleri вне форума Ответить с цитированием
Старый 27.10.2022, 20:54   #3
Evgeny173
 
Регистрация: 21.10.2022
Сообщений: 8
По умолчанию

Myrov, argv[0] - это имя самой программы. Далее в данном случае
argv[1] - строка, имя входного файла
argv[2] - строка, имя выходного файла
argv[3][0] - строка или один символ (байт), даже если будет строка, то все равно берется из нее только первый байт. Собственно это и есть ключ
Если входной файл (argv[1]) нешифрованный, то программа его зашифрует. Если наоборот на входе шифрованный файл - расшифрует

Запустить программу из командной строки можно так:
Находясь в папке с собранным exe файлом, пусть он называется Crypter.exe
Crypter.exe infile.txt outfile.txt k
k - ключ, берется числовое значение символа 'k' по ASCII. Можно заменить его на любой другой символ. Чтобы вместо символа можно было вводить само число от 0 до 255, нужно заменить
ch^= argv[3][0] на ch^= atoi(argv[3]), тогда можно будет вызывать программу так:
Crypter.exe infile.txt outfile.txt 155
infile.txt должен существовать и лежать в папке вместе с Crypter.exe, outfile.txt программа создаст в процессе своей работы
Evgeny173 вне форума Ответить с цитированием
Старый 27.10.2022, 23:53   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Evgeny173 Посмотреть сообщение
ch^= argv[3][0] на ch^= atoi(argv[3]), тогда можно будет вызывать программу так:
Crypter.exe infile.txt outfile.txt 155
А стоит ли на каждый байт входного файла заново переводить строку с кодом в число?

Это лишние действия в огромных количествах. К тому же стоит проверить ключ на валидность (!0) и на правильность (число может быть переведено из заданной строки). Это стоит добавить отдельными проверками, а не дописать как часть подпрограммы.
Код:
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char* argv[])//аргументы командной строки
{
	char ch, xk;
	ifstream infile(argv[1], ios_base::binary); 
	ofstream outfile(argv[2], ios_base::binary); 
	xk = strtol(argv[3], NULL, 10);
	if (!errno && xk)
	{
		if (infile.is_open())
		{
			if (outfile.is_open())
			{
				while (infile.get(ch))
				{
					ch ^= xk; 
					outfile.write(&ch , sizeof(ch));
				}
			}
		}
	}
}
macomics вне форума Ответить с цитированием
Старый 28.10.2022, 19:10   #5
Evgeny173
 
Регистрация: 21.10.2022
Сообщений: 8
По умолчанию

macomics, благодарю за дополнение. А откуда берется errno?
Evgeny173 вне форума Ответить с цитированием
Старый 28.10.2022, 21:41   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Это переменная типа той, что организует Windows с доступом через GetLastError. В нее функции от C/C++ выставляют статус ошибки.

https://en.cppreference.com/w/cpp/error/errno

Последний раз редактировалось macomics; 28.10.2022 в 21:44.
macomics вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифрование с помощью PGPSDK Rustam88_01 Фриланс 0 06.02.2017 09:18
Шифрование с помощью шифрорешетки, как повернуть решетку? Manta4ka Python 2 20.12.2016 21:33
Шифрование файла с помощью пароля Hallo Обсуждение статей 3 09.02.2007 10:50