from Crypto.Cipher import AES
from Crypto import Random

def read(fname):
    with open(fname,"r") as f:
        return f.read()
         
key = read("key.txt")
flag = read("flag.txt")

message = """
We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell you how I'm feeling
Gotta make you understand
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
"""

def pad_pkcs7(m):
    padding = AES.block_size - (len(m) % AES.block_size)
    m += chr(padding)*padding
    return m
    
def unpad_pkcs7(m):
    padding = ord(m[-1])
    return m[:-padding]

def is_padding_correct(m):
    
    padding = ord(m[-1])
    if padding <=0 or padding > AES.block_size:
        return False

    for i in range(1,padding+1):
        if m[-i] != m[-1]:
            return False
            
    return True

def encrypt(m):
    IV = Random.new().read(AES.block_size)
    cipher = AES.new(key, AES.MODE_CBC, IV)
    return IV + cipher.encrypt(pad_pkcs7(m))
    
def decrypt(m):
    IV = m[:AES.block_size]
    ciphertext = m[AES.block_size:]
    cipher = AES.new(key, AES.MODE_CBC, IV)
    
    decrypted = cipher.decrypt(ciphertext)
    if not is_padding_correct(decrypted):
        return None
    
    return unpad_pkcs7(decrypted)

def main():
    print "welcome to crypto service"
    while(True):
        task = raw_input()
        if task == "encrypt":
            print encrypt(message).encode("hex")
        elif task.startswith("decrypt"):
            data = task[8:].decode("hex")
            if len(data) % AES.block_size:
                print "length is not valid"
            else:
                data = decrypt(data)
                if data == None:
                    print "wrong padding!"
                else:  
                    if data == message[::-1]:
                        print "Congrats! Here is your flag: "+flag
                        break
                    else:
                        print data.encode("hex")
        else:
            print "bad option"
    
if __name__ == "__main__":
    main()
