Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки
Національний університет „Львівська політехніка”
Кафедра ЕОМ
/
Лабораторна робота №3
з дисципліни:
“Проектування засобів захисту інформації в комп'ютерних системах та мережах”
на тему:
“Алгоритм симетричного блокового шифрування CAST128”
Львів 2017
Мета: реалізувати програму симетричного блокового шифрування повідомлення за алгоритмом CAST128.
Теоретичні відомості
Характерною особливістю блокових криптоалгоритмов є той факт, що в ході своєї роботи вони проводять перетворення блоку вхідної інформації фіксованої довжини і одержують результуючий блок того ж об'єму, але недоступний для прочитання стороннім особам, що не володіють ключем. Таким чином, схему роботи блокового шифру можна описати функціями Z=EnCrypt(X,Key) і X=DeCrypt(Z,Key)
Ключ Key є параметром блокового криптоалгоритма і є деяким блоком двійкової інформації фіксованого розміру. Початковий (X) і зашифрований (Z) блоки даних також мають фіксовану розрядність, рівну між собою, але необов'язково 15 рівну довжині ключа.
Блокові шифри є основою, на якій реалізовані практично всі криптосистеми. Методика створення ланцюжків із зашифрованих блоковими алгоритмами байт дозволяє шифрувати ними пакети інформації необмеженої довжини. Така властивість блокових шифрів, як швидкість роботи, використовується асиметричними криптоалгоритмами, повільними за своєю природою. Відсутність статистичної кореляції між бітами вихідного потоку блокового шифру використовується для обчислення контрольних сум пакетів даних і в хешуванні паролів.
Завдання
В ході роботи необхідно засвоїти основні принципи побудови алгоритмів симетричного блокового шифрування, розробити програму шифрування/дешифрування згідно алгоритму CAST-128.
Текст програми
package com.cast128;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import org.apache.commons.codec.binary.Hex;public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Cast128Driver driver; private Button encrypt; private Button clear; private Button decrypt; private EditText messageToEncryptView; private EditText keyView; private TextView encryptedMessageView; private TextView decryptedMessageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initUI(); encrypt.setOnClickListener(this); clear.setOnClickListener(this); decrypt.setOnClickListener(this); } private void initUI() { encrypt = findViewById(R.id.encrypt); clear = findViewById(R.id.clear); decrypt = findViewById(R.id.decrypt); messageToEncryptView = findViewById(R.id.editMessage); keyView = findViewById(R.id.editKey); encryptedMessageView = findViewById(R.id.encryptedMessage); decryptedMessageView = findViewById(R.id.decryptedMessage); } @Override public void onClick(View view) { byte[] cipherText; switch (view.getId()) { case R.id.encrypt: driver = new Cast128Driver(); String message = messageToEncryptView.getText().toString(); String key = keyView.getText().toString(); if (message.isEmpty() || key.isEmpty()) { Toast.makeText(MainActivity.this, R.string.emptyWarning, Toast.LENGTH_LONG).show(); } else { driver.setKey(key.getBytes()); cipherText = driver.encrypt(message); String encryptedMessage = new String(Hex.encodeHex(cipherText)); encryptedMessageView.setText(encryptedMessage); decrypt.setVisibility(View.VISIBLE); } break; case R.id.clear: messageToEncryptView.getText().clear(); keyView.getText().clear(); encryptedMessageView.setText(null); decryptedMessageView.setVisibility(View.GONE); decrypt.setVisibility(View.GONE); break; case R.id.decrypt: String msg = driver.decrypt(); decryptedMessageView.setVisibility(View.VISIBLE); decryptedMessageView.setText(msg); break; } }}
package com.cast128;import org.bouncycastle.crypto.engines.CAST5Engine;/** * Created by Pavlo-Anton on 11-Nov-17. */public class Cast128Driver extends CAST5Engine { private int blocksCount; private byte[] cipherText; @Override protected void setKey(byte[] key) { super.setKey(key); } public byte[] encrypt(String inputString) { blocksCount = inputString.length() / 8; if (inputString.length() % 8 != 0) { blocksCount++; int symbolsToAppend = 8 - inputString.length() % 8; StringBuilder stringBuilder = new StringBuilder(inputString); for (int i = 0; i < symbolsToAppend; i++) { stringBuilder.append(" "); } inputString = stringBuilder.toString(); } byte[] input = inputString.getBytes(); cipherText = new byte[inputString.length()]; int index = 0; for (int i = 0; i < blocksCount; i++) { encryptBlock(input, index, cipherText, index); index += 8; } return cipherText; } public String decrypt() { byte[] msgText = new byte[cipherText.length]; int index = 0; for (int i = 0; i < blocksCount; i++) { decryptBlock(cipherText, index, msgText, index); index += 8; } return new String(msgText).trim(); }}
Діаграма класів
/
Рис. 1. Діаграма класів
Результат виконання програми
/
Рис. 2. Результат виконання програми
Висновок: На даній лабораторній роботі реалізовано програму симетричного блокового шифрування повідомлення за алгоритмом CAST128.
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!