new_size = len(aes.ecb_encrypt(msg)) if new_size > size: break return size data = b64decode('Um9sbGluJyBpbiBteSA1LjAKV2l0aCBteSByYWctdG9wIGRvd24gc28gbXkgaGFpciBjYW4gYmxvdwpUaGUgZ2lybGllcyBvbiBzdGFuZGJ5IHdhdmluZyBqdXN0IHRvIHNheSBoaQpEaWQgeW91IHN0b3A/IE5vLCBJIGp1c3QgZHJvdmUgYnkK') key = generate_key() a = AESCipher(key) bs = determine_block_size(a) print "Block size: %s" % bs known_data = "" char_dict = {} for i in range(1, 176): short_str = "A" * (bs-i) + known_data for j in range(256): str = short_str + known_data + chr(j) char_dict[str] = a.ecb_encrypt(str) enc = short_str + data[:i] msg = a.ecb_encrypt(enc) for k,v in char_dict.iteritems(): if v == msg: known_data += k[-1] print known_data
dupe_count = find_duplicate_blocks(data) if dupe_count > 2: return 2 elif dupe_count == 0: return 1 else: return -1 success = 0 fail = 0 msg = "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" for i in range(200): enc_msg = generate_jibber_jabber(msg) mode = randint(1,2) if mode == 1: a = AESCipher(key=generate_key(), bs=16, iv=generate_key()) enc = a.cbc_encrypt(enc_msg) elif mode == 2: a = AESCipher(key=generate_key(), bs=16, iv=generate_key()) enc = a.ecb_encrypt(enc_msg) computed_mode = encryption_oracle(enc) if mode == computed_mode: success += 1 else: fail += 1 print "Success rate: %.3f" % float(float(success)/float((success + fail)))