def hmac(key, message): if (len(key) > BLOCKSIZE): key = bytearray(sha1(key).decode( 'hex')) # keys longer than BLOCKSIZE are shortened if (len(key) < BLOCKSIZE): # keys shorter than BLOCKSIZE are zero-padded (where + is concatenation) key = key + bytearray([0x00] * (BLOCKSIZE - len(key))) # Where * is repetition. o_key_pad = xor(bytearray([0x5c] * BLOCKSIZE), key) i_key_pad = xor(bytearray([0x36] * BLOCKSIZE), key) h1 = sha1(i_key_pad + string_to_bytearray(message)) return sha1(o_key_pad + hexstr2bytearray(h1))
def find_x_mod_r(h, r, m, tag): for i in range(0, r): k = pow(h, i, p) key = bytearray(sha1(str(k)).decode('hex'))[:16] if hmac(key, m) == tag: return i raise Exception('x mod r not found!!!')
def mitm_attack_3(): p = int( "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024" "e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd" "3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec" "6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f" "24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361" "c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552" "bb9ed529077096966d670c354e4abc9804f1746c08ca237327fff" "fffffffffffff", 16) g = 2 # initial phase alice = HonestCryptographer(p, g) alice.generate_keys() bob = HonestCryptographer(1, 1) # inactive party with dummy params # 1st message message_type = 'p, g' message = (alice.p, alice.g) for_bob = send_A_to_B(alice, bob, message_type, message, active_adversary_g_p_minus_1) bob.p = for_bob[0] bob.g = for_bob[1] bob.generate_keys() # 2nd mesage message_type = 'ACK' message = 'ACK' _ = send_B_to_A(alice, bob, message_type, message, active_adversary_g_p_minus_1) print(f"Bob params: p = {bob.p}, g = {bob.g}") # 3rd message message_type = 'A' message = alice.public_key for_bob = send_A_to_B(alice, bob, message_type, message, active_adversary_g_p_minus_1) bob.compute_shared_secret(for_bob) print(f'Bob shared secret: {bob.shared_secret}') # 4th message message_type = 'B' message = bob.public_key for_alice = send_A_to_B(alice, bob, message_type, message, active_adversary_g_p_minus_1) alice.compute_shared_secret(for_alice) print(f'Alice shared secret: {alice.shared_secret}') # 5th message message_type = 'A->B message' message = alice.send_encrypted_message(s2b('YELLOW SUBMARINE')) for_bob = send_A_to_B(alice, bob, message_type, message, active_adversary_g_p_minus_1) print( f'\nReceived by Bob: {bob.receive_encrypted_message(for_bob[0], for_bob[1])}' ) key = key = hex_string_to_bytearray(sha1(s2b('1')))[:16] decrypted = decrypt_aes_cbc(for_bob[0], key, for_bob[1]) print(f'Decrypted by Mallory: {decrypted}') win_condition_1 = decrypted == b'YELLOW SUBMARINE' key = hex_string_to_bytearray(sha1(s2b(str(ADVERSARY_STATE_3['p'] - 1))))[:16] decrypted = decrypt_aes_cbc(for_bob[0], key, for_bob[1]) print(f'Decrypted by Mallory: {decrypted}') win_condition_2 = decrypted == b'YELLOW SUBMARINE' # 6th message message_type = 'B->A message' message = bob.send_encrypted_message(s2b('SATOSHI NAKAMOTO')) for_alice = send_A_to_B(alice, bob, message_type, message, active_adversary_g_p_minus_1) print( f'\nReceived by Alice: {alice.receive_encrypted_message(for_alice[0], for_alice[1])}' ) return win_condition_1 or win_condition_2
def hkdf(self): ss = string_to_bytearray(str(self.shared_secret)) return hex_string_to_bytearray(sha1(ss))[:16]