2015 [9-10] Дешифрование
Текстовый файл «encrypttext.txt» был получен, применяя 2015 раз функцию Encrypt (см. листинг 1) к исходному файлу. Расшифруйте файл «encrypttext.txt» по крайней мере в 1000 раз быстрее, чем он был зашифрован.
char * ReadMassFromFile(ifstream &inFile, int &outN) //1
{
char tempMass[10]; //2
char buff; //3
int i(0); //4
while (!inFile.eof() && (i<10)) //5
{
inFile.get(buff); //6
if (inFile) tempMass[i++] = buff; //7
}
char * outMass = new char [i]; //8
for (int j = 0; j
outN = i; //10
return outMass; //11
}
void EncryptMass(char * Mass, int n) //12
{
if (n!=10) return; //13
char temp[10]; //14
for (int i = 0; i < 10; i++) temp[i] = Mass[i]; //15
for(int i=0;i
return; //17
}
void WriteMassToFile(ofstream &outFile, char * mass, int n) //18
{
for (int i=0; i
delete [] mass; //20
return; //21
}
int Encrypt(char * inFile, char* outFile) //22
{
ifstream openText(inFile); //23
ofstream encryptText(outFile); //24
if (!openText || !encryptText) return -1; //25
while (!openText.eof()) //27
{
int n; //28
char *buffMass = ReadMassFromFile(openText, n); //29
EncryptMass(buffMass, n); //30
WriteMassToFile(encryptText,buffMass, n); //31
}
return 1; //32
}
Листинг 1. Исходный код программы шифрования файла Показать подсказку
Показать решение
Рассмотрим функцию Encrypt(строки 22-32). Чтение блока данных перед шифрованием осуществляет функцияReadMassFromFile. В результате ее работы считывается блок данных длинной 10 байт из входного файла (строка 5). Полученный массив передается функции EncryptMass, которая преобразует его. Затем функция WriteMassToFileзаписывает преобразованные данные в выходной файл. Таким образом, непосредственное шифрование происходит в функции EncryptMass, которая осуществляет перестановку элементов массива. Новый индекс элемента с номером iвычисляется по формуле i3+2 (строка 16). Эта формула задает следующее отображение
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
2
|
3
|
0
|
9
|
6
|
7
|
8
|
5
|
4
|
1
|
Рассмотрим, как действует это преобразование применённое несколько раз:
0→2→0 : цикл длины 2;
1→3→9→1 : цикл длины 3;
4→6→8→4: цикл длины 3;
5→7→5: цикл длины 2.
Таким образом, после применения этого преобразование 6 раз подряд будет получен начальный текст. По условию задачи, преобразование применялось 2015 раз. Так как 2015 = 6*335 + 5, то для получения открытого текста необходимо применить функцию Encrypt к файлу encrypttext.txt один раз.
Показать ответ
для получения открытого текста необходимо применить функцию Encrypt к файлу encrypttext.txt один раз
<< Назад в раздел (Все задания)