from Crypto.Cipher import AES
from random import randint


key = "aaaabbbbccccdddd"

def decr(ciphertext):
  iv = ciphertext[:16]
  c = ciphertext[17:]
  cipher = AES.new(key, AES.MODE_CBC, iv)
  return ispkcs7(cipher.decrypt(c))

""" decrypts the ct and returns it when padding is ok, else retuirn False """
def decrypt(ciphertext):
  iv = ciphertext[:16]
  c = ciphertext[16:]
  cipher = AES.new(key, AES.MODE_CBC, iv)

  plain = cipher.decrypt(c)
  #print('Debug: padded msg: %s' % plain.encode('hex'))
  if ispkcs7(plain):
    return remove_padding(plain)
  return False


def remove_padding(pt):
    pad_len = int(ord(pt[-1]))
    return pt[:-pad_len]


def ispkcs7(plaintext):
  l = len(plaintext)
  c = ord(plaintext[l-1])

  if (c > 16) or (c < 1):
    return False
  if plaintext[l-c:] != chr(c) * c:
    return False

  return True


def encr(plaintext):
  iv = ''.join([chr(randint(0,0xff)) for x in range(16)])
  cipher = AES.new(key, AES.MODE_CBC, iv)
  ciphertext = cipher.encrypt(pkcs7(plaintext))
  return iv + ciphertext

def pkcs7(plaintext):
  print("PKCS#7")
  print plaintext
  if len(plaintext) % 16 == 0:
    pad = "\x00" * 16
  else:
    padbytes = 16 - len(plaintext) % 16
    pad = padbytes * chr(padbytes)
  tmp= plaintext + pad
  print(tmp.encode('hex'))
  return plaintext + pad