‘МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Лабораторна робота №2
з дисципліни «Захист інформації в комп’ютерних системах»
на тему: «Перестановочний шифр»
Львів – 2012
Мета роботи: ознайомитись з основами класичної техніки шифрування – шифрами моноалфавітної заміни та типовим прикладом шифрів даного виду - шифром Цезаря.
Теоретичні відомості
Розглянутий вище метод ґрунтувався на заміщенні символів відкритого тексту різними символами шифрованого тексту. Принципово інший клас перетворень будується на використанні перестановок букв відкритого тексту. Шифри, створені за допомогою перестановок, називають перестановочными шифрами.
Найпростіший з таких шифрів використає перетворення "драбинки", що полягає в тім, що відкритий текст записується уздовж похилих рядків певної довжини ("сходів"), а потім зчитується построчно по горизонталі. Наприклад, щоб шифрувати повідомлення "meet me after the toga party" по методу драбинки зі сходами довжиною 2, запишемо це повідомлення у вигляді
Шифроване повідомлення буде мати такий вигляд.
Такий "шифр" особливої складності для криптоаналізу не представляє. Більше складна схема припускає запис тексту повідомлення в горизонтальні рядки однакової довжини й наступне зчитування тексту стовпець за стовпцем, але не один по одному, а відповідно до деякої перестановки стовпців. Порядок зчитування стовпців при цьому стає ключем алгоритму. Розглянемо наступний приклад.
Ключ:
Відкритий текст:
Шифрований текст: TTNAAPTMTSUOAODWCOIXKNLYPETZ
Простий перестановочный шрифт дуже легко розпізнати, тому що букви в ньому зустрічаються з тією же частотою, що й у відкритому тексті. Наприклад, для тільки що розглянутого способу шифрування з перестановкою стовпців аналіз шифру виконати досить просто - необхідно записати шифрований текст у вигляді матриці й перебрати можливі варіанти перестановок для стовпців. Можна використати також таблиці значень частоти биграмм і триграмм.
Перестановочный шифр можна зробити істотно більше захищеним, виконавши шифрування з використанням перестановок кілька разів. Виявляється, що в цьому випадку застосовану для шифрування перестановку відтворити вже не так просто. Наприклад, якщо попереднє повідомлення шифрувати ще раз за допомогою того ж самого алгоритму, то результат буде наступним.
Ключ:
Відкритий текст:
Шифрований текст:
Щоб наочніше представити те, що ми одержимо в підсумку повторного застосування перестановки, зіставимо кожну букву вихідного відкритого тексту з номером відповідної їй позиції. Наше повідомлення складається з 28 букв, і вихідною послідовністю буде послідовність
Після першої перестановки одержимо послідовність, що усе ще зберігає деяку регулярність структури.
Після другої перестановки виходить наступна послідовність.
Регулярність цієї послідовності вже зовсім не проглядається, тому її криптоанализ буде вимагати значно більших зусиль.
Завдання:
Створити програму, що реалізує довільний перестановочний шифр. Підготувати і захистити звіт, в якому обов’язково навести алгоритм роботи даного перестановочного шифру.
Виконання роботи
Рис. 1. Вікно програми.
Для шифрування потрібно ввести повідомлення, ввести ключ, ввести кількість стовпців матриці перестановок, ввести кількість циклів перестановок і натиснути кнопку Шифрувати (рис. 2).
Рис. 2. Розшифрування повідомлення.
Текст програми
package ua.programming.labs;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class Lab2 extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lab2);
Button startButton = (Button) findViewById(R.id.btnCrypt);
startButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Encode();
}
});
}
public void Encode() {
try {
EditText etCol = (EditText)findViewById(R.id.etCol);
int Col = Integer.parseInt(etCol.getText().toString());
EditText etOpenText = (EditText)findViewById(R.id.etOpenText);
int Size = etOpenText.getText().toString().length();
int Row = (Size%Col == 0)?Size/Col:Size/Col+1;
char[][] OpenArray = new char [Row][Col];
char[][] CryptArray = new char [Row][Col];
char Space = ' ';
EditText etKey = (EditText)findViewById(R.id.etKey);
int KeySize = etKey.getText().toString().length();
if(KeySize!=Col)
{
Toast.makeText(this, "Помилка! Кількість стовпців і довжина ключа повинні бути рівні!", Toast.LENGTH_SHORT).show();
return;
}
int[] arrKey = new int[KeySize];
char[] Key = etKey.getText().toString().toCharArray();
for (int i = 0; i < Key.length; i++) {
arrKey[i] = Integer.parseInt(((Character)Key[i]).toString());
}
EditText etRepeat = (EditText)findViewById(R.id.etRepeat);
int Repeat = Integer.parseInt(etRepeat.getText().toString());
String cryptString = etOpenText.getText().toString();
for (int k = 0; k < Repeat; k++) {
for (int i = 0; i < Row; i++) {
for (int j = 0; j < Col; j++) {
if(i*Col+j<Size)
{
OpenArray[i][j] = cryptString.charAt(i*Col+j);
}
else {
OpenArray[i][j] = Space;
}
}
}
for (int i = 0; i < Row; i++) {
for (int j = 0; j < Col; j++) {
CryptArray[i][arrKey[j]-1] = OpenArray[i][j];
}
}
cryptString = "";
for (int j = 0; j < Col; j++) {
for (int i = 0; i < Row; i++) {
cryptString += ((Character)CryptArray[i][j]).toString();
}
}
}
EditText etCryptText = (EditText)findViewById(R.id.etCryptText);
etCryptText.setText(cryptString);
}
catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
Висновок: на цій лабораторній роботі я ознайомився з методом шифрування текстових даних – перестановочним шифром.