МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
КАФЕДРА ЕЛЕКТРОННИХ ОБЧИСЛЮВАЛЬНИХ МАШИН
Лабораторна робота №5
з курсу “Захист інформації”
на тему: “Стовпцевий шифр”
Мета роботи: зашифрувати стовпцевим шифром довільне повідомлення.
Теоретичні відомості
Шифри перестановки
В перестановочному шифрі змінюється не відкритий текст, а порядок символів. В простому стовпцевому перестановочному шифрі відкритий текст пишеться горизонтально на розграфленому листку паперу фіксованої ширини, а шифротекст зчитується по вертикалі. Дешифрування являє собою запис шифротексту вертикально на листку розграфленого паперу фіксованої ширини і потім зчитування відкритого тексту горизонтально.
Криптоаналіз
Так як символи шифротексту ті ж, що і в відкритому тексті, частотний аналіз шифротексту покаже, що кожна буква зустрічається приблизно з такою ж частотою, що й зазвичай. Це дасть криптоаналітику можливість застосувати різні методи, визначаючи правильний порядок символів для отримання відкритого тексту.
Текст програми:
Програма, що шифрує повідомлення:
// Лабораторна робота №5 з Захисту інформації
// Виконала: ст.гр.КІ-47 Фірсова Юлія
// Програма виконує шифрування тексту, що знаходиться в файлі text.txt
// стовпцевим методом і виводить зашифрований текст в файл output.txt
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define max_rows 20 // максимальна кількість рядків в масиві
#define max_columns 20 // максимальна кількість стовпців в масиві
int main()
{
FILE * f_in; // вказівник на вхідний файл
FILE * f_out; // вказівник на файл з зашифрованим текстом
char ch; // символьна змінна для збереження зчитаних з вхідного файлу символів
int txt_length=0; // довжина тексту для шифрування ( початкове значення дор. 0)
int array_rows=0; // кількість зайнятих рядків в масиві
int array_columns=0; // кількість зайнятих стовпців в масиві
int tmp; // змінна для проміжних результатів обчислень
int i,j; // лічильники циклу
char buf[max_rows][max_rows]; // масив, з допомогою якого здійснюється шифрування тексту
// Відкриваємо вхідний та вихідний файли
if((f_in=fopen("text.txt","r")) == NULL)
{
printf("Unable to open input file text.txt\n");
exit(1);
}
if((f_out=fopen("output.txt","w")) == NULL)
{
printf("Unable to open output file output.txt\n");
exit(1);
}
// Визначаємо довжину тексту, який необхідно зашифрувати
fscanf(f_in,"%c",&ch);
while(!feof(f_in))
{
// Пробіли і символи переходу на новий рядок не враховуємо
if ( (ch != ' ') && (ch != '\n'))
txt_length++;
fscanf(f_in,"%c",&ch);
}
// Довжина тексту не перевищує максимальної?
if (txt_length > 400)
{
printf("Text to encode is too long. Please input the shorter text, and run this program again. Bye!");
exit(1);
}
// Знову відкриваємо вхідний файл для читання спочатку
fclose(f_in);
f_in=fopen("text.txt", "r");
// Визначення кількості рядків і стовпців масиву, які будуть зайняті текстом
array_rows = sqrt(txt_length);
array_columns = array_rows;
tmp = txt_length - array_rows*array_rows;
if ( tmp >= array_rows)
{
array_rows++;
array_columns++;
}
else if( tmp>0)
array_columns++;
// Початкове обнулення масиву
for (i=0; i<max_rows; i++)
{
for (j=0; j<max_columns; j++)
{
buf[i][j]=0;
}
}
// Запис даних з файлу в масив порядково
fscanf(f_in,"%c",&ch);
for (i=0; i<=array_rows-1; i++)
{
for (j=0; j<=array_columns-1; j++)
{
while ( (ch == ' ') || (ch == '\n'))// пробіли і символу переходу на новий
// рядок не враховуємо
{
if (!feof(f_in)) // читаємо з файлу символи доки не
// зустрінемо букву або цифру
fscanf(f_in,"%c",&ch); // записуємо його в змінну ch
}
if (!feof(f_in))
{ // записуємо вміст ch в відповідну комірку масиву
buf[i][j]=ch;
fscanf(f_in,"%c",&ch);
}
}
}
// Вивід масиву по стовпцях в вихідний файл
for (i=0; i<=array_rows-1; i++)
{
for (j=0; j<=array_columns-1; j++)
{
fprintf(f_out,"%c",buf[j][i]);
}
fprintf(f_out," ");
}
printf("Finished. See encripted text in output.txt\n");
fclose(f_in);// закриваємо усі відкриті файли
fclose(f_out);
return 0;
}
Програма, що дешифрує повідомлення, зашифроване стовпцевим методом:
// Лабораторна робота №5 з Захисту інформації
// Виконала: ст.гр.КІ-47 Фірсова Юлія
// Програма виконує дешифрування тексту, що знаходиться в файлі output.txt
// і зашифрований стовпцевим методом і виводить розшифрований текст в файл decripted.txt
// (розшифрований текст записується без пробілів)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define max_rows 20 // максимальна кількість рядків в масиві
#define max_columns 20 // максимальна кількість стовпців в масиві
int main()
{
FILE * f_in; // вказівник на вхідний файл
FILE * f_out; // вказівник на файл з зашифрованим текстом
char ch; // символьна змінна для збереження зчитаних з вхідного файлу символів
int i,j; // лічильники циклу
char buf[max_rows][max_rows]; // масив, з допомогою якого здійснюється шифрування тексту
// Відкриваємо вхідний та вихідний файли
if((f_in=fopen("output.txt","r")) == NULL)
{
printf("Unable to open input file text.txt\n");
exit(1);
}
if((f_out=fopen("decripted.txt","w")) == NULL)
{
printf("Unable to open output file output.txt\n");
exit(1);
}
// Початкове обнулення масиву
for (i=0; i<max_rows; i++)
{
for (j=0; j<max_columns; j++)
{
buf[i][j]=0;
}
}
// Запис даних з файлу в масив по стовпчикам
fscanf(f_in,"%c",&ch);
for (i=0; i<max_rows; i++)
{
for (j=0; j<max_columns; j++)
{
if ((ch != ' ') && (ch != '\n') && (ch != 0))
{
if (!feof(f_in))
{ // записуємо вміст ch в відповідну комірку масиву
buf[j][i]=ch;
fscanf(f_in,"%c",&ch);
}
}
else
{
fscanf(f_in,"%c",&ch);
break;
}
}
}
// Вивід масиву по рядках в вихідний файл
for (i=0; i<max_rows; i++)
{
for (j=0; j<max_columns; j++)
{
if(buf[i][j] != 0)
fprintf(f_out,"%c",buf[i][j]);
}
}
printf("Finished. See decripted text in decripted.txt\n");
fclose(f_in);// закриваємо усі відкриті файли
fclose(f_out);
return 0;
}
Результати роботи програми
Текст, що необхідно зашифрувати:
One small step for a man is just one giant leap for a mankind
Проміжне представлення тексту:
onesmal
lstepfo
ramanis
justone
giantle
apforam
ankind
Зашифрований текст:
Olrjgaa nsauipn etmsafk seatnoi mpnotrn afinlad loseem
Висновки: під час виконання лабораторної роботи №5 було проведено розробку програми для шифрування повідомлень стовпцевим методом, а також програми, яка розшифровує повідомлення, зашифроване цим методом.