Skip to content

Commit 5a68cff

Browse files
committed
Fixed codec: playfair
1 parent 06508d7 commit 5a68cff

1 file changed

Lines changed: 20 additions & 10 deletions

File tree

‎src/codext/crypto/playfair.py‎

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
'enc(playfair-playfairexample)': {'HIDETHEGOLDINTHETREESTUMP': 'BMODZBXDNABEKUDMUIXMMOUVIF'},
3131
'enc-dec(playfair-keyword)': ["TEST"],
3232
'enc-dec(playfair-*-5-X-IJ)': ["TEST", "TESTSENTENCE"],
33+
'enc(playfair-*-6-XQ-IJ)': None,
34+
'enc(playfair-secret-6)': {'JUNK MAIL 42': "LPOLORFO8Y"},
35+
'enc-dec(playfair-*-6-XQ)': ["JUNKMAIL42", "HIDEGOLD2026"],
3336
}
3437
__guess__ = ["playfair"]
3538

@@ -73,7 +76,7 @@ def playfair_encode(key=None, grid_size=None, fill_chars=None, replace_char=None
7376
grid, pos = __build_grid(key, gsize, rchar)
7477
def encode(text, errors="strict"):
7578
_filler = lambda c: fchars[1] if c == fchars[0] else fchars[0]
76-
chars = [rchar[1] if c == rchar[0] else c for c in ensure_str(text).upper().replace(" ", "")]
79+
chars = [rchar[1] if gsize == 5 and c == rchar[0] else c for c in ensure_str(text).upper().replace(" ", "")]
7780
result, i, _h = [], 0, handle_error("playfair", errors)
7881
while i < len(chars):
7982
a = chars[i]
@@ -92,11 +95,11 @@ def encode(text, errors="strict"):
9295
r_a, c_a = pos[a]
9396
r_b, c_b = pos[b]
9497
if r_a == r_b:
95-
ea, eb = grid[r_a * 5 + (c_a + 1) % 5], grid[r_b * 5 + (c_b + 1) % 5]
98+
ea, eb = grid[r_a * gsize + (c_a + 1) % gsize], grid[r_b * gsize + (c_b + 1) % gsize]
9699
elif c_a == c_b:
97-
ea, eb = grid[((r_a + 1) % 5) * 5 + c_a], grid[((r_b + 1) % 5) * 5 + c_b]
100+
ea, eb = grid[((r_a + 1) % gsize) * gsize + c_a], grid[((r_b + 1) % gsize) * gsize + c_b]
98101
else:
99-
ea, eb = grid[r_a * 5 + c_b], grid[r_b * 5 + c_a]
102+
ea, eb = grid[r_a * gsize + c_b], grid[r_b * gsize + c_a]
100103
result.extend([ea, eb])
101104
i += 1
102105
return (r := "".join(result)), len(r)
@@ -107,7 +110,7 @@ def playfair_decode(key=None, grid_size=None, fill_chars=None, replace_char=None
107110
key, gsize, _, rchar = __set_params(key, grid_size, fill_chars, replace_char)
108111
grid, pos = __build_grid(key, gsize, rchar)
109112
def decode(text, errors="strict"):
110-
chars = [rchar[1] if c == rchar[0] else c for c in ensure_str(text)]
113+
chars = [rchar[1] if gsize == 5 and c == rchar[0] else c for c in ensure_str(text)]
111114
result, i, _h = [], 0, handle_error("playfair", errors, decode=True)
112115
while i < len(chars):
113116
try:
@@ -124,18 +127,25 @@ def decode(text, errors="strict"):
124127
i += 2
125128
continue
126129
if r_a == r_b:
127-
da, db = grid[r_a * 5 + (c_a - 1) % 5], grid[r_b * 5 + (c_b - 1) % 5]
130+
da, db = grid[r_a * gsize + (c_a - 1) % gsize], grid[r_b * gsize + (c_b - 1) % gsize]
128131
elif c_a == c_b:
129-
da, db = grid[((r_a - 1) % 5) * 5 + c_a], grid[((r_b - 1) % 5) * 5 + c_b]
132+
da, db = grid[((r_a - 1) % gsize) * gsize + c_a], grid[((r_b - 1) % gsize) * gsize + c_b]
130133
else:
131-
da, db = grid[r_a * 5 + c_b], grid[r_b * 5 + c_a]
134+
da, db = grid[r_a * gsize + c_b], grid[r_b * gsize + c_a]
132135
result.extend([da, db])
133136
i += 2
134137
return (r := "".join(result)), len(r)
135138
return decode
136139

137140

138-
add("playfair", playfair_encode, playfair_decode, r"^playfair(?:[-_]cipher)?(?:[-_]([\^*]|[a-zA-Z]+))?"
139-
r"(?:(?:[-_](5))?(?:[-_]([A-Z]{1,2}))?(?:[-_]([A-Z]{2}))|(?:[-_](6))?(?:[-_]([A-Z]{1,2}))?())?$",
141+
def __params(f):
142+
""" Merge the groups of both alternatives of the pattern (replaced char only applies to the 5x5 grid). """
143+
def _wrapper(key=None, gs5=None, fc5=None, replace_char=None, gs6=None, fc6=None):
144+
return f(key, gs5 or gs6, fc5 or fc6, replace_char)
145+
return _wrapper
146+
147+
148+
add("playfair", __params(playfair_encode), __params(playfair_decode), r"^playfair(?:[-_]cipher)?(?:[-_]([\^*]|"
149+
r"[a-zA-Z]+))?(?:(?:[-_](5))?(?:[-_]([A-Z]{1,2}))?(?:[-_]([A-Z]{2}))?|[-_](6)(?:[-_]([A-Z]{1,2}))?)$",
140150
printables_rate=1., penalty=.1)
141151

0 commit comments

Comments
 (0)