## Utility functions
cat = ''.join
wcat = ' '.join
+lcat = '\n'.join
def pos(letter):
if letter in string.ascii_lowercase:
>>> vigenere_encipher('hello', 'abc')
'hfnlp'
"""
- shifts = [ord(l) - ord('a') for l in sanitise(keyword)]
+ shifts = [pos(l) for l in sanitise(keyword)]
pairs = zip(message, cycle(shifts))
return cat([caesar_encipher_letter(l, k) for l, k in pairs])
>>> vigenere_decipher('hfnlp', 'abc')
'hello'
"""
- shifts = [ord(l) - ord('a') for l in sanitise(keyword)]
+ shifts = [pos(l) for l in sanitise(keyword)]
pairs = zip(message, cycle(shifts))
return cat([caesar_decipher_letter(l, k) for l, k in pairs])
-beaufort_encipher=vigenere_decipher
-beaufort_decipher=vigenere_encipher
+
+def beaufort_encipher(message, keyword):
+ """Beaufort encipher
+
+ >>> beaufort_encipher('inhisjournaldatedtheidesofoctober', 'arcanaimperii')
+ 'sevsvrusyrrxfayyxuteemazudmpjmmwr'
+ """
+ shifts = [pos(l) for l in sanitise(keyword)]
+ pairs = zip(message, cycle(shifts))
+ return cat([unpos(k - pos(l)) for l, k in pairs])
+
+beaufort_decipher = beaufort_encipher
+
+beaufort_variant_encipher=vigenere_decipher
+beaufort_variant_decipher=vigenere_encipher
def polybius_grid(keyword, column_order, row_order, letters_to_merge=None,
padding = fillvalue[0] * (n - len(sanitised_message) % n)
else:
padding = ''
- message = [ord(c) - ord('a') for c in sanitised_message + padding]
+ message = [pos(c) for c in sanitised_message + padding]
message_chunks = [message[i:i+n] for i in range(0, len(message), n)]
# message_chunks = chunks(message, len(matrix), fillvalue=None)
enciphered_chunks = [((matrix * np.matrix(c).T).T).tolist()[0]
for c in message_chunks]
- return cat([chr(int(round(l)) % 26 + ord('a'))
+ return cat([unpos(round(l))
for l in sum(enciphered_chunks, [])])
def hill_decipher(matrix, message, fillvalue='a'):
self.validate_wheel_spec(wheel)
self.make_wheel_map(wheel)
if position in string.ascii_lowercase:
- self.position = ord(position) - ord('a')
+ self.position = pos(position)
else:
self.position = position
self.validate_wheel_spec(wheel_spec)
self.wheel_map = [0] * 26
for p in wheel_spec:
- self.wheel_map[ord(p[0]) - ord('a')] = ord(p[1]) - ord('a')
- self.wheel_map[ord(p[1]) - ord('a')] = ord(p[0]) - ord('a')
+ self.wheel_map[pos(p[0])] = pos(p[1])
+ self.wheel_map[pos(p[1])] = pos(p[0])
return self.wheel_map
def validate_wheel_spec(self, wheel_spec):
''
"""
if letter in string.ascii_lowercase:
- return chr(
- (self.wheel_map[(ord(letter) - ord('a') - self.position) % 26] +
- self.position) % 26 +
- ord('a'))
+ return unpos(
+ (self.wheel_map[(pos(letter) - self.position) % 26] +
+ self.position))
else:
return ''
>>> pe.set_position('z')
25
"""
- self.position = ord(position) - ord('a')
+ self.position = pos(position)
return self.position