Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 362
∙ повысить рейтинг »
Степанов Иван /REDDS
Статус: 3-й класс
Рейтинг: 165
∙ повысить рейтинг »
CradleA
Статус: Профессионал
Рейтинг: 64
∙ повысить рейтинг »

∙ С / С++

Номер выпуска:1886
Дата выхода:27.11.2016, 09:45
Администратор рассылки:Андрей Кузнецов aka Dr_Andrew (Старший модератор)
Подписчиков / экспертов:23 / 16
Вопросов / ответов:1 / 1

Консультация # 190121: Здравствуйте! У меня возникли сложности с таким вопросом:Разработать программу на С++ для реализации алгоритма шифрования и расшифрования данных, используя метод гаммирования и поразрядного циклического сдвига. Алгоритм: для блока данных заданного размера берется такого же размера фрагмент гаммы и выполняется операция поразрядного исключающего «ИЛИ...

Консультация # 190121:

Здравствуйте! У меня возникли сложности с таким вопросом:Разработать программу на С++ для реализации алгоритма шифрования и расшифрования данных, используя метод гаммирования и поразрядного циклического сдвига. Алгоритм: для блока данных заданного размера берется такого же размера фрагмент гаммы и выполняется операция поразрядного исключающего «ИЛИ», далее, выполняется операция поразрядного циклического сдвига на заданное число бит влево или вправо с полученным новым блоком. Расшифрование выполняется в обратном порядке, вначале циклический сдвиг в противоположную сторону, а затем операция поразрядного исключающего «ИЛИ» с блоками той же самой гаммы.
Для получения гаммы можно использовать стандартный генератор псевдослучайный чисел (функцию rand, функция rand() генерирует воспроизводимую последовательность псевдослучайных чисел, при каждом обращении к функции возвращается целое в интервале между нулем и значением RAND_MAX, которое в любой реализации должно быть не ме ньше числа 32767, обратить внимание, при величине обрабатываемого блока данных 4 байта, возможно, для заполнения блока гаммы использовать два вызова функции), для начальной инициализации генератора использовать функцию srand (значение начальной инициализации является частью секретного ключа, другой частью ключа является размер поразрядного сдвига и его направление). Шифруемые данные хранить в программе в виде строки (можно сохранять в файле и читать из файла).

Мой вариант: сдвиг на 2 бита, размер обрабатываемого блока 1 байт.

Очень прошу помочь, не получается нормально сделать... Шифрует, а расшифровывать не хочет

Дата отправки: 22.11.2016, 09:34
Вопрос задал: tatjanamaslova (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, tatjanamaslova!
Шифрование-то работало, только получало данные, которые, в принципе, не поддавались расшифровке
Вот смотрите, читаете байт в буфер из двух байт. Делаете манипуляции с битами, и сохраняете ТОЛЬКО младший байт.
Старший байт безвозвратно теряется. Затем пытаетесь из одного младшего байта получить исходный! Не получится!
Надо было тогда сохранять два байта. Т.е. зашифрованные данные должны были быть в 2 раза длиннее!
Чтобы длина не менялась, то надо работать с байтом, а не с двумя байтами. Соответственно, и гамма должна быть однобайтной.
К слову, были и другие ошибки: 1) маска, если уж ее использовать, должна была бы быть 0xc000, нас же интересуют 2 старших бита, а не 1.
Впрочем, эта маска не нужна вообще! После сдвига, два старших бита окажутся в младших и так!
2) Зачем анализ на последний блок при работе с одним байтом smile
В обще м, скопировали с исходника, где была работа с двумя байтами, и полностью не исправили... smile

//Функция для шифрования данных
void shifrovanie(char *first, char *late,  int y, int n)
{
    srand(n);   // Инициализация секретного ключа 'n'
    unsigned short Gamma;   // Гамма
	unsigned char gamma1;
	unsigned char ch1, ch2;
    
    for (int i=1; i<=y; i++)
    {
        Gamma=rand();   // Генерируем гамму с помощью генератора псевдослучайных чисел
		gamma1 = (Gamma>>8) ^ (Gamma&0xff); //получение однобайтной гаммы!
        
		memcpy(&ch1, first+(i-1), 1);    //  Копирование блока исходных данных размером 1 байт из исходной строки в буферный блок данных
		ch2=ch1^gamma1; // Наложение гаммы на буферный блок данных, используя операцию поразрядного исключающего "ИЛИ"
		ch1=ch2;
		ch1>>=6; // Выполнение операции поразрядного сдвига на 6 бит вправо
		ch2<<=2; // Выполнение операции поразрядного сдвига на 2 бита влево
		ch2|=ch1; // Использование операции поразрядного "ИЛИ", получение поразрядно сдвинутого на 2 бита влево исходного блока с наложенной гаммой
		memcpy(late+(i-1), &ch2, 1); // Копирование результата из буфера в блок с зашифрованными данными
    }
}
//Функция для расшифровывания данных
void deshifrovanie(char *late, char *first, int y, int n)
{
    srand(n); // Инициализация секретного ключа
    unsigned short Gamma;   // Гамма
	unsigned char gamma1;
	unsigned char ch1, ch2;
    
    for (int i=1; i<=y; i++)
    {
        Gamma=rand(); // Генерация гаммы с помощью генератора псевдослучайных чисел
		gamma1 = (Gamma>>8) ^ (Gamma&0xff); //получение однобайтной гаммы!
        
		memcpy(&ch1, late+(i-1), 1);    //  Копирование блока исходных данных размером 1 байт из исходной строки в буферный блок данных
		ch2 = ch1;
		ch1<<=6; // Выполнение операции поразрядного сдвига на 6 бит влево
		ch2>>=2; // Выполнение операции поразрядного сдвига на 2 бита вправо
		ch2|=ch1; // Использование операции поразрядного "ИЛИ"
		ch2=ch2^gamma1; // Наложение гаммы на буферный блок данных, используя операцию поразрядного исключающего "ИЛИ"
		memcpy(first+(i-1), &ch2, 1); // Копирование результата из буфера в блок с расшифрованными данными
    }
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 22.11.2016, 12:59
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное