Форум программистов, компьютерный форум CyberForum.ru

Шифрование - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Tanja
0 / 0 / 0
Регистрация: 11.07.2011
Сообщений: 12
27.11.2011, 22:47     Шифрование #1
Создать выходной зашифрованный файл на основе входного. Шифрование файла выполняется по следующему правилу: в каждом слове строки первый символ меняется местами со вторым, третий с четвертым и так далее. Выполнить дешифровку созданного файла.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2011, 22:47     Шифрование
Посмотрите здесь:

C++ Шифрование
шифрование C++
C++ Шифрование и дешифрование
C++ Шифрование
C++ c++ шифрование
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ogcjm124
2 / 2 / 0
Регистрация: 31.07.2011
Сообщений: 143
28.11.2011, 00:06     Шифрование #2
Если нечётное количество символов последний на месте остаётся?
Tanja
0 / 0 / 0
Регистрация: 11.07.2011
Сообщений: 12
28.11.2011, 00:22  [ТС]     Шифрование #3
да. последний остается на месте.
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
28.11.2011, 00:23     Шифрование #4
Какие у Вас варианты алгоритмизации данной задачи ?
alenka-46
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 минуты
Этот алгоритм стоит проверить на наличие ошибок и протестировать

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

Надеюсь, что этот алгоритм поможет хоть чем-то
ogcjm124
2 / 2 / 0
Регистрация: 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;
}
SleepMaster
 Аватар для SleepMaster
40 / 40 / 1
Регистрация: 26.11.2011
Сообщений: 80
28.11.2011, 00:54     Шифрование #7
Цитата Сообщение от ogcjm124 Посмотреть сообщение
system("clrscr");
Нету такой команды в командной строке, есть
C++
1
system("cls");
ogcjm124
2 / 2 / 0
Регистрация: 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");
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
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;
}
Tanja
0 / 0 / 0
Регистрация: 11.07.2011
Сообщений: 12
30.11.2011, 00:06  [ТС]     Шифрование #10
Спасибо за помощь!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
fasked
30.11.2011, 01:09
  #12

Не по теме:

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

easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
30.11.2011, 01:17     Шифрование #13
fasked, да, чё-то не задалось со ссылкой. На планшетке вообще в разных окошках текст писать/редактировать/копировать/вставлять - наказание. Ну или я криворукий такой... Но оно работает... Вроде бы...
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.11.2011, 07:33     Шифрование #14
Цитата Сообщение от Tanja Посмотреть сообщение
Шифрование файла выполняется по следующему правилу: в каждом слове строки первый символ меняется местами со вторым, третий с четвертым и так далее.
При таком алгоритме нет зависимости от ключа, поэтому это не шифрование, а кодирование
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
30.11.2011, 17:26     Шифрование #15
да и не кодирование, нету канала связи, шумов, коррекции... порстая задачка на символы в "красивой упаковке"

Добавлено через 51 секунду
Цитата Сообщение от easybudda Посмотреть сообщение
Но оно работает... Вроде бы...
работает и на четных, и на нечетных, и все освобождается что ранее было выделено.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.11.2011, 17:36     Шифрование #16
alkagolik, кодирование это преобразование, каналы связи к этому общему понятию можно не прикреплять. Ну, скажет так, здесь преобразование информации.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.11.2011, 17:40     Шифрование #17
А я бы назвал это маски́рование
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2011, 17:41     Шифрование
Еще ссылки по теме:

C++ Шифрование
Шифрование C++
Шифрование C++

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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
30.11.2011, 17:41     Шифрование #18
Цитата Сообщение от fasked Посмотреть сообщение
А я бы назвал это маски́рование
да хоть и так, НО никак не шифрование
Yandex
Объявления
30.11.2011, 17:41     Шифрование
Ответ Создать тему
Опции темы

Текущее время: 13:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru