МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ЗВІТ
ДО ЛАБОРАТОРНОЇ РОБОТИ № 2
З КУРСУ “ Методи та засоби криптологічних перетворень”
АФІННІ ШИФРИ
Мета роботи: Написати программу для шифрування методом зсуву к – го порядку забезпечення введеня стрічки і ключа з клавіатури і виведення шифрованої і дешифрованої стрічки на екран
Функції і класи
Encrypt(string strToEncrypt, string key)– шифрує стррчку strToEncrypt, ключем key
Decrypt(string strToDecrypt, string key) – дешифрує стррчку strToDecrypt, ключем key
parseStringToBlocks(string lStringToParse, int lSize) – розбиває стрічку lStringToParse
на блоки розміру lSize
formValidate – здійснює валідацію форми – повертає true – якшо пройдена, інакше – false
AlphabetManager – абстрактний клас, менеджер який оперує алфавітами – повертає довжину алфавіту, числове представлення за символом і символ за числовим представленням
EnglishAlphabetManager – конкретна реалізація AlphabetManager, представляє латиницю
Alpha – класс який представляє символ, складається з символа і його числового відображення
RandomNumberGenerator – системний клас, що повертає випадковим чином згенеровану послідовність байтів.
Текст программи
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
#region Fields
AlphabetManager alManager = new EnglishAlphabetManager();
#endregion
#region Events
public Form1()
{
InitializeComponent();
}
private void btnEncrypt_Click(object sender, EventArgs e)
{
if (this.formValidate())
{
string result = Encrypt(this.tbxTextToCrypt.Text, this.tbxKey.Text);
this.tbxResultText.Text = result;
}
}
private void btnDecrypt_Click(object sender, EventArgs e)
{
if (this.formValidate())
{
string result = Decrypt(this.tbxTextToCrypt.Text, this.tbxKey.Text);
this.tbxResultText.Text = result;
}
}
private void btnClear_Click(object sender, EventArgs e)
{
tbxKey.Text = String.Empty;
tbxTextToCrypt.Text = String.Empty;
tbxResultText.Text = String.Empty;
}
private void Form1_Load(object sender, EventArgs e)
{
}
#endregion
#region Public Methods
private string Encrypt(string strToEncrypt, string key)
{
StringBuilder result = new StringBuilder();
AlphabetManager alManager = new EnglishAlphabetManager();
strToEncrypt = strToEncrypt.ToLower();
List<string> strBlocks = parseStringToBlocks(strToEncrypt, key.Length);
foreach (string block in strBlocks)
{
for (int i = 0; i < key.Length; i++)
{
int cryptNum = alManager.GetNumberByChar(block[i]) + alManager.GetNumberByChar(key[i]);
char encryptedChar = alManager.GetSymbolByNumber(cryptNum);
result.Append(encryptedChar);
}
}
return result.ToString();
}
private string Decrypt(string strToDecrypt, string key)
{
StringBuilder result = new StringBuilder();
AlphabetManager alManager = new EnglishAlphabetManager();
strToDecrypt = strToDecrypt.ToLower();
List<string> strBlocks = parseStringToBlocks(strToDecrypt, key.Length);
foreach (string block in strBlocks)
{
for (int i = 0; i < key.Length; i++)
{
int cryptNum = alManager.GetNumberByChar(block[i]) - alManager.GetNumberByChar(key[i]);
char decryptedChar = alManager.GetSymbolByNumber(cryptNum);
result.Append(decryptedChar);
}
}
return result.ToString();
}
#endregion
#region Private Methods
private List<string> parseStringToBlocks(string lStringToParse, int lSize)
{
List<string> result = null;
if (lStringToParse.Length > 0)
{
int elemetnNotInBlock = lStringToParse.Length % lSize;
if (elemetnNotInBlock > 0)
{
int elementToAdd = lSize - elemetnNotInBlock;
// Convert the binary input into Base64 UUEncoded output.
// Each 3 byte sequence in the source data becomes a 4 byte
// sequence in the character array.
int bytesLength = (int)(Math.Ceiling( (double)elementToAdd / 3 * 4));
byte[] randomBytes = new byte[bytesLength];
RandomNumberGenerator rndGen = RandomNumberGenerator.Create();
rndGen.GetBytes(randomBytes);
// Convert.ToBase64CharArray(randomBytes, 0, elementToAdd + 1, randCharArray, 0);
string strWithRandValues = Convert.ToBase64String(randomBytes);
char[] randCharArray = strWithRandValues.ToCharArray(0, elementToAdd);
StringBuilder randStringToAdd = new StringBuilder();
foreach (char ch in randCharArray)
{
randStringToAdd.Append(alManager.GetSymbolByNumber((int)ch));
}
lStringToParse = lStringToParse + randStringToAdd.ToString();
}
int blockLenght = lStringToParse.Length / lSize;
result = new List<string>(blockLenght);
for (int blCount = 0; blCount < blockLenght; blCount++)
{
result.Add(lStringToParse.Substring(blCount * lSize, lSize));
}
}
return result;
}
private bool formValidate()
{
bool isValid = true;
if (this.tbxKey.Text == String.Empty)
{
validationProvider.SetError(tbxKey, "You must enter Key");
isValid = false;
}
if (this.tbxTextToCrypt.Text == String.Empty)
{
validationProvider.SetError(tbxTextToCrypt, "You must enter text to Encrypt");
isValid = false;
}
if (isValid)
{
validationProvider.Clear();
}
return isValid;
}
#endregion
}
#region Dll Classes
public abstract class AlphabetManager
{
public abstract int LENGHT { get; }
public List<Alpha> AlphabetList { get; set; }
public AlphabetManager()
{
AlphabetList = new List<Alpha>(LENGHT);
initializeAlphabet();
}
public char GetSymbolByNumber(int num)
{
char result = AlphabetList[0].Symbol;
if (num > LENGHT)
{
num = num % LENGHT;
}
else
if (num < 0)
{
num = (num % LENGHT) + LENGHT;
}
foreach (Alpha alpha in AlphabetList)
{
if (alpha.Number == num)
{
result = alpha.Symbol;
break;
}
}
return result;
}
public int GetNumberByChar(char symbol)
{
int result = 0;
foreach (Alpha alpha in AlphabetList)
{
if (alpha.Symbol.Equals(symbol))
{
result = alpha.Number;
break;
}
}
return result;
}
protected abstract void initializeAlphabet();
}
public class EnglishAlphabetManager : AlphabetManager
{
public const int EnglAlphabetLenght = 26;
public override int LENGHT
{
get
{
return EnglAlphabetLenght;
}
}
protected override void initializeAlphabet()
{
AlphabetList.Add(new Alpha('a', 0));
AlphabetList.Add(new Alpha('b', 1));
AlphabetList.Add(new Alpha('c', 2));
AlphabetList.Add(new Alpha('d', 3));
AlphabetList.Add(new Alpha('e', 4));
AlphabetList.Add(new Alpha('f', 5));
AlphabetList.Add(new Alpha('g', 6));
AlphabetList.Add(new Alpha('h', 7));
AlphabetList.Add(new Alpha('i', 8));
AlphabetList.Add(new Alpha('j', 9));
AlphabetList.Add(new Alpha('k', 10));
AlphabetList.Add(new Alpha('l', 11));
AlphabetList.Add(new Alpha('m', 12));
AlphabetList.Add(new Alpha('n', 13));
AlphabetList.Add(new Alpha('o', 14));
AlphabetList.Add(new Alpha('p', 15));
AlphabetList.Add(new Alpha('q', 16));
AlphabetList.Add(new Alpha('r', 17));
AlphabetList.Add(new Alpha('s', 18));
AlphabetList.Add(new Alpha('t', 19));
AlphabetList.Add(new Alpha('u', 20));
AlphabetList.Add(new Alpha('v', 21));
AlphabetList.Add(new Alpha('w', 22));
AlphabetList.Add(new Alpha('x', 23));
AlphabetList.Add(new Alpha('y', 24));
AlphabetList.Add(new Alpha('z', 25));
}
}
public class Alpha
{
public char Symbol { get; set; }
public int Number { get; set; }
public Alpha(char symbol, int number)
{
this.Symbol = symbol;
this.Number = number;
}
}
#endregion
}
Результат роботи программи:
Висновок : в процессі роботи була створена программа яка шифрує стрічку методом зсуву к – го порядку, программа була реалізована за допомогою технологиї Microsoft .NET Framework, з використанням системних мождивостец для генерацію випадкових чисел.
Загалом не вважаю даний метод шифрування хоч трішечки надійним за умов сучасного розвитку обчислювальної техніки