Path: blob/master/Block-Cipher/Attack-CBC-Bit-Flipping/Challenges/CNVService/AES_CNV_COOKIE.py
1402 views
from hashlib import md51from base64 import b64decode2from base64 import b64encode3from Crypto.Cipher import AES4from time import ctime5from Secret import __HIDDEN__, __SECRET__67BLOCK_SIZE = 1689pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \10chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)11unpad = lambda s: s[:-ord(s[len(s) - 1:])]1213def xor(dest, src):14if len(dest) == 0:15return src16elif len(src) == 0:17return dest18elif len(dest) >= len(src):19return ''.join(chr(ord(dest[i])^ord(src[i])) for i in range(len(src)))20else:21return ''.join(chr(ord(dest[i])^ord(src[i])) for i in range(len(dest)))222324class AES_CNV:2526def __init__(self, key):27assert len(key) == BLOCK_SIZE28self.key = key2930def encrypt(self, plain_text, iv):31assert len(iv) == 1632plain_text = pad(plain_text)33assert len(plain_text)%BLOCK_SIZE == 034cipher_text = ''35aes = AES.new(self.key, AES.MODE_ECB)36h = iv37for i in range(len(plain_text)//BLOCK_SIZE):38block = plain_text[i*16:i*16+16]39block = xor(block, h)40cipher_block = aes.encrypt(block)41cipher_text += cipher_block42h = md5(cipher_block).digest()43return iv+cipher_text4445def decrypt(self, cipher_text):46assert len(cipher_text)%BLOCK_SIZE == 047iv = cipher_text[:16]48cipher_text = cipher_text[16:]49aes = AES.new(self.key, AES.MODE_ECB)50h = iv51plain_text = ''52for i in range(len(cipher_text)//BLOCK_SIZE):53block = cipher_text[i*16:i*16+16]54plain_block = aes.decrypt(block)55plain_block = xor(plain_block, h)56plain_text += plain_block57h = md5(block).digest()58return unpad(plain_text)5960class Cookie:6162def __init__(self, key):63assert len(key) == BLOCK_SIZE64self.key = key6566def register(self, name, username):67name = pad(name)68iv = xor(name, md5(__HIDDEN__).digest())69cookie = "CNVService" + "*" + "user="+ username + "*" + ctime() + "*" + __SECRET__70aescnv = AES_CNV(self.key)71cookie = aescnv.encrypt(cookie, iv)72return b64encode(cookie)7374def authentication(self, cookie):75cookie = b64decode(cookie)76name = cookie[:16]77name = xor(name, md5(__HIDDEN__).digest())78if ord(name[-1]) < 16:79name = unpad(name)80aescnv = AES_CNV(self.key)81cookie = aescnv.decrypt(cookie)82info = cookie.split("*")83if info[0] != "CNVService":84return None, None, None85elif info[-1] != __SECRET__:86return None, None, None87elif "user=" != info[1][:5]:88return None, None, None89elif len(info[1].split("=")) == 2:90return name, info[1].split("=")[1], info[2]91else:92return None, None, None939495