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

Шифрование символов в файле - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Paster
0 / 0 / 0
Регистрация: 09.06.2009
Сообщений: 3
14.06.2012, 01:24     Шифрование символов в файле #1
День добрый!
Проблема такова:
Есть файл содержащий исходный набор символов(текст, строки и т.д.).
нужно составить программу для шифрования каждого символа исходного файла методом добавления определенного ключа, записать эту последовательность в другой файл, и дешифровать сообщение в третий файл.

Есть исходный код на Delphi.
Pascal
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
program Crypto;
{$APPTYPE CONSOLE}
 
const
  KEY = 'ASO';
 
var
  fi, fo, fu: File;
  input, output: byte;
  j, len: integer;
 
begin
  Assign(fi, 'input.txt');
  Assign(fo, 'output.txt');
  Assign(fu, 'output2.txt');
  Reset(fi,1);
  Rewrite(fo,1);
  Rewrite(fu,1);
  try
    j := 1;
    len := length(KEY);
    while not(EoF(fi)) do
    begin
      blockread(fi, input, 1);
      output := (input+ord(KEY[j])) mod 256;
      blockwrite(fo, output, 1);
      j := j + 1;
      if j > len then
        j := 1
    end;
    Close(fo);
    Reset(fo,1);
    j := 1;
    while not(EoF(fo)) do
    begin
      blockread(fo, input, 1);
      output := (input+256-ord(KEY[j])) mod 256;
      blockwrite(fu, output, 1);
      j := j + 1;
      if j > len then
        j := 1
    end;
  finally
    Close(fi);
    Close(fo);
    Close(fu);
  end;
end.
Можно его переправить на с++?
Очень надо! Сдавать лабу надо 14.06.
Спасибо за ранее

Добавлено через 9 часов 30 минут
В общем чего то я "намутил", получился такой код:
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
//---------------------------------------------------------------------------
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
 
 
 
using namespace std;
//---------------------------------------------------------------------------
void main()
{
    //fstream  in, crypt, decrypt;
    ifstream in;
    fstream crypt;
    ofstream decrypt;
    in.open("C:\\in.txt",ios::out|ios::binary);
    crypt.open("C:\\crypt.txt",ios::in|ios::out|ios::binary);
    decrypt.open("C:\\decrypt.txt",ios::in|ios::binary);
 
    char *key = "sd";
    /*cout<<"Vvedite Kluch: ";
    cin>>*key; */
    double n=strlen(key);
    double i=0;
    short int j;
    char temp, buff=NULL;
    while(!in.eof())
    {
        in.read((char*)&buff, sizeof(buff));
        //b=buff;
        j=fmod(i,n);
        temp=buff^key[j];
        crypt.put(temp);
        i++;
        buff=NULL;
    }
    in.close();
    //crypt.close();
    //crypt.open("C:\\crypt.txt",ios::out|ios::binary);
    decrypt.open("C:\\decrypt.txt",ios::in|ios::binary);
    double k=0;
    short int b;
    char temp1, buff1=NULL;
    while (!crypt.eof())
    {
        crypt.read((char*)&buff1, sizeof(buff1));
        //b=buff;
        b=fmod(k,n);
        temp1=buff1^key[j];
        decrypt.write((char*)&temp1,sizeof(temp1));
        k++;
        buff1=NULL;
    }
    crypt.close();
    decrypt.close();
 
    getch();
}
Вопрос сейчас встал в том, чтоб открыть файл crypt.txt для чтения из него во второй части кода!
т.е. сначала в него записываем шифрованное сообщение, закрываем, а потом открываем для чтения.
Уже битый час сижу и отупляю((((
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2012, 01:24     Шифрование символов в файле
Посмотрите здесь:

Сортировка символов в файле C++
C++ Замена символов в файле
C++ добавление символов в файле
Шифрование методом перестановки символов в заданном порядке C++
Шифрование текста в файле C++
Подсчёт символов в файле. C++
Подсчет символов в файле C++
C++ Подсчет символов в файле
C++ Шифрование текста путем замены символов
Шифрование / дешифрование (метод перестановки символов) C++
C++ Подсчет символов в файле
C++ Как организовать шифрование данных в текстовом файле?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dima koz
 Аватар для dima koz
23 / 17 / 1
Регистрация: 05.06.2012
Сообщений: 72
Записей в блоге: 5
14.06.2012, 02:13     Шифрование символов в файле #2
лови

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
86
87
#include "stdafx.h"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE,"RUSSIAN");
    //инициализация ключа
    int key[5] = {1,2,4,5,8};
 
    int count = 0;
    
    //чтение файла-оригинала
    ifstream filestr,forUnEncrypting;
    ofstream fileEncrypted,UnEncrypted;
    
    filestr.open("d:\\enrcyption\\be_god.txt",ifstream::in);
    if (filestr.is_open())
        {
      while (!filestr.eof() ) 
      {
          filestr.get();
          count++;
      }
    }
    filestr.close();
     
    int  *buffer = new int[count];
 
    filestr.open("d:\\enrcyption\\be_god.txt");
 
    if (filestr.is_open())
    {
        int i;
      for (i=0;!filestr.eof();i++ ) 
        {
          buffer[i] = filestr.get();
        }
    }
    filestr.close();
 
    //запись с шифрованием
 
    fileEncrypted.open("d:\\enrcyption\\be_god_Encrypted.txt");
    
    int j;
    for (j=0;j < count;)
    {
        int i;
        for (i=0;i<5;i++,j++)
        {
            fileEncrypted.put(char(buffer[j]+key[i])) ;
    }
      }
      fileEncrypted.close();
 
 
      forUnEncrypting.open("d:\\enrcyption\\be_god_Encrypted.txt");
 
      int  *bufferForUnEcrypting = new int[count];
 
    if (forUnEncrypting.is_open())
    {
        int i;
      for (i=0;!forUnEncrypting.eof();i++ ) 
        {
          bufferForUnEcrypting[i] = forUnEncrypting.get();
        }
    }
    forUnEncrypting.close();
 
    UnEncrypted.open("d:\\enrcyption\\be_god_UnEncrypted.txt");
    
    
    for (j=0;j < count;)
    {
        int i;
        for (i=0;i<5;i++,j++)
        {
            UnEncrypted.put(char(bufferForUnEcrypting[j]-key[i])) ;
    }
      }
      UnEncrypted.close();
 
 
      
    return 0;
}
образец, над которым делаются действия - http://lib.ru/STRUGACKIE/be_god.txt

шифрование простенькое, но работает
dima koz
 Аватар для dima koz
23 / 17 / 1
Регистрация: 05.06.2012
Сообщений: 72
Записей в блоге: 5
16.06.2012, 04:20     Шифрование символов в файле #3
переписал предыдущий код, теперь немного лучше и проще:

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
// encryption.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE,"RUSSIAN");
 
    //инициализация ключа
    //
    int key[5] = {1,2,4,5,8};
    
    int i; 
    
    ifstream filestr,forUnEncrypting;
    ofstream fileEncrypted,fileUnEncrypted;
    
    filestr.open("d:\\enrcyption\\be_god.txt",ifstream::in); //чтение образца
    fileEncrypted.open("d:\\enrcyption\\be_god_Encrypted.txt"); //запись зашифрованного
    if (filestr.is_open())
    {
        while (!filestr.eof()) 
        {
            for (i=0;i<5;i++)
            {
                fileEncrypted.put(char(filestr.get()+key[i])) ;
            }
        }
    }
    filestr.close();
    fileEncrypted.close();
 
    forUnEncrypting.open("d:\\enrcyption\\be_god_Encrypted.txt");//чтение зашифрованного
    fileUnEncrypted.open("d:\\enrcyption\\be_god_UnEncrypted.txt");//запись расшифрованного
 
    if (forUnEncrypting.is_open())
    {
        while (!forUnEncrypting.eof()) 
        {
            for (i=0;i<5;i++)
            {
                fileUnEncrypted.put(char(forUnEncrypting.get()-key[i])) ;
            }
        }
    }
    forUnEncrypting.close();
    fileUnEncrypted.close();
 
    return 0;
 
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.06.2012, 06:20     Шифрование символов в файле #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Paster Посмотреть сообщение
Есть файл содержащий исходный набор символов(текст, строки и т.д.).
нужно составить программу для шифрования каждого символа исходного файла методом добавления определенного ключа, записать эту последовательность в другой файл, и дешифровать сообщение в третий файл.
Простейшими шифрами с ключом являются ксорка, циклический алфавитный сдвиг и замена символов по таблице отображения. Можно двигать/заменять хоть коды по всему шрифту. Ксорка - это побитовое исключающее И, на c++ делается через
C++
1
^
. Ключ - данное той же разрядности, с которым ксоришь, для расшифровки надо повторно заксорить с тем же ключом. Если повторно заксорить вместо ключа с текстом, то восстановишь ключ вместо текста. Таким образом, ксорка симметрична. Можно циклически менять байты/слова ключа в пределах всего сообщения, тогда ключь - массив элементов той же разрядности:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Encode(char *text, *key, unsigned int KeyLength)
{
 char *p;
 unsigned  i;
 for (i=0, p=text; *(p-1)!=0, ++p, i=(i+1)%KeyLength)
 {
  *p^=key[i];
 }
}
void Decode(char *text, *key, unsigned int KeyLength)
{
 char *p;
 unsigned  i;
 for (i=0, p=text; *(p-1)!=key[i], ++p, i=(i+1)%KeyLength)
 {
  *p^=key[i];
 }
}
. Циклический сдвиг - это, например, "A" становится "В", "Б "- "Г" и так далее, а в конце "Э" - "Я", "Ю" - "А", "Я" - "Б". Или наоборот. Ключ - буква, в которую превращается "A", для расшифровки двигай в обратную сторону. Таким образом, циклический сдвиг асимметричен, но не в том смысле, какой в это вкладывают криптографы, так как оба ключа одинаково просто вычисляются друг по другу: если шифрующий "В", то дешифрующий "Ю". Пусть буква шифрующего ключа отстоит от "А" на n букв в право, тогда буква дешифрующего ключа отстоит от "Я" на n-1 букв влево и если буква дешифрующего ключа отстоит от "Я" на n букв влево, то буква шифрующего ключа отстоит от "А" на n+1 букв в право. Асимметричный эе шифр должне иметь асимметричную сложность вычисления ключей друг по другу. Но если циклический сдвиг алфавита рассматривать только как преоборазование, но не как шифр, то оно симметрично. Ключ может быть словом естественного языка, фразой, аброкадаброй, или вообще любым сочетанием букв, тогда буквы ключа циклически меняются по всему сообщению, аналогично циклической смене байтов ключа ксорки. Способ табличной шифрации и дешифрации и что есть ключ в этом случае комментировать не буду, это должно быть и так понятно каждому, кто знаком вообще со словом "таблица". Напишу только, что такие шифры тоже допускают циклическую смену ключа. Табличный шифр тоже симметричен в криптографическом значении слов "симметричный"/"асимметричный", но ассиметричен, как преобразование.
RUSya82
 Аватар для RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
16.06.2012, 06:39     Шифрование символов в файле #5
Я что то подобное когда то писал.
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*ÏðîãðГ*ììГ* øèôðóåò/äåøèôðóåò ëþáîé ГґГ*éë
ÒåñòèðîâГ*Г«Г*Г±Гј Г*Г* .avi, .doc, .txt, mp3.
*/
#include <iostream>
#include <conio.h>
#include <fstream>
#include <cstring>
#include <stdio.h>
#include <windows.h>
 
using namespace std;
/*------key1 - êëþ÷. ГЇГ*ðîëü///filename1[30] - èìÿ ГґГ*éëГ* Г*Г* âõîäå
filename2[30] - èìÿ ГґГ*éëГ* Г*Г* âûõîäå///k1 - äëèГ*Г* êëþ÷Г*
coding1,2,3 - ïåðåìåГ*Г*ûå äëÿ ïðåîáðГ*çîâГ*Г*ГЁГї èñõîäГ*îãî ñèìâîëГ**/
int main()
{
    FILE *fp1, *fp2, *fp3, *fp4;//îáúÿâëÿåì ïîòîêè
    char filename1[30], filename2[30],key1[20];
    int n=0,m=0,k1;
    unsigned char code=0;
    int temp;
    int coding1, coding2, coding3, coding4, z;
    cout << "1 - Г‡Г*øèôðîâГ*ГІГј ГґГ*éë.\n" << "2 - Г°Г*ñøèôðîâГ*ГІГј ГґГ*éë\n";
    cin >> z;
    if(z==1)
    {
       cout << "Ââåäèòå ГЇГ*ðîëü äëÿ øèôðîâГ*Г*ГЁГї: ";
       cin >> key1;
       cout << "key = " << key1;
       cout << "\nÂâåäèòå èìÿ ГґГ*éëГ* äëÿ øèôðîâГ*Г*ГЁГї: ";
       cin >> filename1;
       k1 = strlen(key1);//îáðГ*áîòêГ* êëþ÷Г*
       cout << "k1 = " << k1 << endl;
       for(int i=0;i<k1;i++)
       {
            code = (code + key1[i]);
       } 
       // m - âû÷èñëÿåòñÿ ГЁГ§ êëþ÷Г* ñëîæåГ*ГЁГҐГ¬ ГЇГ® ìîäóëþ 2^6
       for(int i=1;i<k1;i++)
       {
            m = (key1[i-1] + key1[i])%64;
       }
       cout << "m = " << m << endl;
       /*îòðûâГ*ГҐГІ âõîäГ*îé ГґГ*éë òîëüêî äëÿ 
       Г·ГІГҐГ*ГЁГї Гў ГЎГЁГ*Г*Г°Г*îì ðåæèìå*/
       fp1 = fopen(filename1, "rb");
       if (!fp1)
       {
          cout << "ГЋГёГЁГЎГЄГ* îòêðûòèÿ ГґГ*éëГ*\n";
          getch();
          exit(1);
       }
       cout << "\nÂâåäèòå èìÿ Г§Г*øèôðîâГ*Г*Г*îãî ГґГ*éëГ*: ";
       cin >> filename2;
       /*îòêðûâГ*ГҐГ¬ Г*îâûé ГґГ*éë äëÿ Г§Г*ГЇГЁГ±ГЁ
       Гў ГЎГЁГ*Г*Г°Г*îì ðåæèìå*/
       fp2 = fopen(filename2, "wb");
       if (!fp2)
       {
          cout << "ГЋГёГЁГЎГЄГ* îòêðûòèÿ ГґГ*éëГ*\n";
          getch();
          exit(1);
       }
       for(int i = 0;i<16;i++)
        {
       while((temp = getc(fp1)) != EOF)
       {
          //ГЁГ*âåðòèðóåì ГЎГЁГІГ»
          coding1 = ~temp;
          //Èñêëþ÷Г*ГѕГ№ГҐГҐ ÈËÈ
          coding2 = coding1^code;
          //ÑëîæåГ*ГЁГҐ
          coding3 = coding2 + code;
          //Èñêëþ÷Г*ГѕГ№ГҐГҐ ÈËÈ Г± m
          coding4 = coding3^m;
 
          putc(coding4,fp2);
       };
       }
       fclose(fp1);
       fclose(fp2);
    }
    else
    {
        cout << "Ââåäèòå ГЇГ*ðîëü äëÿ Г°Г*ñøèôðîâêè: ";
        cin >> key1;
        cout << "\nkey = " << key1;
        k1 = strlen(key1);
        cout << "\nk1 = " << k1 << endl;
        for(int i=0;i<k1;i++)
        {
            code = (code + key1[i]);
        } 
        for(int i=1;i<k1;i++)
        {
            m = (key1[i-1] + key1[i])%64;
        }
        cout << "m = " << m << endl;
        cout << "\nÂâåäèòå èìÿ ГґГ*éëГ* äëÿ Г°Г*ñøèôðîâГ*Г*ГЁГї: ";
        cin >> filename1;
        fp3 = fopen(filename1, "rb");
        if (!fp3)
        {
        cout << "ГЋГёГЁГЎГЄГ* îòêðûòèÿ ГґГ*éëГ*\n";
        getch();
        exit(1);
        }
        cout << "\nÂâåäèòå èìÿ Г°Г*øèôðîâГ*Г*Г*îãî ГґГ*éëГ*: ";
        cin >> filename2;
        fp4 = fopen(filename2, "wb");
        if (!fp4)
        {
           cout << "ГЋГёГЁГЎГЄГ* îòêðûòèÿ ГґГ*éëГ*\n";
           getch();
           exit(1);
        }
        /*Г‡Г*ГЇГіГ±ГЄГ*ГҐГ¬ öèêë øèôðîâГ*Г*ГЁГї 16 Г°Г*Г§*/
        for(int i = 0;i<16;i++)
        {
           while((temp = getc(fp3)) != EOF)
           {
               coding1 = temp^m;
               coding2 = coding1 - code;
               coding3 = coding2^code;
               coding4 = ~coding3;
               putc(coding4,fp4);
           };
        }
        fclose(fp3);
        fclose(fp4);
    }
    cout << "END\n";
    MessageBox(NULL, "END", "END", MB_OK);
    getch();
    return 0;
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.06.2012, 07:37     Шифрование символов в файле #6
Я как то делал последовательно-циклическую ксорку с тремя ключами разной длины: каждый байт сообщения последовательно ксорится с байтами всех трехё ключей, а в пределах сообщения байты каждого ключа меняются циклически. И длина ключей не кратна. Специально брались три простых числа на длины: 2, 3 и 5 байт.
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
void Encode(uint8_t *Data, uint8_t *Key1, uint8_t *Key2, uint8_t Key3, unsigned long int Length)
{
 uint8_t *p;
 uint8_t *Last;
 int i;
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%2)
 {
  *p^=Key1[i];
 }
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%3)
 {
  *p^=Key2[i];
 }
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%5)
 {
  *p^=Key3[i];
 }
}
void Decode(uint8_t *Data, uint8_t *Key1, uint8_t *Key2, uint8_t Key3, unsigned long int Length)
{
 uint8_t *p;
 uint8_t *Last;
 int i;
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%5)
 {
  *p^=Key3[i];
 }
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%3)
 {
  *p^=Key2[i];
 }
 for (Last=Data+Length-1, p=-Data, i=0; p<=Last; ++p, i=(i+1)%2)
 {
  *p^=Key1[i];
 }
}
Добавлено через 5 минут
Фокус в том, что все три ключа эквивалентны одному 30-ти байтному с дырявым даиапазоном допустимых значений, но их суммарная длина всего 10 байт. И если не знать, что ключей 3, что они не распределены по собщению, как байты в обычной циклической ксорке, а вот так вот накладываются и какой они на самом деле длины, то можно долго подбирать варианты ключа, каких быть вообще не могло.

Добавлено через 30 минут
Есть ещё перестановочные шифры. В этих шифрах элементы сообщения не заменяются, а переставляются. Пропробуй прочитать: "рнёрп сотщвесыаЕф е еньчтеошыи". Но здесь все символы те же, что и в незашифрованнной версии, только ни перпутаны.

Добавлено через 1 минуту
Ключ - данное, описывающее перестановку. Можно переставлять не только элементы, имеющие смысл в исходном сообщении, но и байты многобайтных данных (в том числе, многобайтных кодов символов) и даже части байт, вплоть до перестановки отдельных бит.
Yandex
Объявления
16.06.2012, 07:37     Шифрование символов в файле
Ответ Создать тему
Опции темы

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