#!/usr/bin/python from Crypto.Cipher import AES from Crypto import Random import sys, time def split_len(seq, length): return [seq[i:i+length] for i in range(0, len(seq), length)] def ByteToHex( byteStr ): xxd = '' for i in range(len(byteStr)): xxd = xxd + "%02X " % ord (byteStr[i]) if i % 16 == 15: xxd = xxd + "\n" #if i % 16 == 7: # xxd += "- " if i % 64 == 63: xxd += "\n" return xxd.strip() key = 'Sixteen byte key' iv = Random.new().read(AES.block_size) secret = 'jangan sembarangan ini sangat rahasia sekali' def challengePhase1(text): global iv cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = text + secret padlen = (((len(plaintext) / AES.block_size) + 1) * AES.block_size) - len(plaintext) plaintext += chr(padlen)*padlen ciphertext = cipher.encrypt(plaintext) cblocks = split_len(ciphertext, AES.block_size) origiv = iv iv = cblocks[len(cblocks)-1] # New IV is last cipher block return origiv+ciphertext def challengePhase2(text): global iv cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = text ciphertext = cipher.encrypt(plaintext) cblocks = split_len(ciphertext, AES.block_size) iv = cblocks[len(cblocks)-1] # New IV is last cipher block return ciphertext cracked = '' factor = 4 for j in range(0,factor*AES.block_size): r = "\x00" * ((AES.block_size*factor) - j - 1) ciphertext = challengePhase1(r) cblocks = split_len(ciphertext, AES.block_size) ci = cblocks[factor-1] for guess in range(32,127): sys.stdout.write("\b"+chr(guess)) sys.stdout.flush() time.sleep(0.002) guessblock = r + cracked + chr(guess) guessblock = guessblock[AES.block_size*(factor-1):] challengeblock = "" if len(guessblock) == AES.block_size: for i in range(0,len(ci)): challengeblock += chr(ord(ci[i]) ^ ord(iv[i]) ^ ord(guessblock[i])) ciphertext2 = challengePhase2(challengeblock) if ciphertext2 == cblocks[factor]: sys.stdout.write("\b"+chr(guess)+" ") cracked += chr(guess) break else: break print