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)))
def decrypt_and_check_pad(a, enc): msg = a.cbc_decrypt(enc) try: a.pkcs7chk(msg) except ValueError: return False return msg aes = AESCipher() aes.key="YELLOW SUBMARINE" msg = strings[0] cph = aes.cbc_encrypt(msg) def print_msg(msg): if DEBUG: print msg def decrypt_block(a, cph, block, pos, char): print_msg( "%s (%s): %s" % (pos, char, repr(block))) if len(block) < 16: block.append(chr(random.randint(0,2))) block = decrypt_block(a, cph, block, len(block), ord(block[pos-1])) print_msg( "Starting iterations on character: %s. Starting at char: %s" % (pos, char)) block_guess = block for c in range(char, 256):