def test_decrypt(self): cipher = Vigenere() cipher_text = "eylzkbzvpgwfafroeujhkgvlctwjlfvwtdzacvchkedhncxupmeajucdcgmscs" open_text = cipher.decrypt(cipher_text, "password") expected = "pythonisageneralpurposeinterpretedhighlevelprogramminglanguage" self.assertEqual(open_text, expected) self.assertEqual(cipher.decrypt("", "a"), "")
def test_cs_crack(self): cipher = Vigenere() cracker = VigenereBruteForce() open_text = normalize_text("jasynpoklopurozzurendosilenstvivodarnusrovnamsezemijmenemmistrukanvodstvijamatkuvlastnivsakkdovizdaprokouknutoumelnikolivjakpribuznismrtlidemzvodarnysmrtivrchnizradkynijenslavumistrumzcistirnytedvidisotcecozzenstinytveuzralouzjetotadybratretyslezlzradcumdozadkujensedobrepodivejcostvojijimkouprovedlimusimedrzetpospoluatuznenimarnesnazenivejmenusatanarozpoutejmepeklouzsevmychpredstavachrodisedevyjevykrasnemodrenadrzecimtakrychlecernajinenitonahodouodpadnivodamrtverybynahazimedovodarenskychobjektuuznehodlamdalnaslouchattemvodarenskymblabolumsedekrysysezerouzbytkyvodarenskychkonstrukcipredpovidamvecnouskazuvodarenskemafiitakjakodavnopredcasemjsmesvatouchatrutopilystejnykonecpripravimepodvodnikumzvodarnynelzeveritnikomukdomatlamuplnoucistotyvsechnytyhlebestiecekavodazestokysmrtlidemzvodarnysmrtivrchnizradkynijenslavumistrumzcistirnyzevsechstrannavodarnusilaspinyutocizhorastavbydrtizeleznemepoklopydokristalovevodytecoucistirenskesplaskysabotaztospachanavejmenusedepravdy") key = "qwasd" cipher_text = cipher.encrypt(open_text, key) langmodel = LangModel(get_lang_path('cs')) cracked_key = cracker.crack(cipher_text, LanguageStats(langmodel)) self.assertEqual(cracked_key, key)
def test_cs_crack(self): cipher = Vigenere() cracker = VigenereBruteForce() open_text = normalize_text( "jasynpoklopurozzurendosilenstvivodarnusrovnamsezemijmenemmistrukanvodstvijamatkuvlastnivsakkdovizdaprokouknutoumelnikolivjakpribuznismrtlidemzvodarnysmrtivrchnizradkynijenslavumistrumzcistirnytedvidisotcecozzenstinytveuzralouzjetotadybratretyslezlzradcumdozadkujensedobrepodivejcostvojijimkouprovedlimusimedrzetpospoluatuznenimarnesnazenivejmenusatanarozpoutejmepeklouzsevmychpredstavachrodisedevyjevykrasnemodrenadrzecimtakrychlecernajinenitonahodouodpadnivodamrtverybynahazimedovodarenskychobjektuuznehodlamdalnaslouchattemvodarenskymblabolumsedekrysysezerouzbytkyvodarenskychkonstrukcipredpovidamvecnouskazuvodarenskemafiitakjakodavnopredcasemjsmesvatouchatrutopilystejnykonecpripravimepodvodnikumzvodarnynelzeveritnikomukdomatlamuplnoucistotyvsechnytyhlebestiecekavodazestokysmrtlidemzvodarnysmrtivrchnizradkynijenslavumistrumzcistirnyzevsechstrannavodarnusilaspinyutocizhorastavbydrtizeleznemepoklopydokristalovevodytecoucistirenskesplaskysabotaztospachanavejmenusedepravdy" ) key = "qwasd" cipher_text = cipher.encrypt(open_text, key) langmodel = LangModel(get_lang_path('cs')) cracked_key = cracker.crack(cipher_text, LanguageStats(langmodel)) self.assertEqual(cracked_key, key)
def test_encrypt(self): cipher = Vigenere() open_text = normalize_text("Python is a general-purpose, interpreted high-level programming language") cipher_text = cipher.encrypt(open_text, "a") self.assertEqual(cipher_text, open_text) cipher_text = cipher.encrypt(open_text, "bc") expected = "qaujppjubifpftbnqwsrpufkovftqtfvffikhjmgwgmrsqhtbonkoimcoivchg" self.assertEqual(cipher_text, expected) cipher_text = cipher.encrypt(open_text, "password") expected = "eylzkbzvpgwfafroeujhkgvlctwjlfvwtdzacvchkedhncxupmeajucdcgmscs" self.assertEqual(cipher_text, expected) self.assertEqual(cipher.encrypt("", "a"), "")
class VigenereBruteForce(object): """Cryptanalysis method for Vigenere cipher""" def __init__(self): super(VigenereBruteForce, self).__init__() self.max_key_len = 10 self.caesar_cracker = TriangleAttack() self.vigenere = Vigenere() def crack(self, cipher_text, langstats): key_text = self._get_possible_keys(cipher_text, langstats) return langstats.most_meaningful(key_text) def _get_possible_keys(self, cipher_text, langstats): for i in range(2, self.max_key_len + 1): partition = self._partition_text(cipher_text, i) key = "".join(self.caesar_cracker.crack(v, langstats) for v in partition) yield key, self.vigenere.decrypt(cipher_text, key) def _partition_text(self, text, number): classes = {x:[] for x in range(number)} for i, char in enumerate(text): classes[i % number].append(char) return ("".join(v) for k, v in classes.iteritems())
class VigenereBruteForce(object): """Cryptanalysis method for Vigenere cipher""" def __init__(self): super(VigenereBruteForce, self).__init__() self.max_key_len = 10 self.caesar_cracker = TriangleAttack() self.vigenere = Vigenere() def crack(self, cipher_text, langstats): key_text = self._get_possible_keys(cipher_text, langstats) return langstats.most_meaningful(key_text) def _get_possible_keys(self, cipher_text, langstats): for i in range(2, self.max_key_len + 1): partition = self._partition_text(cipher_text, i) key = "".join( self.caesar_cracker.crack(v, langstats) for v in partition) yield key, self.vigenere.decrypt(cipher_text, key) def _partition_text(self, text, number): classes = {x: [] for x in range(number)} for i, char in enumerate(text): classes[i % number].append(char) return ("".join(v) for k, v in classes.iteritems())
def __init__(self): super(VigenereBruteForce, self).__init__() self.max_key_len = 10 self.caesar_cracker = TriangleAttack() self.vigenere = Vigenere()