using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CryptanalysisCore;
using ExtensionMethods;
using System.IO;
using System.Threading;
namespace CryptanalysisGUI
{
public partial class Window : Form
{
public Window()
{
InitializeComponent();
}
private void AltGUI_Load(object sender, EventArgs e)
{
crackTabMenuItems = new ToolStripMenuItem[] { crackTextMenuItem, stopMenuItem };
encryptTabMenuItems = new ToolStripMenuItem[] { encryptMenuItem, decryptMenuItem, randomKeyMenuItem };
SwitchMenuItems();
CrackButtonEnabled = false;
StopButtonEnabled = false;
InitializeCiphers();
SetCrackSettingsVisibility();
SetComboBoxes();
Status = "Načítám slovníky...";
statusLock = true;
string actionName = "loading dict files";
var thread = Parallel.InBackground(() =>
{
SetProgressBar(Enum.GetNames(typeof(Storage.Languages)).Length);
CallWithInvoke(() => progressBar.AccessibleName = actionName);
try
{
Storage.LoadFiles(() => CallWithInvoke(() =>
{
if (progressBar.AccessibleName == actionName)
progressBar.Value += 1;
}));
}
catch (Exception)
{
ShowWarningIfDirectiesNotFound();
}
CallWithInvoke(() =>
{
CrackButtonEnabled = true;
statusLock = false;
progressBar.AccessibleName = "";
Status = "Načtení slovníků bylo úspěšné";
ResetProgressBar();
});
});
AddThread(thread);
}
///
/// Nastaví všechny combo boxy
///
private void SetComboBoxes()
{
SetComboBoxes(crackCiphers, Storage.CiphersNames);
SetComboBoxes(languages, Storage.LanguagesNames);
SetComboBoxes(ciphersEncrypt, Storage.CiphersNames);
SetComboBoxes(attackTypeCombo, Storage.CrackAlgorithms[Storage.Ciphers.caesar]);
}
///
/// Nastaví combo boxu klasický styl a předané položky
///
/// Combo box
/// Seznam položek, které se mají objevit v Combo boxu
private void SetComboBoxes(ComboBox comboBox, string[] items)
{
comboBox.Items.Clear();
comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
comboBox.Items.AddRange(items);
comboBox.SelectedIndex = 0;
}
private void InitializeCiphers()
{
ciphers = new Dictionary();
ciphers[Storage.Ciphers.caesar] = new Caesar();
ciphers[Storage.Ciphers.monoalphabetic] = new Monoalphabetic();
ciphers[Storage.Ciphers.trans] = new Transposition();
ciphers[Storage.Ciphers.vigenere] = new Vigenere();
}
private void crackButton_Click(object sender, EventArgs e)
{
StartCryptanalyse();
}
private void autoChooseCipher_CheckedChanged(object sender, EventArgs e)
{
SetCrackSettingsVisibility();
}
private void keyTextBox_Enter(object sender, EventArgs e)
{
SetKeyHelp();
statusLock = true;
}
private void SetKeyHelp()
{
Status = Storage.keyHelp[CurrentCipherType];
}
private void ciphersEncrypt_SelectedIndexChanged(object sender, EventArgs e)
{
ToggleSpaceButton();
SetKeyHelp();
if (Key.Length > 0)
{
TestKeyValid();
SetEncryptButtonEnabled();
}
}
private void randomKey_Click(object sender, EventArgs e)
{
SetRandomKey();
}
private void ProcessText(Func function)
{
ProgressBlick();
var thread = Parallel.InBackground(() =>
{
CallWithInvoke(() =>
{
try
{
EncryptRunning = true;
SetEncryptButtonEnabled();
string result = function(InputText, Key);
ShuffleTextbox(result);
}
catch (CryptanalysisCore.Exceptions.InvalidCipherKey ex)
{
CallWithInvoke(() => MessageBox.Show(ex.Message, "Šifrový klíč není validní", MessageBoxButtons.OK, MessageBoxIcon.Warning));
EncryptRunning = false;
SetEncryptButtonEnabled();
}
catch (Exception)
{
ShowErrorBox();
EncryptRunning = false;
SetEncryptButtonEnabled();
}
});
});
AddThread(thread);
}
private void encryptButton_Click(object sender, EventArgs e)
{
ProcessText(CurrentCipher.Encrypt);
}
private void keyTextBox_TextChanged(object sender, EventArgs e)
{
TestKeyValid();
SetEncryptButtonEnabled();
}
private void decryptButton_Click(object sender, EventArgs e)
{
ProcessText(CurrentCipher.Decrypt);
}
private void copyToClipboardButton_Click(object sender, EventArgs e)
{
Clipboard.SetText(OutputText);
}
private void saveTextToFile_Click(object sender, EventArgs e)
{
saveTextToFile(OutputText);
}
private void outputTextBox_MouseHover(object sender, EventArgs e)
{
Status = "Text po zašifrování či dešifrování";
}
private void outputTextBox_MouseLeave(object sender, EventArgs e)
{
ResetStatus();
}
private void AltGUI_FormClosing(object sender, FormClosingEventArgs e)
{
ResetTimer(progressBarTimer);
ResetTimer(shuffleTimer);
DeleteThreads();
DeleteTimers();
}
private void crackCiphers_SelectedIndexChanged(object sender, EventArgs e)
{
attackTypeCombo.Items.Clear();
attackTypeCombo.Items.AddRange(Storage.CrackAlgorithms[CurrentCrackCipherType]);
attackTypeCombo.SelectedIndex = 0;
}
private void encryptTextBox_TextChanged(object sender, EventArgs e)
{
textLengthBox.Text = String.Format("Počet znaků: {0}", encryptTextBox.Text.Length);
}
private void kopírovatVšeToolStripMenuItem_Click(object sender, EventArgs e)
{
string text = IsCryptAnalyseTabActive ? CrackText : OutputText;
if(text != string.Empty)
Clipboard.SetText(text);
}
private void kopírovatVšeToolStripMenuItem1_Click(object sender, EventArgs e)
{
string text = IsCryptAnalyseTabActive ? encryptTextBox.Text : inputTextbox.Text;
if(text != string.Empty)
Clipboard.SetText(text);
}
private void smazatVšeAVložitToolStripMenuItem_Click(object sender, EventArgs e)
{
if (IsCryptAnalyseTabActive)
Ciphertext = Clipboard.GetText();
else
InputText = Clipboard.GetText();
}
private void smazatVšeToolStripMenuItem_Click(object sender, EventArgs e)
{
string defaultValue = string.Empty;
if (IsCryptAnalyseTabActive)
Ciphertext = defaultValue;
else
InputText = defaultValue;
}
private void vložitToolStripMenuItem_Click(object sender, EventArgs e)
{
string value = Clipboard.GetText();
if (IsCryptAnalyseTabActive)
Ciphertext += value;
else
InputText += value;
}
private void inputTextBox_TextChanged(object sender, EventArgs e)
{
textLengthEncryptTextBox.Text = string.Format("Počet znaků: {0}", inputTextbox.Text.Length);
}
private void stopButton_Click(object sender, EventArgs e)
{
StopCryptanalyse();
}
private void ukončitAplikaciToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
private void tabControl_selectedIndexChanged(object sender, EventArgs e)
{
SwitchMenuItems();
SetEncryptButtonEnabled();
}
private void stopMenuItem_Click(object sender, EventArgs e)
{
StopCryptanalyse();
}
private void crackTextMenuItem_Click(object sender, EventArgs e)
{
StartCryptanalyse();
}
private void encryptMenuItem_Click(object sender, EventArgs e)
{
ProcessText(CurrentCipher.Encrypt);
}
private void decryptMenuItem_Click(object sender, EventArgs e)
{
ProcessText(CurrentCipher.Decrypt);
}
private void randomKeyMenuItem_Click(object sender, EventArgs e)
{
SetRandomKey();
}
private void oAplikaciToolStripMenuItem_Click(object sender, EventArgs e)
{
ShowAboutDialog();
}
private void jakPoužívatAplikaciToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
string helpPath = Storage.StatsFolderPath + "../Help/napoveda.chm";
if (File.Exists(helpPath))
{
Help.ShowHelp(inputTextbox, helpPath, HelpNavigator.TableOfContents);
}
else
{
MessageBox.Show("Soubor s nápovědou nebyl nalezen nebo je poškozen.", "Ale toto je nepříjemné", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
catch (Exception)
{
MessageBox.Show("Soubor s nápovědou nebyl nalezen nebo je poškozen.", "Ale toto je nepříjemné", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void selectAll_KeyPress(object sender, KeyPressEventArgs e)
{
if ((System.Windows.Forms.Control.ModifierKeys == Keys.Control) && (e.KeyChar == (char)1))
{
((TextBox)sender).SelectAll();
}
}
private void TextBox_MouseDown(object sender, MouseEventArgs e)
{
/*TextBox txt = (TextBox)sender;
txt.DoDragDrop(txt.SelectedText, DragDropEffects.Copy);*/
}
private void TextBox_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.Text))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
private void TextBox_DragDrop(object sender, DragEventArgs e)
{
TextBox txt = (TextBox)sender;
txt.Text = (string)e.Data.GetData(DataFormats.Text);
}
}
}