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

шифратор методом магического квадрато - C++

Восстановить пароль Регистрация
 
Strelec
Сообщений: n/a
22.01.2012, 09:34     шифратор методом магического квадрато #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
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
// 
#include "stdafx.h"
#include "Matrix.h"
 
void encode(char *magicSquareFileName, char *inputFileName, char *outputFileName);  // зашифровать
void decode(char *magicSquareFileName, char *inputFileName, char *outputFileName);  // расшифровать
 
int main(int argc, char* argv[])
{
  setlocale(LC_ALL, "rus"); // определить кодовую страницу для России
  if (argc!=5) {  // задано недостаточное количество параметров командной строки
    cout << "Образец запуска: ";
    cout << "   encode/decode  ";
    cout << "magic_square_file - имя файла, содержащего магический квадрат ";
    cout << "input_file - имя входного файла ";
    cout << "output_file - имя файла для сохранения результата ";
    cout << "encode - зашифровать ";
    cout << "decode - расшифровать ";
    exit(1);
  }
    
  if (toupper(*argv[4])=='E') {  // в командной строке задано Encode - зашифровываем
    encode(argv[1], argv[2], argv[3]);
  } else {
    decode(argv[1], argv[2], argv[3]);  // иначе расшифровываем
  }
  
  return 0;
}
 
void encodeBody(const int magicSquareSize, 
        MagicMatrix &magicSquare, 
        MessageMatrix &msgMatrix,
        char *pMsgBuffer,
        ofstream &outputFile) {
  // зашифровать по магическому квадрату: буквы сообщения заполняют матрицу согласно 
  // значениям чисел в ячейках квадрата - число используется как порядковый номер символа
  // в строке
  for (int i=0; i    for (int j=0; j      int elementNumber = magicSquare.getElement(i,j) - 1;
      msgMatrix.setElement(i, j, pMsgBuffer[elementNumber]);
    }
  }
  // сохранить результат шифрования в файле
  for (int i=0; i    for (int j=0; j      outputFile.put(msgMatrix.getElement(i,j));
    }
  }
  msgMatrix.initMatrix();  // инициализация перед обработкой следующей части сообщения
}
 
 
// зашифровать сообщение
void encode(char *magicSquareFileName, char *inputFileName, char *outputFileName) {
  
  MagicMatrix magicSquare(magicSquareFileName); // получить магический квадрат
  if (magicSquare.getSize()==0) {
    exit(1);
  }
  MessageMatrix msgMatrix(magicSquare.getSize());  // пустая матрица по размерности магического квадрата  
  
  ifstream inputFile(inputFileName, ios::in);
  if (!inputFile) {
    cerr << "Не могу открыть файл с сообщением " << inputFileName << endl;
    exit(1);
  }
  ofstream outputFile(outputFileName, ios::out);
  if (!outputFile) {
    cerr << "Не могу открыть файл для записи сообщения " << outputFileName << endl;
    inputFile.close();
    exit(1);
  }
 
  int magicSquareSize = magicSquare.getSize();
  int msgSize =  magicSquareSize * magicSquareSize; // размер сообщения, которое можно разместить в квадрате
  char *pMsgBuffer = new char[msgSize];
  int currMsgSize = 0;  // текущий размер сообщения
  char strBuffer[MAX_ROW_LENGTH];  // буферная строка
  do {
    inputFile.getline(strBuffer, MAX_ROW_LENGTH, ' ');
    size_t k=0; 
    size_t strLength = strlen(strBuffer);
    while (k      if (currMsgSize        pMsgBuffer[currMsgSize++] = strBuffer[k++];
      } else {
        encodeBody(magicSquareSize, magicSquare, msgMatrix, pMsgBuffer, outputFile);  // шифровка очередной части
        currMsgSize = 0;
      }
    }
  } while (!inputFile.eof());
  if (currMsgSize    for (int i=currMsgSize; i      pMsgBuffer[i] = ' ';
    }
  }
  encodeBody(magicSquareSize, magicSquare, msgMatrix, pMsgBuffer, outputFile);
 
  // освободить ресурсы
  inputFile.close();
  outputFile.close();
  delete [] pMsgBuffer;
}
 
void decodeBody(const int magicSquareSize, 
        MagicMatrix &magicSquare, 
        int msgSize,
        MessageMatrix &msgMatrix,
        char *pMsgBuffer,
        ofstream &outputFile) {
  // расшифровать по магическому квадрату: буквы сообщения заполняют матрицу согласно 
  // значениям чисел в ячейках квадрата - число используется как порядковый номер символа
  // в строке
  int k = 0;
  for (int i=0; i    for (int j=0; j      msgMatrix.setElement(i, j, pMsgBuffer[k++]);
    }
  }
  // сохранить результат шифрования в файле
  for (int i=0; i    for (int j=0; j      int elementNumber = magicSquare.getElement(i,j) - 1;
      pMsgBuffer[elementNumber] = msgMatrix.getElement(i, j);
    }
  }
  for (int i=0; i    outputFile.put(pMsgBuffer[i]);
  }
  msgMatrix.initMatrix();
}
 
// расшифровать сообщение
void decode(char *magicSquareFileName, char *inputFileName, char *outputFileName) {
MagicMatrix magicSquare(magicSquareFileName); // получить магический квадрат
  if (magicSquare.getSize()==0) {
    exit(1);
  }
  MessageMatrix msgMatrix(magicSquare.getSize());  // пустая матрица по размерности магического квадрата  
  
  ifstream inputFile(inputFileName, ios::in);
  if (!inputFile) {
    cerr << "Не могу открыть файл с сообщением " << inputFileName << endl;
    exit(1);
  }
  ofstream outputFile(outputFileName, ios::out);
  if (!outputFile) {
    cerr << "Не могу открыть файл для записи сообщения " << outputFileName << endl;
    inputFile.close();
    exit(1);
  }
 
  int magicSquareSize = magicSquare.getSize();
  int msgSize =  magicSquareSize * magicSquareSize; // размер сообщения, которое можно разместить в квадрате
  char *pMsgBuffer = new char[msgSize];
  int currMsgSize = 0;  // текущий размер сообщения
  char strBuffer[MAX_ROW_LENGTH];  // буферная строка
  do {
    inputFile.getline(strBuffer, MAX_ROW_LENGTH, ' ');
    size_t k=0; 
    size_t strLength = strlen(strBuffer);
    while (k      if (currMsgSize        pMsgBuffer[currMsgSize++] = strBuffer[k++];
      } else {
        decodeBody(magicSquareSize, magicSquare, msgSize, msgMatrix, pMsgBuffer, outputFile);
        currMsgSize = 0;
      }
    }
  } while (!inputFile.eof());
  decodeBody(magicSquareSize, magicSquare, msgSize, msgMatrix, pMsgBuffer, outputFile);
 
  // закрыть файлы и освободить память
  inputFile.close();
  outputFile.close();
  delete [] pMsgBuffer;
 
}
#include "StdAfx.h"
#include "Matrix.h"
 
template  Matrix::Matrix(int size) {
  setSize(size);
  initMatrix();
}
 
template  void Matrix::initMatrix() {
  int size = getSize();
  for (int i=0; i    for (int j=0; j      setElement(i, j, (data_Type) 0);
}
 
 
 
// конструктор - магический квадрат считывается из указанного пользователем файла fileName
MagicMatrix::MagicMatrix(char *fileName) {
 
  setSize(0); 
  ifstream inputFile(fileName, ios::in);
 
  if (!inputFile) {
    cerr << "Не могу открыть файл <" << fileName << ">" << endl;
    exit(1);
  }
  
  int i, j;
  try {
    CString textLine;  // строка для чтения файла
    char strBuffer[MAX_ROW_LENGTH];  // буферная строка
    CString resToken;  // строка для найденных чисел
    i = j = 0;
    do {
      inputFile.getline(strBuffer, MAX_ROW_LENGTH, ' ');
      textLine = strBuffer;  // перенос данных в объект CString для последующей обработки
      int curPos = 0;      // текущая позиция в обрабатываемой строке
      resToken = textLine.Tokenize((wchar_t *) " ", curPos);  // разбор строки на элементы, разделенные пробелами
      while (resToken != "") {
        char strNumber[3] = "";
        for (int k=0; k          strNumber[k] =  (char) resToken.GetAt(k);
        }
        setElement(i, j, atoi(strNumber));
        j++;
        resToken= textLine.Tokenize((wchar_t *) " ",curPos);
      };
      i++; j = 0;  
    } while (!inputFile.eof());
    setSize(i-2); // сохранить размерность квадрата
  } catch(char *errMess) {
    cout << errMess << endl;
    if (inputFile) {
      inputFile.close();
    }
  }
 
  if (inputFile) {
    inputFile.close();
  }
}
 
 
MessageMatrix::MessageMatrix(int size):Matrix(size) {
 
}
#pragma once
 
#define MAX_MATRIX_SIZE 15  // максимальная размерность магического квадрата, с которой работает программа
 
// класс-шаблон для работы с матрицами-квадратами
// в матрицах будут храниться как целые числа, так и символы шифруемого сообщения
template  class Matrix
{
  int currentMatrixSize;  // текущий размер матрицы, по строкам и столбцам
  data_Type data[MAX_MATRIX_SIZE][MAX_MATRIX_SIZE];  // данные матрицы
public:
  Matrix() { Matrix(0); }  // конструктор по-умолчанию
  Matrix(int size);     // конструктор для матрицы заданного размера
  void initMatrix();     // инициализация элементов матрицы значением 0
  data_Type getElement(int i, int j) { return data[i][j]; }  // вернуть элемент матрицы из i-й строки и 
                                 // j-го столбца
  void setElement(int i, int j, data_Type element) { data[i][j] = element; } // присвоить элементу матрицы 
                                         // заданное значение 
  int getSize() { return currentMatrixSize; }  // вернуть текущий размер матрицы
  void setSize(int size) { currentMatrixSize = size; }  // установить текущий размер матрицы
public:
  
};
 
 
// класс для работы с магическими квадратами, тип элементов матрицы - целый
class MagicMatrix: public Matrix {
 
public:
  MagicMatrix(char *fileName);
  
};
 
// класс для работы с текстовым сообщением, тип элементов - символ
class MessageMatrix: public Matrix {
 
public:
  MessageMatrix(int size);
  
};
есть две проблемы
программа выдает много ошибок
и я не знаю где и как менять исходный код чтобы шифровать файлы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2012, 09:34     шифратор методом магического квадрато
Посмотрите здесь:

C++ Построение магического квадрата
C++ Доработать код для магического квадрата
Простой шифратор C++
C++ Генерация магического квадрата
C++ Шифратор и дешифратор
C++ Шифровать методом Магического квадрата (размер квадрата 9х9) С++
C++ Шифрование текста с применением магического квадрата
Способы перенастройки магического портала, чтобы строго увеличить количество совершенных городов в королевстве C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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