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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2018, 20:55   #1
shwwartw
 
Регистрация: 31.03.2018
Сообщений: 6
По умолчанию Не могу разобраться с xor операцией

Доброго времени суток.
Пришла мне одна задачка на мыло
Есть вот такой код
Код:
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
#define k "jf1ay9238x0ax0"
char f1(char a);
int a1(int a);

int main()
{
	srand(time(0));

	printf("Enter path:");
	fflush(stdout);
	char p[64];
	scanf("%s", p);
	char c;
	do {
		c = getchar();
	} while (c != '\n' && c != EOF);

	FILE* f = fopen(p, "rb");
	if (f == NULL) {
		printf("Error opening file");
		getch();
		exit(-3);
	}
	char m[64];
	fread(&m, sizeof(char), 64, f);
	fclose(f);

	printf("%s\n", p);
	printf("Cipher?(Y/n):");
	fflush(stdout);
	char r;
	scanf("%c", &r);
	do {
		c = getchar();
	} while (c != '\n' && c != EOF);
	char ot = r;

	if (ot == 'Y') {
		char s = 0;
		for (int i = 0; i < 64; ++i) {
			s ^= m[i];
		}

		for (int i = 0; i < 63; ++i) {
			m[i] ^= (m[i + 1] ^ s^r^i ^ ((0xf) << 4) ^ ((i % 2) << 7));
			m[i] = f1(m[i]);
		}
		m[63] ^= s;

		FILE* f = fopen("out.txt", "wb");
		fputc(s, f);
		fwrite(m, sizeof(char), 64, f);
		fclose(f);	
	}

	return 0;
}
char f1(char a)
{
	char ss = 0xd;
	static int t = 0;
	int b = a1(rand()) % 0xffff;

	b <<= 4;
	b ^= (k[(t++) % ss] >> 4);
	b <<= 4;
	b ^= (k[(t++) % ss]);

	a ^= (char)b;
	return a;
}

int a1(int a) {
	if (a < 0)
		return (-a);
	else
		return a;
}
он шифрует заданное значение из текстового файла каким-то xor алгоритмом
К тому же есть уже зашифрованное сообщение
Задача - получить из шифротекста исходное сообщение.

Знаю, что xor дважды расшифровывает уже заксоренное значение, НО
тут это почему-то не работает

Знающие люди, помогите разобраться. Спасибо
shwwartw вне форума Ответить с цитированием
Старый 31.03.2018, 21:16   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от shwwartw Посмотреть сообщение
Знаю, что xor дважды расшифровывает уже заксоренное значение, НО тут это почему-то не работает
а ключ расшифровки знаешь? каким значением ксоришь?
расшифруешь ксором текст только в том случае, если ключ будет тот-же
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 01.04.2018, 02:31   #3
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Ну вот же, нужно обратить операцию:

Код:
char s = 0;
		for (int i = 0; i < 64; ++i) {
			s ^= m[i];
		}

		for (int i = 0; i < 63; ++i) {
			m[i] ^= (m[i + 1] ^ s^r^i ^ ((0xf) << 4) ^ ((i % 2) << 7));
			m[i] = f1(m[i]);
		}
		m[63] ^= s;
s - это xor всего текста побайтно. И оно закодировано в последнем байте сообщения. Т.о. у вас есть 256 вариантов получить последний байт И xor всего текста (включая этот байт).

Дальше средний цикл в обратном порядке разворачиваем и пробуем в качестве ключа к нему 256 вариантов последнего байта. При правильной декодировке должно выйти совпадающее s.

Т.е. скажем в файле последний байт 0x24, берем перебор, например пусть настоящий последний байт 0х40, тогда S ожидаемое = 0х40 ^ 0x24, теперь берем 0х40 и гоним в обратном порядке. Считаем S для полученных данных и сравниваем с S ожидаемое = 0х40 ^ 0x24. Это позволит выбрать верный вариант из 256 при переборе всех.

Последний раз редактировалось alexzk; 01.04.2018 в 02:37.
alexzk вне форума Ответить с цитированием
Старый 01.04.2018, 04:58   #4
shwwartw
 
Регистрация: 31.03.2018
Сообщений: 6
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Ну вот же, нужно обратить операцию:

Код:
char s = 0;
		for (int i = 0; i < 64; ++i) {
			s ^= m[i];
		}

		for (int i = 0; i < 63; ++i) {
			m[i] ^= (m[i + 1] ^ s^r^i ^ ((0xf) << 4) ^ ((i % 2) << 7));
			m[i] = f1(m[i]);
		}
		m[63] ^= s;
s - это xor всего текста побайтно. И оно закодировано в последнем байте сообщения. Т.о. у вас есть 256 вариантов получить последний байт И xor всего текста (включая этот байт).

Дальше средний цикл в обратном порядке разворачиваем и пробуем в качестве ключа к нему 256 вариантов последнего байта. При правильной декодировке должно выйти совпадающее s.

Т.е. скажем в файле последний байт 0x24, берем перебор, например пусть настоящий последний байт 0х40, тогда S ожидаемое = 0х40 ^ 0x24, теперь берем 0х40 и гоним в обратном порядке. Считаем S для полученных данных и сравниваем с S ожидаемое = 0х40 ^ 0x24. Это позволит выбрать верный вариант из 256 при переборе всех.
немного не понял, хотя вижу, что ответ на поверхности. Т.е. в последнем байте (который поксорили на S) содержится ключ? он (ключ) однобайтовый, выходит?
Т.е. ксорим шифротекст 256 раз и где-то в одном ИЗ вариантов будет исходное ссобщение?
shwwartw вне форума Ответить с цитированием
Старый 01.04.2018, 05:12   #5
shwwartw
 
Регистрация: 31.03.2018
Сообщений: 6
По умолчанию

я предполагаю, что последний символ в исходном сообщении:
}
И что мне теперь с этим делать?
поксорить шифротекст символом } чтоли?

Не могу понять что вы имели вот здесь:
Цитата:
Сообщение от alexzk Посмотреть сообщение
теперь берем 0х40 и гоним в обратном порядке. Считаем S для полученных данных и сравниваем с S ожидаемое = 0х40 ^ 0x24. Это позволит выбрать верный вариант из 256 при переборе всех.
Гоним в обратном порядке это значит двигаемся от последнего символа и далее?
можете кодом или как-то хоть немного нагляднее, пожалуйста?))

Последний раз редактировалось shwwartw; 01.04.2018 в 05:47.
shwwartw вне форума Ответить с цитированием
Старый 01.04.2018, 11:41   #6
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Последний символ содержит в себе xor ВСЕГО исходного текста и самого исходного символа. Т.о. у нас есть 256 вариантов решения - полным перебором. Пробуем каждый вариант и получаем "возможный исходный символ" + проверочный xor всего возможного исходного текста, для этого возможного символа.

Дальше вам необходимо "реверсировать" цикл средний (т.е. движение от конца к началу + мат. операции менять на обратные.). В нем каждый шифрованый символ зависит от ПОСЛЕДУЮЩЕГО. А т.к. мы уже "предподложили, что знаем" последний, то можно вычислить предпоследний, на его основе пред-пред и т.д. Дальше от полного полученого сообщения считаем xor и сравниваем с "проверочный xor всего возможного исходного текста" с первого шага. По идее только 1 из 256 вариантов совпадет - вот он и будет результатом.

Конкретно код сделать могу, но не буду - задача-то ваша. Думайте.

Последний раз редактировалось alexzk; 01.04.2018 в 11:44.
alexzk вне форума Ответить с цитированием
Старый 01.04.2018, 12:15   #7
shwwartw
 
Регистрация: 31.03.2018
Сообщений: 6
По умолчанию

Там еще одна поблема есть
как быть с пробельными символами
т.е. у меня исходный зашифрованный текст выглядит как-то так:
Код:
какой-то кусок
какой-то кусок
нормально читать из файла и нормально воспроизводить текст с символом конца строки я хз как это обходить
shwwartw вне форума Ответить с цитированием
Старый 01.04.2018, 12:20   #8
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Открывать файл на чтение в бинарном режиме и читать побайтно. В вашей программе так делается запись - бинарно/побайтно.
alexzk вне форума Ответить с цитированием
Старый 03.04.2018, 17:38   #9
shwwartw
 
Регистрация: 31.03.2018
Сообщений: 6
По умолчанию

Спасибо большое =) С этим разобрался,
там оказывается все просто было
нулевой элемент массива в который пишется шифротекст = s и т.д.
короче с этим справился, еще раз спасибо =)
shwwartw вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос с операцией mod qpuTuJlb Общие вопросы Delphi 9 17.07.2012 09:42
Какой операцией заменить AND? BackSlash Помощь студентам 5 18.02.2011 15:53
не могу разобраться! Apsalon Microsoft Office Excel 1 28.12.2010 18:54
Не могу разобраться Lokin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 22.03.2010 22:45
Помогите разобраться с операцией ->(стрелка) RokDemon Общие вопросы C/C++ 2 03.05.2009 17:06