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 *
************************************
* *
* *
* *
************************************/