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