Kriptozaštita 3 - Гај Јулије

Програм за шифровање и дешифровање текста, методом коју је према причи користио најпознатији император из Рима, Гај Јулије ( 100 - 44 п.н.е ), приликом слања писаних порука својим генералима (^). На дну странице се налазе линкови за преузимање бесплатне извршне верзије програма или комплетног пројекта. За исправан рад програма неопходан је .Net framework 4.0 ( ^ ) !

/************************************************************************************************

* Назив програма : Криптозаштита - Гај Јулије *

* Верзија програма : 1.0 *

* Креиран помоћу : SharpDevelop *

* Аутор програма : Перић Жељко *

* Програмски језик : C# *

* Датум : 15.04.2014 *

* Време : 09:09 *

* *

* Опис програма : Програм за шифровање и дешифровање текста, методом коју је према причи *

* користио најпознатији император из Рима, Гај Јулије( 100 - 44 п.н.е ), *

* приликом слања писаних порука својим генералима (^). *

* *

* За шифровање текста поруке се користе слова Азбуке којима је порука *

* написана и њихов оригинални распоред. Шифровање се врши тако што се *

* за свако слово у оригиналном тексту поруке пронађе његова оригинална *

* позиција у оквиру Азбуке која се затим помери за одређени број места *

* и слово се замени словом Азбуке које се налази на новој позицији. *

* Број места за који ће бити извршено померање се назива Кључ за шифровање. *

* Померање позиција слова може бити у десно када се број позиције увећава, *

* или у лево када се број позиције умањује за вредност Кључа. Собзиром да је *

* број слова у Азбуци ограничен, и број вредности које може да има Кључ *

* је ограничен. Опсег вредности је од један до броја слова у Азбуци умањеног *

* за један. За дешифровање поруке је неопходно знати текст шифроване поруке, *

* слова оригиналне Азбуке којима је написана порука и њихов распоред, *

* смер померања позиције слова у оквиру Азбуке и вредност кључа. *

* *

* Пример померања слова у Азбуци када је вредност кључа девет и смер десно: *

* *

* А Б В Г Д Ђ Е Ж З И Ј К Л Љ М Н Њ О П Р С Т Ћ У Ф Х Ц Ч Џ Ш *

* | | | | | | | | | *

* И Ј К Л Љ М Н Њ О П Р С Т Ћ У Ф Х Ц Ч Џ Ш А Б В Г Д Ђ Е Ж З *

* *

* У овом случају позната мисао коју је према причи император изговорио *

* на реци Рубикон "Коцка је бачена" шифровано гласи "Сцђси рн јиефи". *

* *

* Овакав начин шифровања спада у такозвану симетричну методу шифровања *

* када се за шифровање и дешифровање користи иста вредност Кључа. Иако *

* је начин шифровања текстуалне поруке овом методом врло једноставан и *

* шифрована порука се лако дешифрује и без познавања неопходних елемената *

* за дешифровање, постоје варијанте за које се тврди да су непобедиве *

* криптографске методе заштите текстуалних порука. *

* Погледајте на Интернету текстове о Вижнеровој шифри (^). *

* *

* Овај програм користи основни, претходно наведени начин за шифровање. *

* Програм шифрује о дешифрује само унапред дефинисана слова Азбуке, док *

* остале карактере који јој не припадају не препознаје већ их преписује. *

* *

* Омогућено је и директно превлачење текстуалног документа у поље за текст *

* поруке, када програм сам отвара документ и чита текст, а затим га шифрује *

* или дешифрује што зависи од одабраних опција. *

* *

* Десним кликом на поље за унос текста поруке или поље шифрованог текста *

* поруке, се отвара мени за избор учитавања или снимања текста поруке. *

* Програм може да отвори само три типа текстуалних докумената *.txt,*.rtf *

* и *.doc, који морају да буду снимљени као УНИКОД текстуални документи. *

* *

* Постоје многе варијације оваквог начина шифровања, *

* као и адекватних програма, погледајте на Интернету. *

* http://en.wikipedia.org/wiki/Cryptography *

* http://sh.wikipedia.org/wiki/Kriptografija *

* Покушајте сами да осмислите сопствену верзију. *

* *

* Све најбоље, *

* Аутор. *

************************************************************************************************/

using System;

using System.IO;

using System.Text;

using System.Windows.Forms;


namespace Криптозаштита__Гај_Јулије

{

public partial class MainForm : Form

{

// Глобалне променљиве

//

// Променљива 'Азбука' садржи слова Азбуке у свом основном распореду

// које програм препознаје и може да шифрује

//

string Азбука = "АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШ";

//

// Променљива 'Смер' садржи вредност за смер померања слова Азбуке

// приликом шифровања и дешифровања

//

string Смер = "Десно";

//

// Променљива 'Текст' садржи текст поруке

// који ће бити шифрован или дешифрован

//

string Текст_Поруке = "Унесите текст поруке";

//

// Променљива 'Кључ' садржи целобројну вредност за коју ће се

// вршити померање и замена слова у Азбуци

//

int Кључ = 1;

//

// Променљива 'Шифруј' садржи вредност која одређује

// да ли ће текст поруке да се шифрује или дешифрује

//

bool Шифруј = true;

//

//

//

//

public MainForm()

{

InitializeComponent();

Помери_и_Прикажи_Распоред_Слова_У_Азбуци();

}

// Помери слова у Азбуци на основу вредности кључа за шифровање

// и смера померања и прикажи нови распоред у текстуалном пољу

void Помери_и_Прикажи_Распоред_Слова_У_Азбуци()

{

// Локалне променљиве

int Бројач = 0;

int Позиција_Слова = 0;

int Број_Слова_У_Азбуци = 0;

Кључ = (int) ВредностКључаПоље.Value;

if(Смер == "Лево")

{

Кључ *= - 1;

}

НовиРаспоредСлова.Text = string.Empty;

Број_Слова_У_Азбуци = Азбука.Length;

for(Бројач=0;Бројач<Број_Слова_У_Азбуци;Бројач++)

{

Позиција_Слова = Бројач + Кључ;

if(Позиција_Слова > Број_Слова_У_Азбуци-1)

{

Позиција_Слова -= Број_Слова_У_Азбуци;

}

if(Позиција_Слова < 0)

{

Позиција_Слова += Број_Слова_У_Азбуци;

}

НовиРаспоредСлова.Text += Азбука[Позиција_Слова] + " ";

}

}

// Шифровање - Дешифровање текста поруке

void Шифруј_Дешифруј_Текст_Поруке()

{

// Локалне променљиве

string Слово = "";

string Величина_Слова = "";

int Бројач = 0;

int Позиција_Слова = 0;

int Број_Слова_У_Азбуци = 0;

int Број_Слова_У_Поруци = 0;

Кључ = (int) ВредностКључаПоље.Value;

if(Шифруј)

{

if(Смер == "Лево")

{

Кључ *= - 1;

}

}

else

{

if(Смер == "Десно")

{

Кључ *= - 1;

}

}

Број_Слова_У_Азбуци = Азбука.Length;

Текст_Поруке = ТекстПорукеПоље.Text;

Број_Слова_У_Поруци = Текст_Поруке.Length;

ШифрованаДешифрованаПорукаПоље.Text = "";

for(Бројач=0;Бројач<Број_Слова_У_Поруци;Бројач++)

{

Слово = Текст_Поруке.Substring(Бројач,1);

if(char.IsUpper(Слово[0]))

Величина_Слова = "Велико слово";

else

Величина_Слова = "Мало слово";

Слово = Слово.ToUpper();

Позиција_Слова = Одреди_Позицију_Слова_У_Азбуци(Слово);

if(Позиција_Слова != -1)

{

Позиција_Слова += Кључ;

if(Позиција_Слова > Број_Слова_У_Азбуци-1)

{

Позиција_Слова -= Број_Слова_У_Азбуци;

}

if(Позиција_Слова < 0)

{

Позиција_Слова += Број_Слова_У_Азбуци;

}

Слово = Азбука.Substring(Позиција_Слова,1);

if(Величина_Слова == "Велико слово")

Слово = Слово.ToUpper();

else

Слово = Слово.ToLower();

ШифрованаДешифрованаПорукаПоље.Text += Слово;

}

else

{

if(Величина_Слова == "Велико слово")

Слово = Слово.ToUpper();

else

Слово = Слово.ToLower();

ШифрованаДешифрованаПорукаПоље.Text += Слово;

}

}

}

// Одреди вредност индекса позиције слова у оквиру Азбуке

int Одреди_Позицију_Слова_У_Азбуци(string Слово)

{

// Локалне променљиве

int Индекс_Слова = -1;

int Бројач = 0;

int Број_Слова_У_Азбуци = 0;

Број_Слова_У_Азбуци = Азбука.Length;

for(Бројач=0;Бројач<Број_Слова_У_Азбуци;Бројач++)

{

if(Азбука.Substring(Бројач,1) == Слово)

{

Индекс_Слова = Бројач;

break;

}

}

return Индекс_Слова;

}

// Изабрана ротација Азбуке у лево

void ПомериЛевоИзборCheckedChanged(object sender, EventArgs e)

{

if(ПомериЛевоИзбор.Checked)

{

Смер = "Лево";

Помери_и_Прикажи_Распоред_Слова_У_Азбуци();

Шифруј_Дешифруј_Текст_Поруке();

}

}

// Изабрана ротација Азбуке у десно

void ПомериДесноИзборCheckedChanged(object sender, EventArgs e)

{

if(ПомериДесноИзбор.Checked)

{

Смер = "Десно";

Помери_и_Прикажи_Распоред_Слова_У_Азбуци();

Шифруј_Дешифруј_Текст_Поруке();

}

}

// Промењена вредност кључа за шифровање

void ВредностКључаПољеValueChanged(object sender, EventArgs e)

{

Помери_и_Прикажи_Распоред_Слова_У_Азбуци();

Шифруј_Дешифруј_Текст_Поруке();

}

// Завршен унос отвореног текста поруке

void ТекстПорукеПољеKeyDown(object sender, KeyEventArgs e)

{

if(e.KeyData == Keys.Enter)

{

Шифруј_Дешифруј_Текст_Поруке();

}

}

// Завршен унос отвореног текста поруке

void ТекстПорукеПољеLeave(object sender, EventArgs e)

{

Шифруј_Дешифруј_Текст_Поруке();

}

// Изабрана опција шифровање

void ШифрујТекстИзборCheckedChanged(object sender, EventArgs e)

{

if(ШифрујТекстИзбор.Checked)

{

ШифрованаПорукаОпис.Text = " Шифрована порука ";

Шифруј = true;

Шифруј_Дешифруј_Текст_Поруке();

}

}

// Изабрана опција дешифровање

void ДешифрујТекстИзборCheckedChanged(object sender, EventArgs e)

{

if(ДешифрујТекстИзбор.Checked)

{

ШифрованаПорукаОпис.Text = " Дешифрована порука ";

Шифруј = false;


Шифруј_Дешифруј_Текст_Поруке();

}

}

//

// Омогућава операцију директног превлачења и спуштања текстуалних фајлова

// или само текста из неког другог документа у поље за текст поруке,

// програм препознаје само три типа докумената *.txt, *.rtf и *.doc,

// који морају да буду снимљени као УНИКОД текстуални документи !!!

void ТекстПорукеПољеDragDrop(object sender, System.Windows.Forms.DragEventArgs e)

{

if (e.Data.GetDataPresent(DataFormats.FileDrop))

{

// Уколико је корисник селектовао више докумената одједном

// сви називи и путање докумената биће смештене у табели Документи

string [] Документи = (string[]) (e.Data.GetData(DataFormats.FileDrop));

// Отвори сваки текстуални документ и учитај текст у поље поруке

foreach(string Путања_Документа in Документи)

{

if(Путања_Документа.EndsWith(".txt") ||

Путања_Документа.EndsWith(".doc") ||

Путања_Документа.EndsWith(".rtf"))

ТекстПорукеПоље.Text += "\n" + File.ReadAllText(Путања_Документа);

}

Шифруј_Дешифруј_Текст_Поруке();

}

else if (e.Data.GetDataPresent(DataFormats.Text))

{

// Копира превучени текст од почетка новог реда у пољу за текст

ТекстПорукеПоље.AppendText("\n" +(string) (e.Data.GetData(DataFormats.Text)));

Шифруј_Дешифруј_Текст_Поруке();

}

e.Effect = DragDropEffects.None;

}

// Приказује опције менија

void ТекстПорукеПољеMouseDown(object sender, MouseEventArgs e)

{

if(e.Button == MouseButtons.Right)

{

МениУчитај.Text = " Учитај текст поруке";

МениСними.Text = " Сними текст поруке";

Мени.Show(MousePosition);

}

}

// Приказује опције менија

void ШифрованаДешифрованаПорукаПољеMouseDown(object sender, MouseEventArgs e)

{

if(e.Button == MouseButtons.Right)

{

МениУчитај.Text = " Учитај шифрован текст поруке";

МениСними.Text = " Сними шифрован текст поруке";

Мени.Show(MousePosition);

}

}

void МениУчитајClick(object sender, EventArgs e)

{

if(МениУчитај.Text == " Учитај текст поруке")

{

// Учитава шифровани текст поруке у текстуални документ

Учитај.Title = " Учитавање текста поруке";

}

else

{

// Учитава текст поруке у текстуални документ

Учитај.Title = " Учитавање шифрованог текста поруке";

}

DialogResult Избор;

Избор = Учитај.ShowDialog();

if(Избор == DialogResult.OK)

{

StreamReader Читај = new StreamReader(Учитај.FileName,Encoding.Unicode);

ТекстПорукеПоље.Text += "\n" + Читај.ReadToEnd();

Читај.Close();

Читај.Dispose();

}

Шифруј_Дешифруј_Текст_Поруке();

}

void МениСнимиClick(object sender, EventArgs e)

{

if(МениСними.Text == " Сними текст поруке")

{

// Снима текст поруке у текстуални документ

Сними.Title = " Снимање текста поруке";

Текст_Поруке = ТекстПорукеПоље.Text;

}

else

{

// Снима шифровани текст поруке у текстуални документ

Сними.Title = " Снимање шифрованог текста поруке";

Текст_Поруке = ШифрованаДешифрованаПорукаПоље.Text;

}

DialogResult Избор;

Избор = Сними.ShowDialog();

if(Избор == DialogResult.OK)

{

StreamWriter Пиши = new StreamWriter(Сними.FileName,false,Encoding.Unicode);

Пиши.WriteLine(Текст_Поруке);

Пиши.Close();

Пиши.Dispose();

}

}

}

}

/************************************************************************

* Program Licence : *

* *

* Copyright 2014 , Perić Željko *

* (periczeljkosmederevo@yahoo.com) *

* *

* According to it's main purpose , this program is licensed *

* under the therms of 'Free Software' licence agreement. *

* *

* If You do not know what those therms applies to *

* please read explanation at the following link : *

* (http://www.gnu.org/philosophy/free-sw.html.en) *

* *

* Since it is Free Software this program has no warranty of any kind. *

************************************************************************

* Ethical Notice : *

* *

* It is not ethical to change program code signed by it's author *

* and then to redistribute it under the same author name , *

* especially if it is incorrect. *

* *

* It is recommended that if You make improvement in program code , *

* to make remarks of it and then to sign it with Your own name , *

* for further redistribution as new major version of program. *

* *

* Author name and references of old program code version should be *

* kept , for tracking history of program development. *

* *

* For any further information please contact code author at his email. *

************************************************************************/


/************************************

* List Of Revisions *

************************************

* *

* *

* *

************************************/