+def affine_cipher_letter(letter, multiplier, shift, one_based=True):
+ if letter in string.ascii_letters:
+ if letter in string.ascii_lowercase:
+ alphastart = ord('a')
+ else:
+ alphastart = ord('A')
+ letter_number = ord(letter) - alphastart
+ if one_based: letter_number += 1
+ enciphered_letter_number = letter_number * multiplier + shift
+ if one_based: enciphered_letter_number -=1
+ enciphered_letter = chr(enciphered_letter_number % 26 + alphastart)
+ return enciphered_letter
+ else:
+ return letter
+
+def affine_decipher_letter(letter, multiplier, shift, one_based=True):
+ if letter in string.ascii_letters:
+ if letter in string.ascii_lowercase:
+ alphastart = ord('a')
+ else:
+ alphastart = ord('A')
+ letter_number = ord(letter) - alphastart
+ if one_based: letter_number +=1
+ after_unshift = letter_number - shift
+ deciphered_letter_number = modular_division[after_unshift % 26][multiplier]
+ if one_based: deciphered_letter_number -=1
+ deciphered_letter = chr(deciphered_letter_number % 26 + alphastart)
+ return deciphered_letter
+ else:
+ return letter
+
+def affine_cipher_message(message, multiplier, shift, one_based=True):
+ big_cipher = [affine_cipher_letter(l, multiplier, shift, one_based) for l in message]
+ return ''.join(big_cipher)
+
+def affine_decipher_message(message, multiplier, shift, one_based=True):
+ big_decipher = [affine_decipher_letter(l, multiplier, shift, one_based) for l in message]
+ return ''.join(big_decipher)
+
+