Текстовый файл «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<i; j++) outMass[j] = tempMass[j]; //9
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<n;i++) Mass[(i*i*i*i*i+i*i*i+9*i+8)%10]=temp[i]; //16
return; //17
}
void WriteMassToFile(ofstream &outFile, char * mass, int n) //18
{
for (int i=0; i<n; i++) outFile.put(mass[i]); //19
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 вычисляется по формуле i5+i3+9i+8 (строка 16). Эта формула задает следующее отображение
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
8 |
9 |
6 |
5 |
2 |
3 |
4 |
1 |
0 |
7 |
Рассмотрим, как действует это преобразование применённое несколько раз:
0→8→0 : цикл длины 2;
9→7→1→9 : цикл длины 3;
6→4→2→6: цикл длины 3;
5→3→5: цикл длины 2.
Таким образом, после применения этого преобразование 6 раз подряд будет получен начальный текст. По условию задачи, преобразование применялось 2015 раз. Так как 2015 = 6*335 + 5, то для получения открытого текста необходимо применить функцию Encrypt к файлу encrypttext.txt один раз.
для получения открытого текста необходимо применить функцию Encrypt к файлу encrypttext.txt один раз