25.03.2017, 06:52 [+3 UTC]
в нашей команде: 1 867 чел. | участники онлайн: 5 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.41 (25.02.2017)

Общие новости:
23.02.2017, 09:51

Форум:
22.03.2017, 16:10

Последний вопрос:
24.03.2017, 23:09

Последний ответ:
24.03.2017, 21:21

Последняя рассылка:
24.03.2017, 15:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
01.02.2010, 06:40 »
B_production
Ну да, тоже вариант. Спасибо!.. [вопрос № 176418, ответ № 259109]
14.12.2011, 17:56 »
Кудинов Иван Николаевич
Вот спасибо большое) Выручили так выручили) [вопрос № 184750, ответ № 269141]
14.10.2009, 09:46 »
Eliz08
Большое спасибо! Все работает. Все-понятно. [вопрос № 173234, ответ № 255376]

РАЗДЕЛ • С / С++

Создание программ на языках C и C++.

[администратор рассылки: Андрей Кузнецов aka Dr_Andrew (Старший модератор)]

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

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 646
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 454
Асмик Гаряка
Статус: Советник
Рейтинг: 246

Перейти к консультации №:
 

Консультация онлайн # 190121
Раздел: • С / С++
Автор вопроса: tatjanamaslova (Посетитель)
Отправлена: 22.11.2016, 09:34
Поступило ответов: 1

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

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

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

Приложение:

Состояние: Консультация закрыта

Ответ # 274316 от Лысков Игорь Витальевич (Старший модератор)

Здравствуйте, 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

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 190121

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 1

= общий = | 22.11.2016, 15:28 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
tatjanamaslova:

В общем-то, можно было оставить двубайтные буфера, и гамму двубайтную, но двигать надо было биты только одного младшего байта! Можете так сделать...

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос | интересные статьи

Время генерирования страницы: 0.13888 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.41 от 25.02.2017
Бесплатные консультации онлайн