Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
#1

0D 0A FF В конце файла после шифрования - C++

06.06.2013, 19:42. Просмотров 1696. Ответов 20
Метки нет (Все метки)

Всем привет. Пишу прогу для шифрования по алгоритму Цезаря. Знаю-знаю, целая туча таких Написал 2 для шифрования и расшифровывания одной буквы. При обработке строк и выводе их на экран проблем вроде бы нет, но когда дело доходит до файлов ... При зашифровании в конце файлов появляются лишние символи 0D 0A FF. А при расшифровывании символи 1А .
Знаю, что 0D 0A это переход на новую строку.
Выяснил, что 1А ставится на месте символов, значения которых были потеряны при передаче

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
char find_and_encr_char(char what_find,int key){
      char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
    bool founded= false; // знайдено ?
 
      char encr_char;
      if(what_find==' ') {
          encr_char=' ';
          founded=true;
          return encr_char;
                             }
    if(what_find=='.') {
          encr_char='.';
          founded=true;
          return encr_char;
                             }
 
      for(int i=0;i<26;i++){
 
                int abskey=i+key; 
                            if(engl_abet[i]==what_find){
                                if((i+key)>26){ abskey=(i+key)%26 ; }
                                encr_char=engl_abet[abskey];
                                founded=true;
                                break;
                                                       }
                            }
 
if(founded==false) encr_char=what_find;
                              return encr_char; }
 
char find_and_decr_char(char what_find, int key)
{
 char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
 
  if(what_find == ' ')         return ' ';
    if(what_find == '.')         return '.';
 
   for(int i=0;i<26;i++)
   {
      if (what_find == engl_abet[i]){
         if ((i-key) < 0)         return engl_abet[(26 - (-1*(i - key)%26))%26];
         else            return engl_abet[i-key];
   }
   }
}
P.S. Просьба не отсылать на топики с другими реализациями этого алгоритма, я там был хочу доделать именно так так задумал изначально
0
Миниатюры
0D 0A FF В конце файла после шифрования   0D 0A FF В конце файла после шифрования  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2013, 19:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос 0D 0A FF В конце файла после шифрования (C++):

Алгоритм шифрования из exe файла - C++
Hola amigos! :) На C++ к слову я мало что понимаю и столкнулся с некой необходимостью получить алгоритм шифрования обычного CD-ключа из...

Написать AES, шифрования любого файла .exe. - C++
Есть задача написать AES, который будет зашифровывать и расшифровывать любой файл .exe. Как лучше открывать этот файл, если нужно считывать...

Не понятный дополнительный символ в конце файла - C++
Друзья помогите пож-та разобраться с проблемой. Ниже простой пример посимвольного считывания из файла # include &lt;fstream&gt; # include...

Вставить после каждого слова в предложении запятую, а в конце предложения стоит точка - C++
вставить после каждого слова в предложении запятую, а в конце предложения стоит точка.

после расширения в конце каждого файла или папки стоит код вида "001-********" - Удаление вирусов
Операционная система - Windows XP. Не знаю как вышло...я просто работала за компом, сидела в нете. Сворачиваю окно Firefox'a и замечаю на...

Найти максимальную компоненту файла и записать её в конце файла - Pascal ABC
Здравстуйте, уважаемые форумчане, помогите пожалуйста решить задачу - Создать файл F вещественных чисел, найти максимальную...

20
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 19:50 #2
Цитата Сообщение от seruy-t Посмотреть сообщение
но когда дело доходит до файлов
Если дело в файлах, то покажите как пишите в файл, как читаете из файла.
0
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 19:54  [ТС] #3
alsav22,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
string write_and_encrypt_file(string filename, string content,int key)
{
 
 FILE *file_for_write=fopen(filename.c_str(),"w");
 //cout<<"\n filestream started\n";
 
    if(file_for_write==NULL) return "Something wrong, error of writing file !";
    bool result= fputs(((encr_string(content,key)).c_str()),file_for_write);
fclose(file_for_write);
            if(!result) {
                       return "true";
                        }
            else return "false";
 
}
 
 
bool write_and_decrypt_file(string filename, string in,int key)
    {
 FILE *file_for_write=fopen(filename.c_str(),"wt");
 if(file_for_write==NULL) return false;
 bool flag=false;
   for(unsigned int i=0;i<in.length();i++){
    if(!fputc((find_and_decr_char(in[i],key)),file_for_write)) flag=true;
    else flag=false;
                                   }
    fclose(file_for_write);
     if(flag==false) return false;
     else return true;
     }
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 20:11 #4
string content как создаётся перед передачей на запись в файл?
0
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 20:20  [ТС] #5
alsav22,
read_file(patch)
C++
1
 if((write_and_encrypt_file(output_file,read_file(patch),key))=="true") cout <<"DONE \n";
C++
1
2
3
4
5
6
7
8
9
10
11
12
string read_file(string filename){
    string input_of_file_for_reading="";
    FILE *input_file = fopen(filename.c_str(),"rt");
        if(input_file==NULL)    return "File invalid";
        while(!feof(input_file)){
                input_of_file_for_reading+=fgetc(input_file);
                                }
 
            fclose(input_file);
            return input_of_file_for_reading;
 
                                  }
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 20:24 #6
Это не ответ на вопрос. Показывайте read_file().
0
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 20:28  [ТС] #7
alsav22,
C++
1
2
3
4
5
6
7
8
9
10
11
12
string read_file(string filename){
    string input_of_file_for_reading="";
    FILE *input_file = fopen(filename.c_str(),"rt");
        if(input_file==NULL)    return "File invalid";
        while(!feof(input_file)){
                input_of_file_for_reading+=fgetc(input_file);
                                }
 
            fclose(input_file);
            return input_of_file_for_reading;
 
                                  }
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 20:34 #8
В файле, который читает read_file() одна строка?
0
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 20:38  [ТС] #9
alsav22, Нет
0
Вложения
Тип файла: txt new_sh.txt (227 байт, 6 просмотров)
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 21:39 #10
Цитата Сообщение от seruy-t Посмотреть сообщение
Нет
В файле одна (и в конце - символ новой строки). Если бы была не одна, то 0D 0A были бы не только в конце. При шифровании, у вас как обрабатывается символ новой строки?
0
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 22:01  [ТС] #11
alsav22, Никак, все символы, что не входят в английский алфавит должны "дописываться" в конечный текст как уже зашифрованные
C++
1
2
if(founded==false) encr_char=what_find;
                              return encr_char;
Заметил, что, при выводе на экран расшифрованного текста появляются стрелки (1А) вместо "!"

Добавлено через 13 минут
Исходя с этого

Enter text for encryption
!@#$%^&*()_
Enter key
112

AFTER ENCRYTION : !@#$%^&*()_
и этого

Enter the text for decryption:
!@#$%^&*()_

Enter the key
112
AFTER DECRYPTION:→→→→→→→→→→→
→ (1А)
проблема здесь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
char find_and_decr_char(char what_find, int key)
{
 char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
 
  if(what_find == ' ')         return ' ';
    if(what_find == '.')         return '.';
 
   for(int i=0;i<26;i++)
   {
      if (what_find == engl_abet[i]){
         if ((i-key) < 0)         return engl_abet[(26 - (-1*(i - key)%26))%26];
         else            return engl_abet[i-key];
   }
   }
}
 
string decr_string(string in, int key){
string out="";
 
for(unsigned int i=0;i<in.length();i++){
    out+=find_and_decr_char(in[i],key);
}
 
 
 return out;}
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 22:21 #12
Цитата Сообщение от seruy-t Посмотреть сообщение
все символы, что не входят в английский алфавит должны "дописываться" в конечный текст как уже зашифрованные
Значит, в принципе, символ новой строки вам не должне мешать? Измените чтение из файла вот так (чтобы символ конца файла не попадал в строку), может этого окажется достаточно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string read_file(string filename){
    string input_of_file_for_reading="";
    FILE *input_file = fopen(filename.c_str(),"rt");
        if(input_file==NULL)    return "File invalid";
        
        while(true)
        {
         char ch = fgetc(input_file);
         if (ch == EOF) break;
         input_of_file_for_reading += ch;
         }
 
            fclose(input_file);
            return input_of_file_for_reading;
 
}
В крайнем случае, от FF в конце зашифрованного файла избавитесь.

Добавлено через 13 минут
Цитата Сообщение от seruy-t Посмотреть сообщение
проблема здесь
У вас в find_and_decr_char() возврата нет, если нет захода в if/else.
1
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 22:26  [ТС] #13
alsav22,
Сделал как Вы посоветовали, таки да, этого было достаточно. Сделал еще такой костить в функции расшифровки

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 char find_and_decr_char(char what_find, int key)
{
 char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
 
  if(what_find == ' ')         return ' ';
    if(what_find == '.')         return '.';
        if(what_find == '1')         return '1';
            if(what_find == '2')         return '2';
                if(what_find == '3')         return '3';
                    if(what_find == '4')         return '4';
                        if(what_find == '5')         return '5';
                            if(what_find == '6')         return '6';
                                if(what_find == '7')         return '7';
                                    if(what_find == '8')         return '8';
                                        if(what_find == '9')         return '9';
                                            if(what_find == '0')         return '0';
    if(what_find == '!')         return '!';
        if(what_find == '@')         return '@';
            if(what_find == '$')         return '$';
                if(what_find == '%')         return '%';
                    if(what_find == '&')         return '&';
                        if(what_find == '*')         return '*';
                            if(what_find == '(')         return '(';
                                if(what_find == '_')         return '_';
                                    if(what_find == ')')         return ')';
                                        if(what_find == '?')         return '?';
   for(int i=0;i<26;i++)
   {
      if (what_find == engl_abet[i]){
         if ((i-key) < 0)         return engl_abet[(26 - (-1*(i - key)%26))%26];
         else            return engl_abet[i-key];
   }
   }
}
И еще одно
Enter path and name of file for decryption
C:\e.txt
Do you want to display it ?(yes/no)
yes
[C:\e.txt (227 symbols) ]

---------Begin of file---------------------

tzalu.xhq zb v lbgh blccxhjgn ixsslazjk fgpbzjg fwxbg szbbzxa zb jx chxsxjg tzal
u jwhxlqw gnlivjzxa. jwg ixajgaj xm jwzb fgpbzjg zb ngbzqagn jx pg zajghvijgn fz
jw pk jwg tzalu ixsslazjk. fg txxr mxhfvhn jx kxlh cvhjzizcvjzxa!
--------------END of file------------------

Enter the path for saving
C:\d.txt
Enter the key
12
FAIL, error of recording
Хотя файл записывает нормально
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 22:34 #14
Цитата Сообщение от seruy-t Посмотреть сообщение
Сделал еще такой костить в функции расшифровки
Наверное, это можно проще сделать. Надо подумать как. Возврат символа без расшифровки, если его нет в массиве. Т.е. сделать возврат, которого у вас нет, а должен быть в любом случае.
0
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 22:37  [ТС] #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Возврат символа без расшифровки, если его нет в массиве.
тоже об этом подумывал. А что на счет этого ?
Цитата Сообщение от seruy-t Посмотреть сообщение
Enter path and name of file for decryption
C:\e.txt
Do you want to display it ?(yes/no)
yes
[C:\e.txt (227 symbols) ]
---------Begin of file---------------------
tzalu.xhq zb v lbgh blccxhjgn ixsslazjk fgpbzjg fwxbg szbbzxa zb jx chxsxjg tzal
u jwhxlqw gnlivjzxa. jwg ixajgaj xm jwzb fgpbzjg zb ngbzqagn jx pg zajghvijgn fz
jw pk jwg tzalu ixsslazjk. fg txxr mxhfvhn jx kxlh cvhjzizcvjzxa!
--------------END of file------------------
Enter the path for saving
C:\d.txt
Enter the key
12
FAIL, error of recording
Хотя файл записывает нормально
C++
1
2
if((write_and_decrypt_file(output_file,read_file(patch),key))) cout <<"DONE \n";
else cout<<"FAIL, error of recording";
0
06.06.2013, 22:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 22:37
Привет! Вот еще темы с ответами:

Проверить почту после шифрования - PHP
НЕ могу понять , почему пишет всегда NO , вроде при начальнйо проверки пишет нормально E-mail . Я зашифровал и потом расшифровал .. array...

Дешифрование после шифрования методом сдвига - C#
Есть программа шифрования методом сдвига,как реализовать дешифроку?может кто нибудь дописать? using System.Collections.Generic; using...

Неверное отображение символов после шифрования - C#
Пишу приложение, реализующее шифр Вернама. Генерируется ключ, числа не превышают 16 бит. Загоняю каждое число в массив форматом UInt16. ...

После шифрования возвращается исходный текст - C#
надо зашифровать и расшифровать строку по алгоритму Виженера. на бумажке код работает(ну реализован вроде верно). а вот на практике что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru