Здравствуйте, tatjanamaslova!
Шифрование-то работало, только получало данные, которые, в принципе, не поддавались расшифровке
Вот смотрите, читаете байт в буфер из двух байт. Делаете манипуляции с битами, и сохраняете ТОЛЬКО младший байт.
Старший байт безвозвратно теряется. Затем пытаетесь из одного младшего байта получить исходный! Не получится!
Надо было тогда сохранять два байта. Т.е. зашифрованные данные должны были быть в 2 раза длиннее!
Чтобы длина не менялась, то надо работать с байтом, а не с двумя байтами. Соответственно, и гамма должна быть однобайтной.
К слову, были и другие ошибки: 1) маска, если уж ее использовать, должна была бы быть 0xc000, нас же интересуют 2 старших бита, а не 1.
Впрочем, эта маска не нужна вообще! После сдвига, два старших бита окажутся в младших и так!
2) Зачем анализ на последний блок при работе с одним байтом
В общем, скопировали с исходника, где была работа с двумя байтами, и полностью не исправили...
[code h=200]//Функция для шифрования данных
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); // Копирование результата из буфера в блок с расшифрованными данными
}
}
[/code]