Advertisement
Foxscotch

caesar.py

Feb 7th, 2016
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.04 KB | None | 0 0
  1. import re
  2. import sys
  3. import random
  4. import argparse
  5.  
  6.  
  7. if sys.argv[1] == 'generate':
  8.     generate = True
  9. else:
  10.     generate = False
  11.     parser = argparse.ArgumentParser()
  12.     parser.add_argument('-d', '--decode',
  13.             help='decode the message', action='store_true')
  14.     parser.add_argument('-e', '--encode',
  15.             help='encode the message (default)', action='store_true')
  16.     parser.add_argument('message', help='message to encode/decode')
  17.     parser.add_argument('key', help='encryption key')
  18.     args = parser.parse_args()
  19.  
  20.  
  21. def normalize_key(key):
  22.     if key.isdigit() and not len(key) % 2:
  23.         new_key = []
  24.         for key_num in re.findall('..', key):
  25.             key_num = int(key_num)
  26.             while key_num > 26:
  27.                 key_num -= 26
  28.             new_key.append(key_num)
  29.         return new_key
  30.     else:
  31.         raise parser.error('key argument must be an even number of integers')
  32.  
  33.  
  34. def rotate(message, key, mode):
  35.     if mode == 'd':
  36.         key = [-x for x in key]
  37.     elif mode != 'e':
  38.         raise ValueError('mode argument must be "d" or "e"')
  39.    
  40.     for rot_num in key:
  41.         translated = ''
  42.         for char in message:
  43.             if char.isalpha():
  44.                 num = ord(char)
  45.                 num += rot_num
  46.                 if char.isupper():
  47.                     if num > ord('Z'):
  48.                         num -= 26
  49.                     elif num < ord('A'):
  50.                         num += 26
  51.                 elif char.islower():
  52.                     if num > ord('z'):
  53.                         num -= 26
  54.                     elif num < ord('a'):
  55.                         num += 26
  56.                 translated += chr(num)
  57.             else:
  58.                 translated += char
  59.         message = translated
  60.         x = 12
  61.    
  62.     return translated
  63.  
  64.  
  65. if generate:
  66.     key = [str(random.randint(1, 25)).zfill(2) for x in range(5)]
  67.     print(''.join(key))
  68. else:
  69.     key = normalize_key(args.key)
  70.     mode = 'd' if args.decode else 'e'
  71.     print(rotate(args.message, key, mode))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement