using System; using System.Collections.Generic; using System.Linq; using System.Text; using ExtensionMethods; namespace CryptanalysisCore { public delegate List CrackMethod(string ciphertext, Storage.Languages language); abstract public class Cipher { protected string ExceptionText; /// /// Vytvoříme novou šifru /// /// Jazyk, nad kterým bude šifra pracovat public Cipher() { SetCrackMethods(); } protected abstract bool IsKeyValid(string key); /// /// Zašifruje zadaný text podle předaného klíče. /// /// Text, který bude šifrován /// Šifrový klíč /// Zašifrovaný text public virtual string Encrypt(string opentext, string key) { if (!IsKeyValid(key)) throw new Exceptions.InvalidCipherKey(ExceptionText); if (!TextAnalysis.IsOpentextValid(opentext)) throw new Exceptions.InvalidOpentext(); return opentext; } /// /// Dešifruje zadaný text /// /// Zašifrovaný text /// Šifrovací klíč /// Otevřený text public virtual string Decrypt(string ciphertext, string key) { if (!IsKeyValid(key)) throw new Exceptions.InvalidCipherKey(ExceptionText); return ciphertext; } /// /// Provede útok na zašifrovaný text s pouhou znalostí jednoho zašifrovaného textu /// /// Zašifrovaný text /// Dešifrovaný text //protected abstract CipherPacket CiphertextAttack(CipherPacket packet); /// /// Provede útok na zašifrovaný text se znalostí jak zašifrovaného, /// tak otevřeného textu. /// /// Zašifrovaný text /// Dešifrovaný text //protected abstract List KnownPlaintext(string opentext, string ciphertext); /// /// Vrátí náhodný klíč k dané šifře /// TODO: Kontrola toho, aby klíč nebyl slabý /// /// Náhodný šifrovací klíč public abstract string RandomKey(); /// /// Seznam method určených k prolamování šifer /// protected CrackMethod[] CrackMethods; /// /// Nastaví metody pro cracknutí /// protected abstract void SetCrackMethods(); /// /// Násilné dešifrování zašifrovaného textu bez znalosti klíče. /// /// Text, který se pokoušíme dešifrovat /// Otevřený text public List Crack(string ciphertext, int attackType, Storage.Languages language) { return CrackMethods[attackType](ciphertext, language); } public override string ToString() { return "šifra"; } } }