4 from szyfrow
.playfair
import *
5 from szyfrow
.support
.utilities
import *
8 assert playfair_wrap(3, 0, 4) == 3
9 assert playfair_wrap(0, 0, 4) == 0
10 assert playfair_wrap(4, 0, 4) == 4
11 assert playfair_wrap(7, 0, 4) == 2
12 assert playfair_wrap(-1, 0, 4) == 4
14 def test_encipher_bigram():
15 grid
= polybius_grid('playfairexample', list(range(5)), list(range(5)))
17 plain_pairs
= 'hi de th eg ol di nt he tr ex es tu mp'.split()
18 cipher_pairs
= 'bm od zb xd na be ku dm ui xm mo uv if'.split()
20 for p
, c
in zip(plain_pairs
, cipher_pairs
):
21 assert playfair_encipher_bigram(p
, grid
) == c
23 def test_decipher_bigram():
24 grid
= polybius_grid('playfairexample', list(range(5)), list(range(5)))
26 plain_pairs
= 'hi de th eg ol di nt he tr ex es tu mp'.split()
27 cipher_pairs
= 'bm od zb xd na be ku dm ui xm mo uv if'.split()
29 for p
, c
in zip(plain_pairs
, cipher_pairs
):
30 assert playfair_decipher_bigram(c
, grid
) == p
32 def test_playfair_bigrams():
33 txt
= sanitise('hide the gold in the tree stumps')
34 f_bigrams
= 'hi de th eg ol di nt he tr ex es tu mp sx'.split()
35 t_bigrams
= 'hi de th eg ol di nt he tr ex st um ps'.split()
36 assert playfair_bigrams(txt
, padding_replaces_repeat
=True) == t_bigrams
37 assert playfair_bigrams(txt
, padding_replaces_repeat
=False) == f_bigrams
41 def test_encipher_message():
42 ct
= playfair_encipher('hide the gold in the tree stump',
43 'playfairexample', wrap_alphabet
=KeywordWrapAlphabet
.from_a
)
44 assert ct
== 'bmodzbxdnabekudmuixmmouvif'
46 ct
= playfair_encipher('this is a test message for the ' \
47 'playfair decipherment', 'elephant')
48 assert ct
== 'clkrkrldhodghouhflovqbalhphzmerxnabkhapofatb'
50 ct
= playfair_encipher('this is a test message for the ' \
51 'playfair decipherment', 'elephant',
52 wrap_alphabet
=KeywordWrapAlphabet
.from_last
)
53 assert ct
== 'vlkrkrlwamnoamawdpolovalhplcklrhmnbkhahmentu'
55 ct
= playfair_encipher('''Whoever has made a voyage up the Hudson must
56 remember the Kaatskill mountains. They are a dismembered branch of
57 the great''', 'hudson')
58 assert ct
== 'vuelznmscupnobnwszgpaoqmonudsohephortctnqnctmoclbwepcrkffthdembgchmoczcpnbbqhrntcntcbipcaeuhlmonkpnbqz'
61 def test_decipher_message():
62 plaintext
= sanitise('''Whoever has made a voyage up the Hudson must
63 remember the Kaatskill mountains. They are a dismembered branch of
66 trans_table
= ''.maketrans('j', 'i')
68 for key
in ['wink', 'elephant', 'swashbuckling']:
69 for prp
in [True, False]:
70 expected
= cat(playfair_bigrams(plaintext
.translate(trans_table
),
71 padding_replaces_repeat
=prp
))
72 for wrap
in KeywordWrapAlphabet
:
73 enciphered
= playfair_encipher(plaintext
, key
,
74 padding_replaces_repeat
=prp
, wrap_alphabet
=wrap
)
75 deciphered
= playfair_decipher(enciphered
, key
,
76 padding_replaces_repeat
=prp
, wrap_alphabet
=wrap
)
77 assert deciphered
== expected
80 def test_playfair_break():
81 plaintext
= sanitise('''You will rejoice to hear that no disaster has accompanied the
82 commencement of an enterprise which you have regarded with such evil
83 forebodings. I arrived here yesterday, and my first task is to assure
84 my dear sister of my welfare and increasing confidence in the success
85 of my undertaking.''')
86 expected_key
= 'swashbuckling'
87 expected_wrap
= KeywordWrapAlphabet
.from_last
88 expected_letters_to_merge
= {'j': 'i'}
89 expected_padding_letter
= 'x'
90 expected_padding_replaces_repeat
= False
91 ciphertext
= playfair_encipher(plaintext
, expected_key
,
92 padding_letter
=expected_padding_letter
,
93 padding_replaces_repeat
=expected_padding_replaces_repeat
,
94 letters_to_merge
=expected_letters_to_merge
,
95 wrap_alphabet
=expected_wrap
)
98 exptected_text
= playfair_decipher(ciphertext
, expected_key
,
99 padding_letter
=expected_padding_letter
,
100 padding_replaces_repeat
=expected_padding_replaces_repeat
,
101 letters_to_merge
=expected_letters_to_merge
,
102 wrap_alphabet
=expected_wrap
)
104 expected_score
= Ptrigrams(exptected_text
)
106 dictionary
= ['clearinghouse', 'computerising', 'counterclaims',
107 'housewarmings', 'intravenously', 'liquefactions', 'somersaulting',
108 'sportsmanlike', 'swashbuckling']
110 # dictionary = ['swashbuckling']
112 (key
, wrap
, letters_to_merge
, padding_letter
, padding_replaces_repeat
), score
= playfair_break(
114 letters_to_merge
=expected_letters_to_merge
,
115 padding_letter
=expected_padding_letter
,
116 wordlist
=dictionary
, fitness
=Ptrigrams
)
118 assert key
== expected_key
119 assert wrap
== expected_wrap
120 assert letters_to_merge
== expected_letters_to_merge
121 assert padding_letter
== expected_padding_letter
122 assert padding_replaces_repeat
== expected_padding_replaces_repeat
123 assert score
== pytest
.approx(expected_score
)