Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/14: Рейтинг темы: голосов - 14, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.07.2011
Сообщений: 12
1

Шифрование

27.11.2011, 22:47. Просмотров 2618. Ответов 17
Метки нет (Все метки)

Создать выходной зашифрованный файл на основе входного. Шифрование файла выполняется по следующему правилу: в каждом слове строки первый символ меняется местами со вторым, третий с четвертым и так далее. Выполнить дешифровку созданного файла.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2011, 22:47
Ответы с готовыми решениями:

Шифрование
Доброго времени суток, сегодня весь день сидел и пытался разобрать задачу. Задается натуральное...

Шифрование
я написал код шифрования #include <iostream> #include <fstream> #include <string> using...

c++ шифрование
Необходимо программно реализовать на языке C++ алгоритм шифра по Диффи – Хеллману с открытым...

шифрование
помогите пожалуйста написать пргорамму!!! была бы очень благодрна!!! шифрование. один из...

17
2 / 2 / 2
Регистрация: 31.07.2011
Сообщений: 143
28.11.2011, 00:06 2
Если нечётное количество символов последний на месте остаётся?
0
0 / 0 / 0
Регистрация: 11.07.2011
Сообщений: 12
28.11.2011, 00:22  [ТС] 3
да. последний остается на месте.
0
31 / 31 / 8
Регистрация: 05.11.2008
Сообщений: 162
28.11.2011, 00:23 4
Какие у Вас варианты алгоритмизации данной задачи ?
0
16 / 16 / 2
Регистрация: 28.04.2011
Сообщений: 38
28.11.2011, 00:45 5
Если для исходного и конечного файлов созданны потоки in и out соответственно,
то можно попробовать реализовать алгоритм с использованием функций getc() и putc()

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
int symbol1, symbol2;   // переменные для хранения кодов символов
 
symbol1=getc(in);        // прочитали первый символ
 
while(symbol1 != EOF)   // читаем символы пока не найдём признак конца текста
{
   if(symbol1 == int(' ')) // если встретился пробел
    {
      putc(symbol1, out);  // запишем его в конечный файл
      symbol1=getc(in);    // и прочитаем следующий символ
    }
 
  symbol2=getc(in);       // читаем чётный символ
  
  if(symbol2 == EOF)      // если чётный символ - признак конца файла,
     break;                    // выходим из цикла
  else if(  symbol2==int('')  )  // если символ пробельный, то читаем следующий
     putc(symbol2, out);       //  записываем его в конечный файл
   else                              //  если символ не пробельный
   {
      putc(symbol2, out);     // записываем сначала чётный символ, 
      putc(symbol1, out);     // потом нечётный
   }
    
   symbol1=getc(in);          // читаем следующий символ
}
Добавлено через 4 минуты
Этот алгоритм стоит проверить на наличие ошибок и протестировать

Алгоритм НЕ действует, если в тексте несколько строк или между словами несколько пробелов
(так что его можно улучшать и улучшать)

Надеюсь, что этот алгоритм поможет хоть чем-то
0
2 / 2 / 2
Регистрация: 31.07.2011
Сообщений: 143
28.11.2011, 00:51 6
Вот смотри,можно попробовать так.В силу того,что алгоритм симметричный запускаешь повторно и всё

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <fstream>
using namespace std;
 
void showmenu(){
    cout << "1.encrypt or decrypt\n"
                   << "0.exit\n";
}
 
bool is_valid(char ch){
    if (ch < '0'||ch > '1'||cin.rdbuf()->in_avail()!=1){
        system("clrscr");
        fflush(stdin);
        return 0;
    }
    return 1;
}
 
 
 
 
 
 
 
void crypt(){
    char *SrcTxt=new char[64];
    char *CipTxt=new char[64];
 
    cout << "file name with text\n";
    cin >> SrcTxt;
    cout << "name of the container\n";
    cin >> CipTxt;
 
    ifstream in ((char*)SrcTxt,ios::binary||ios::in);   
    if(!in){
        cout << "Файл не найден" << endl;
        exit(1);
    }
 
    ofstream out((char*)CipTxt,ios::binary||ios::out);
    if(!out){
        cout << "Файл не найден" << endl;
        exit(1);
    }
    
    char ch,ch2;
    for(;;){
        in.get(ch);
        if(in.eof())break;
        
        in.get(ch2);
        if(in.eof()){
            out.put(ch);
            break;
        }
 
        out.put(ch2);
        out.put(ch);
    }
    in.close();
    out.close();
}
 
void is_do (char ch){
    switch(ch){
    case '1':
        crypt();
        break;
    
        break;
    case'0':
        exit(1);
    }
}
int main(){
    char choir;
    
    do{
    showmenu();
    cin >> choir;
    }while(!is_valid(choir));
 
    is_do(choir);
    return 0;
}
0
40 / 40 / 7
Регистрация: 26.11.2011
Сообщений: 80
28.11.2011, 00:54 7
Цитата Сообщение от ogcjm124 Посмотреть сообщение
system("clrscr");
Нету такой команды в командной строке, есть
C++
1
system("cls");
0
2 / 2 / 2
Регистрация: 31.07.2011
Сообщений: 143
28.11.2011, 01:05 8
Исправленный

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <fstream>
using namespace std;
 
void showmenu(){
    cout << "1.encrypt or decrypt\n"
         << "0.exit\n";
}
 
bool is_valid(char ch){
    if (ch < '0'||ch > '1'||cin.rdbuf()->in_avail()!=1){
    
        fflush(stdin);
        return 0;
    }
    return 1;
}
 
void crypt(){
    char *SrcTxt=new char[64];
    char *CipTxt=new char[64];
 
    cout << "file name with text\n";
    cin >> SrcTxt;
    cout << "name of the container\n";
    cin >> CipTxt;
 
    ifstream in ((char*)SrcTxt,ios::binary||ios::in);   
    if(!in){
        cout << "Файл не найден" << endl;
        exit(1);
    }
 
    ofstream out((char*)CipTxt,ios::binary||ios::out);
    if(!out){
        cout << "Файл не найден" << endl;
        exit(1);
    }
    
    char ch,ch2;
    for(;;){
        in.get(ch);
        if(in.eof())break;
        
        in.get(ch2);
        if(in.eof()){
            out.put(ch);
            break;
        }
 
        out.put(ch2);
        out.put(ch);
    }
    in.close();
    out.close();
}
 
void is_do (char ch){
    switch(ch){
    case '1':
        crypt();
        break;
    
        break;
    case'0':
        exit(1);
    }
}
int main(){
    char choir;
    
    do{
    showmenu();
    cin >> choir;
    }while(!is_valid(choir));
 
    is_do(choir);
    return 0;
}
Добавлено через 1 минуту
Возможно есть другие более правильный реализации.

Добавлено через 8 минут
C++
1
2
D 64 строке сотрите break;
между 69,70 дописать setlocale(LC_ALL,"Rus");
0
Заблокирован
28.11.2011, 02:40 9
две функции отличаются только одной строчкой, в которой освобождается ранее выделенная память. Так что если немного покумекать над освобождением памяти, то вполне можно оставить для шифровки и расшифровки одну функцию.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char *crypt(char *str)
{
    int n = strlen(str);
    char *buf = calloc(n + 1, sizeof(char));
    if ( !buf )
        exit( -1 );
 
    for (int i = 0; i < n; ++i)
        if ( i % 2 )
            buf[ i - 1] ^= str[ i ];
        else
            buf[ i + 1] ^= str[ i ];
            
    buf [ n - 1] = (n % 2) ? buf [ n ] : buf [ n - 1];
    buf [ n ] = (n % 2) ? 0 : buf [ n ];
    
    return buf;
}
 
char *encrypt(char *str)
{
    int n = strlen(str);
    char *buf = calloc(n + 1, sizeof(char));
    if ( !buf )
        exit( -1 );
 
    for (int i = 0; i < n; ++i)
        if ( i % 2 )
            buf[ i - 1] ^= str[ i ];
        else
            buf[ i + 1] ^= str[ i ];
 
    buf [ n - 1] = (n % 2) ? buf [ n ] : buf [ n - 1];
    buf [ n ] = (n % 2) ? 0 : buf [ n ];
 
    free(str);
    return buf;
}
 
int main(void)
{
    char *str = "this is string";
    char *str1 = "this is none!";
    char *buf;
 
    buf = crypt(str);
    printf("%s\n", buf);
    buf = encrypt(buf);
    printf("%s\n", buf);
    free(buf);
    buf = crypt(str1);
    printf("%s\n", buf);
    buf = encrypt(buf);
    printf("%s\n", buf);
    free(buf);
 
    return 0;
}
memtest


==12913== Memcheck, a memory error detector
==12913== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==12913== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==12913== Command: ./prosto
==12913==
htsii stsirgn
this is string
htsii sonen!
this is none!
==12913==
==12913== HEAP SUMMARY:
==12913== in use at exit: 0 bytes in 0 blocks
==12913== total heap usage: 4 allocs, 4 frees, 58 bytes allocated
==12913==
==12913== All heap blocks were freed -- no leaks are possible
==12913==
==12913== For counts of detected and suppressed errors, rerun with: -v
==12913== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 18 from 7)


Добавлено через 14 минут
хоть бы и
так
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char *crypt(char *str)
{
    int n = strlen(str);
    char *buf = calloc(n + 1, sizeof(char));
    if ( !buf )
        exit( -1 );
 
    for (int i = 0; i < n; ++i)
        if ( i % 2 )
            buf[ i - 1] ^= str[ i ];
        else
            buf[ i + 1] ^= str[ i ];
 
    buf [ n - 1] = (n % 2) ? buf [ n ] : buf [ n - 1];
    buf [ n ] = (n % 2) ? 0 : buf [ n ];
 
    free(str);
    return buf;
}
 
int main(void)
{
    char *str = malloc(sizeof("this is string"));
        if ( !str )
            exit ( -1 );
    strcpy(str, "this is string\0");
    char *buf;
 
    buf = crypt(str);
    printf("%s\n", buf);
    buf = crypt(buf);
    printf("%s\n", buf);
    free(buf);
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 11.07.2011
Сообщений: 12
30.11.2011, 00:06  [ТС] 10
Спасибо за помощь!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10841 / 6672 / 1614
Регистрация: 25.07.2009
Сообщений: 12,442
30.11.2011, 01:07 11
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
#include <stdio.h>
#include <string.h>
 
char * crypt(char * str){
   char * p = str;
 
   while ( *p && *(p+1) ){
      char t = *p;
      *p = *(p+1);
      *(p+1) = t;
      p += 2;
   }
 
   return str;
}
 
char * cryptstr(char * str, const char * delim){
   char * buf, * p;
 
   if ( ! ( buf = malloc(strlen(str)+2) ) )
      return NULL;
 
   for ( *buf = 0, p = strtok(str, delim); p; p = strtok(NULL, delim) ){
      strcat(buf, crypt(p));
      strcat(buf, " ");
   }
 
   strcpy(str, buf);
   free(buf);
 
   return str;
}
 
#define DELIM " \t\n"
 
int main(void){
   char str[] = "string for testing encryption engine";
 
   printf("Origin:    %s\n", str);
   printf("Encrypted: %s\n", cryptstr(str, DELIM));
   printf("Decrypted: %s\n", cryptstr(str, DELIM));
 
   return 0;
}
0
fasked
30.11.2011, 01:09
  #12

Не по теме:

easybudda, ссылка у меня открывает пустой проект :scratch:

0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10841 / 6672 / 1614
Регистрация: 25.07.2009
Сообщений: 12,442
30.11.2011, 01:17 13
fasked, да, чё-то не задалось со ссылкой. На планшетке вообще в разных окошках текст писать/редактировать/копировать/вставлять - наказание. Ну или я криворукий такой... Но оно работает... Вроде бы...
0
Эксперт С++
4252 / 2226 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.11.2011, 07:33 14
Цитата Сообщение от Tanja Посмотреть сообщение
Шифрование файла выполняется по следующему правилу: в каждом слове строки первый символ меняется местами со вторым, третий с четвертым и так далее.
При таком алгоритме нет зависимости от ключа, поэтому это не шифрование, а кодирование
0
Заблокирован
30.11.2011, 17:26 15
да и не кодирование, нету канала связи, шумов, коррекции... порстая задачка на символы в "красивой упаковке"

Добавлено через 51 секунду
Цитата Сообщение от easybudda Посмотреть сообщение
Но оно работает... Вроде бы...
работает и на четных, и на нечетных, и все освобождается что ранее было выделено.
0
Эксперт С++
4252 / 2226 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.11.2011, 17:36 16
alkagolik, кодирование это преобразование, каналы связи к этому общему понятию можно не прикреплять. Ну, скажет так, здесь преобразование информации.
0
Эксперт С++
5016 / 2595 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.11.2011, 17:40 17
А я бы назвал это маски́рование
0
Эксперт С++
4252 / 2226 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.11.2011, 17:41 18
Цитата Сообщение от fasked Посмотреть сообщение
А я бы назвал это маски́рование
да хоть и так, НО никак не шифрование
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2011, 17:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Шифрование
Здравствуйте, почему при шифровании, например текста 14 байт получается 20 байт? как влияют символы...

Шифрование
Как возможно проверить, насколько надежно шифрование?

Шифрование
Привет всем:) особенно тем кто в этот день тратит свое время на программирование:) Помогите решить...

Шифрование
Собственно, вопрос не совсем по си++, но нашел это место оптимальным. Так вот, речь пойдет о...


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

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

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