|
25 | 25 |
|
26 | 26 |
|
27 | 27 | __examples__ = { |
| 28 | + 'dec(phillips)': None, |
28 | 29 | 'enc(phillips)': None, |
| 30 | + 'enc(phillips-key)': {'ATTACK1': None}, |
29 | 31 | 'enc(phillips-key)': {'ATTACK': "HUUHLL", 'TESTME': "UFZUSM", 'ABCDEF': "HCLMFA"}, |
30 | 32 | 'enc(phillips-key-5-1-2)': {'This is a Test String': "KPVBVHTCRHCHCGQBT"}, |
31 | 33 | 'dec(phillips-key-5-1-2)': {'KPVBVHTCRHCHCGQBT': "THISISATESTSTRING"}, |
@@ -58,69 +60,45 @@ def __make_grids(key): |
58 | 60 | return grids |
59 | 61 |
|
60 | 62 |
|
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(" ", "") |
67 | 74 | _h = handle_error("phillips", errors, decode=decode) |
68 | | - r, i = "", 0 |
69 | 75 | for pos, c in enumerate(t): |
70 | | - if c == " ": |
71 | | - continue |
72 | 76 | if c not in set(_ALPHABET): |
73 | 77 | 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) |
105 | 85 |
|
106 | 86 |
|
107 | 87 | 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) |
109 | 89 | 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) |
114 | 93 | return encode |
115 | 94 |
|
116 | 95 |
|
117 | 96 | 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) |
119 | 98 | 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) |
124 | 102 | return decode |
125 | 103 |
|
126 | 104 |
|
|
0 commit comments