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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2012, 20:21   #1
Kobe
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 23
По умолчанию Большие буквы при дешифровании на C++. Шифрование и дешифрование методом простой замены.

Есть две программы (писал не сам) для шифрования и дешифрирования текста из файла TXT. Все работает, но дешифрованный текст получается почему то большими буквами.

Подскажите пожалуйста, почему так получается? И что можно сделать, чтобы исходный текст совпадал с дешифрованнным?

Код программы для шифрование.


Код:
#include<iostream.h>
#include<conio.h>
#include<fstream.h>
#include<string.h>
#include<math.h>
#include"rus.h"
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
void main()
{
  char* kluch;  //резервируем адрес для ключевого выражения
  ifstream inp("Input.txt");
  ofstream out("Output.txt");
  if(!inp)
    {
       cout<<Rus("ОТСУТСТВУЕТ ФАЙЛ Input.txt");
       getch();
       exit(1);
     }  
  cout<<Rus("ВВЕДИТЕ КЛЮЧ (БЕЗ ПРОБЕЛОВ)");
  cin>>kluch;
  int n=strlen(kluch);   //длина ключа
  int b,j,i=0;
  for(int k=0;k<n;k++)
   {         //преобразование символов ключа в прописные
     b=kluch[k];
     if(b<=-33&&b>=-64)b+=32;   //A->а,Б->б,...(русский алфавит)
     if(b==-81||b==-88||b==-86)b+=16; //Ї->ї,Є->є,Ё->ё
     if(b<=90&&b>=65)b+=32;    //A->a, B->b,...(английский )
     kluch[k]=b;
   }
  char temp,buffer=NULL;//buffer-считываемый символ, temp- преобразов. символ

  while(!inp.eof()) //пока не достигнут конец файла
    {
       inp.read((char*)&buffer,sizeof(buffer));//считываем очередной символ
       if(buffer==NULL)break;// если файл пустой
       b=buffer;
            //преобразование символов исходного текста в заглавные
       if(b>=-32&&b<=-1)b-=32;  //а->А,б->Б,...(русский алфавит)
       if(b==-65||b==-72||b==-70)b-=16; //ї->Ї,є->Є,ё->Ё
       if(b>=97&&b<=122)b-=32;  //a->A, b->B,...(английский )
       buffer=b;

       j=fmod(i,n); // переменная j циклически изменяется от 0 до n-1
       temp=buffer^kluch[j];// применяем операцию "исключающее ИЛИ"
       out.put(temp);  //записываем кодированный символ
       i++;   //переходим к следующему символу ключевого слова
       buffer=NULL; 
    }

  inp.close();
  out.close();
  cout<<Rus("ЗАШИФРОВАННЫЙ ТЕКСТ НАХОДИТСЯ В ФАЙЛЕ Output.txt");
  getch();
}
Код программы для дешифрования.

Код:
#include<iostream.h>
#include<conio.h>
#include<fstream.h>
#include<string.h>
#include<math.h>
#include"rus.h"
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
void main()
{
  char* kluch;
  ifstream inp("Output.txt");
  ofstream out("Desifr.txt");
  if(!inp)
    {
       cout<<Rus("ОТСУТСТВУЕТ ФАЙЛ Output.txt");
       getch();
       exit(1);
    }
  cout<<Rus("ВВЕДИТЕ КЛЮЧ (БЕЗ ПРОБЕЛОВ)");
  cin>>kluch;
  int n=strlen(kluch);
  int b,j,i=0;
  for(int k=0;k<n;k++)
   {         //преобразование символов ключа в прописные
     b=kluch[k];
     if(b<=-33&&b>=-64)b+=32;   //A->а,Б->б,...(русский алфавит)
     if(b==-81||b==-88||b==-86)b+=16; //Ї->ї,Є->є,Ё->ё
     if(b<=90&&b>=65)b+=32;    //A->a, B->b,...(английский )
     kluch[k]=b;
   }
  char temp,buffer=NULL;
  while(!inp.eof())
    {
       inp.read((char*)&buffer,sizeof(buffer));
       if(buffer==NULL)break;
       j=fmod(i,n);
       temp=buffer^kluch[j];
       out.write((char*)&temp,sizeof(temp));
       i++;
       buffer=NULL;
     }
  
  inp.close();
  out.close();
  cout<<Rus("ДЕШИФРОВАННЫЙ ТЕКСТ НАХОДИТСЯ В ФАЙЛЕ Desifr.txt");
  getch();
}
rus.h


Код:
unsigned char* Rus(unsigned char* st)/* функция Rus заменяет в строке 
		                                коды букв русского алфавита, 
			                            обеспечивает их правильное
		                  отображение в окне консольного приложения*/
{
   //  В ANSI русские буквы кодируются числами от 192 до 255,
   //  в ASCII - от 128 до 175 (А..Яа..п) и от 224 до 239 (р..я).

    unsigned char *p = st;/*    *p-указатель на i-й элемент массива,
				   первоначально указывающий на нулевой элемент (по 
				   адресу st);
                   каждый элемент массива представляет собой символ
				   в коде ANSI                                    */
   
    while (*p)// пока *(st+i)!='\0', где i-номер элемента массива
    {
        if ( (*p >= 192) && (*p <= 239))
            *p -= 64;//переход от кода ANSI к коду ASCII для А..Я,а..п

        if (*p >= 240)
            *p -= 16;//переход от кода ANSI к коду ASCII для р..я

        p++;//увеличиваем указатель на 1-переход к следующему адресу
    }

    return st;//возвращаем адрес нулевого элемента перекодированного массива
}
Полностью папка с исходником в прикрепленном файле, если нужно.conio.h
Вложения
Тип файла: rar Исходники.rar (501.0 Кб, 123 просмотров)

Последний раз редактировалось Kobe; 13.06.2012 в 20:23.
Kobe вне форума Ответить с цитированием
Старый 14.06.2012, 13:05   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Даже если программа не ваша, это не мешает прочесть ее вслух и наткнуться на интереснейшие комментарии:
Цитата:
//преобразование символов исходного текста в заглавные
if(b>=-32&&b<=-1)b-=32; //а->А,б->Б,...(русский алфавит)
if(b==-65||b==-72||b==-70)b-=16; //ї->Ї,є->Є,ё->Ё
if(b>=97&&b<=122)b-=32; //a->A, b->B,...(английский )
Автор программы сам преобразовывает буквы в заглавные.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.06.2012, 16:00   #3
Kobe
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 23
По умолчанию

BDA
Огромное спасибо.
Kobe вне форума Ответить с цитированием
Старый 30.03.2015, 13:01   #4
ДантеСил
Новичок
Джуниор
 
Регистрация: 13.03.2015
Сообщений: 1
По умолчанию

Хорошо что есть Профи!
ДантеСил вне форума Ответить с цитированием
Старый 10.12.2015, 21:46   #5
Gal94
Новичок
Джуниор
 
Регистрация: 10.12.2015
Сообщений: 1
По умолчанию

может ли кто нибудь помочь с программой шифрования-дешифрования?
защита послезавтра,все почти идеально работает,но программа съедает некотороые символы...как это исправить?
вот ссылка на программу:
https://dropmefiles.com/TMVg6
помогите!
если что...шифрование-гаммирование с обратной связью по шифртексту
гамма 12345

Последний раз редактировалось Gal94; 10.12.2015 в 21:47. Причина: необходимость внести изменение
Gal94 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифрование и дешифрование shananina-katya Фриланс 2 28.03.2012 21:30
Шифрование методом гомофонической замены ALUKARD2011 Помощь студентам 2 07.11.2011 20:07
шифрование и дешифрование Dima170792 Помощь студентам 6 21.04.2011 22:31
Шифрование и дешифрование foxes Помощь студентам 7 28.03.2010 17:43
шифрование и дешифрование файла Анастасия123456789 Помощь студентам 1 05.05.2009 15:47