Skip to content

Commit 24afd9f

Browse files
committed
Refined codec: phillips
1 parent 67a7869 commit 24afd9f

1 file changed

Lines changed: 28 additions & 50 deletions

File tree

src/codext/crypto/phillips.py

Lines changed: 28 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525

2626

2727
__examples__ = {
28+
'dec(phillips)': None,
2829
'enc(phillips)': None,
30+
'enc(phillips-key)': {'ATTACK1': None},
2931
'enc(phillips-key)': {'ATTACK': "HUUHLL", 'TESTME': "UFZUSM", 'ABCDEF': "HCLMFA"},
3032
'enc(phillips-key-5-1-2)': {'This is a Test String': "KPVBVHTCRHCHCGQBT"},
3133
'dec(phillips-key-5-1-2)': {'KPVBVHTCRHCHCGQBT': "THISISATESTSTRING"},
@@ -58,69 +60,45 @@ def __make_grids(key):
5860
return grids
5961

6062

61-
def _shift_text(text, grids, block_size, dh, dv, errors, decode=False):
62-
t = ensure_str(text).upper().replace("J", "I")
63-
pos_maps = [
64-
{ch: (r, c) for r, row in enumerate(grid) for c, ch in enumerate(row)}
65-
for grid in grids
66-
]
63+
def __set_params(key, block_size, dh, dv):
64+
return (key or "").strip(), \
65+
int(block_size) if block_size else 5, \
66+
int(dh) if dh else 1, \
67+
int(dv) if dv else 1, \
68+
__make_grids(key) if key and key.isalpha() else None
69+
70+
71+
def __shift_text(text, grids, block_size, dh, dv, errors, decode=False):
72+
pos_maps = [{ch: (r, c) for r, row in enumerate(grid) for c, ch in enumerate(row)} for grid in grids]
73+
r, i, t = "", 0, ensure_str(text).upper().replace("J", "I").replace(" ", "")
6774
_h = handle_error("phillips", errors, decode=decode)
68-
r, i = "", 0
6975
for pos, c in enumerate(t):
70-
if c == " ":
71-
continue
7276
if c not in set(_ALPHABET):
7377
r += _h(c, pos, r)
74-
continue
75-
grid_idx = (i // block_size) % 8
76-
grid = grids[grid_idx]
77-
s, col = pos_maps[grid_idx][c]
78-
r += grid[(s + dv) % 5][(col + dh) % 5]
79-
i += 1
80-
return r, len(text)
81-
82-
83-
def _make_cipher(key, block_size, dh, dv):
84-
_key = (key or "").strip()
85-
try:
86-
block_size = int(block_size) if block_size else 5
87-
except (ValueError, TypeError):
88-
raise LookupError(f"Bad parameter for encoding 'phillips': block_size must be an integer, got {block_size}")
89-
if not (1 <= block_size <= 25):
90-
raise LookupError("Bad parameter for encoding 'phillips': block_size must be between 1 and 25, got "
91-
f"{block_size}")
92-
try:
93-
dh = int(dh) if dh else 1
94-
except (ValueError, TypeError):
95-
raise LookupError(f"Bad parameter for encoding 'phillips': dh must be an integer, got {dh}")
96-
if not (1 <= dh <= 4):
97-
raise LookupError(f"Bad parameter for encoding 'phillips': dh must be between 1 and 4, got {dh}")
98-
try:
99-
dv = int(dv) if dv else 1
100-
except (ValueError, TypeError):
101-
raise LookupError(f"Bad parameter for encoding 'phillips': dv must be an integer, got {dv}")
102-
if not (1 <= dv <= 4):
103-
raise LookupError(f"Bad parameter for encoding 'phillips': dv must be between 1 and 4, got {dv}")
104-
return _key, block_size, dh, dv, __make_grids(_key) if _key and _key.isalpha() else None
78+
else:
79+
grid_idx = (i // block_size) % 8
80+
grid = grids[grid_idx]
81+
s, col = pos_maps[grid_idx][c]
82+
r += grid[(s + dv) % 5][(col + dh) % 5]
83+
i += 1
84+
return r, len(r)
10585

10686

10787
def phillips_encode(key, block_size=None, dh=None, dv=None):
108-
_key, block_size, dh, dv, grids = _make_cipher(key, block_size, dh, dv)
88+
_key, block_size, dh, dv, grids = __set_params(key, block_size, dh, dv)
10989
def encode(text, errors="strict"):
110-
if grids is None:
111-
raise LookupError("Bad parameter for encoding 'phillips': "
112-
"key must be a non-empty alphabetic string")
113-
return _shift_text(text, grids, block_size, dh, dv, errors)
90+
if _key == "":
91+
raise LookupError("Bad parameter for encoding 'phillips': key cannot be empty")
92+
return __shift_text(text, grids, block_size, dh, dv, errors)
11493
return encode
11594

11695

11796
def phillips_decode(key, block_size=None, dh=None, dv=None):
118-
_key, block_size, dh, dv, grids = _make_cipher(key, block_size, dh, dv)
97+
_key, block_size, dh, dv, grids = __set_params(key, block_size, dh, dv)
11998
def decode(text, errors="strict"):
120-
if grids is None:
121-
raise LookupError("Bad parameter for decoding 'phillips': "
122-
"key must be a non-empty alphabetic string")
123-
return _shift_text(text, grids, block_size, -dh, -dv, errors, True)
99+
if _key == "":
100+
raise LookupError("Bad parameter for encoding 'phillips': key cannot be empty")
101+
return __shift_text(text, grids, block_size, -dh, -dv, errors, True)
124102
return decode
125103

126104

0 commit comments

Comments
 (0)