def challenge34(): p = 197 g = 3 dh1 = DiffieHellman() dh2 = DiffieHellman() dh1._p = dh2._p = p dh1._g = dh2._g = g A = dh1.gen_pub() B = dh2.gen_pub() #dh2.gen_secret(A) dh2.gen_secret(p) #dh1.gen_secret(B) dh1.gen_secret(p) message = b'hello, MITM' key1 = hashlib.sha1(dh1.secret.to_bytes(64, 'big')).digest()[:16] iv1 = os.urandom(16) ct1 = set2.aes_cbc_encrypt(message, key1, iv1) key2 = hashlib.sha1(dh2.secret.to_bytes(64, 'big')).digest()[:16] iv2 = os.urandom(16) message2 = set2.aes_cbc_decrypt(ct1, key2, iv1) ct2 = set2.aes_cbc_encrypt(message2, key2, iv2) message3 = set2.aes_cbc_decrypt(ct2, key1, iv2) assert message == message3 key3 = hashlib.sha1((0).to_bytes(64, 'big')).digest()[:16] message4 = set2.aes_cbc_decrypt(ct1, key3, iv1) assert message == message4
def challenge35(): p = 197 g = 3 dh1 = DiffieHellman() dh2 = DiffieHellman() for fg in [1, p, p - 1]: dh1._p = dh2._p = p dh1._g = dh2._g = fg A = dh1.gen_pub() B = dh2.gen_pub() dh2.gen_secret(A) dh1.gen_secret(B) message = b'hello, MITM' key1 = hashlib.sha1(dh1.secret.to_bytes(64, 'big')).digest()[:16] iv1 = os.urandom(16) ct1 = set2.aes_cbc_encrypt(message, key1, iv1) key2 = hashlib.sha1(dh2.secret.to_bytes(64, 'big')).digest()[:16] iv2 = os.urandom(16) message2 = set2.aes_cbc_decrypt(ct1, key2, iv1) ct2 = set2.aes_cbc_encrypt(message2, key2, iv2) message3 = set2.aes_cbc_decrypt(ct2, key1, iv2) assert message == message3 if fg == 1: s = 1 elif fg == p: s = 0 else: if A == p - 1 and B == p - 1: s = p - 1 else: s = 1 key3 = hashlib.sha1((s).to_bytes(64, 'big')).digest()[:16] message4 = set2.aes_cbc_decrypt(ct1, key3, iv1) assert message == message4
class KeyExchange(object): def __init__(self): print("New KeyExchange, initializing Diffie-Hellman") self.dh = DiffieHellman(group=14) @expose def exchange_key(self, other_public_key): print("received a public key, calculating shared secret...") self.dh.make_shared_secret_and_key(other_public_key) print("shared secret key = ", self.dh.key) return self.dh.public_key
class KeyExchange(object): def __init__(self): print("New KeyExchange, initializing Diffie-Hellman") self.dh = DiffieHellman(group=14) def exchange_key(self, other_public_key): print("received a public key, calculating shared secret...") self.dh.make_shared_secret_and_key(other_public_key) print("setting new shared secret key.") global daemon daemon._pyroHmacKey = self.dh.key return self.dh.public_key
def test_challenge33(): dh1 = DiffieHellman() dh2 = DiffieHellman() dh1._p = dh2._p = int( 'ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024' 'e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd' '3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec' '6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f' '24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361' 'c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552' 'bb9ed529077096966d670c354e4abc9804f1746c08ca237327fff' 'fffffffffffff', 16) dh1._g = dh2._g = 2 pub1 = dh1.gen_pub() pub2 = dh2.gen_pub() dh1.gen_secret(pub2) dh2.gen_secret(pub1) assert dh1.secret == dh2.secret
def test_shared_key(group: int): dh1 = DiffieHellman(group=group) dh2 = DiffieHellman(group=group) dh1_public = dh1.get_public_key() dh2_public = dh2.get_public_key() dh1_shared = dh1.generate_shared_key(dh2_public) dh2_shared = dh2.generate_shared_key(dh1_public) assert dh1_shared == dh2_shared
class State: def __init__(self): self.dh = DiffieHellman() def setup(self, secret_key, public_key): self.dh = DiffieHellman() self.kdf = KDF(secret_key, self.dh.shared(public_key)) def update(self): return self.kdf.update()
from Pyro5.api import Proxy from diffiehellman import DiffieHellman dh = DiffieHellman(group=14) with Proxy("PYRONAME:example.dh.keyexchange") as keyex: print("exchange public keys...") other_key = keyex.exchange_key(dh.public_key) print("got server public key, creating shared secret key...") dh.make_shared_secret_and_key(other_key) print("shared secret key = ", dh.key.hex()) print("(check the server output to see the same shared private key)")
def __init__(self): print("New KeyExchange, initializing Diffie-Hellman") self.dh = DiffieHellman(group=14)
import Pyro4 import Pyro4.errors from diffiehellman import DiffieHellman dh = DiffieHellman(group=14) with Pyro4.locateNS() as ns: uri = ns.lookup("example.dh.secretstuff") print(uri) p = Pyro4.Proxy(uri) try: p.process("hey") raise RuntimeError("this should not be reached") except Pyro4.errors.PyroError as x: print("Error occured (expected!):", x) with Pyro4.Proxy("PYRONAME:example.dh.keyexchange") as keyex: print("exchange public keys...") other_key = keyex.exchange_key(dh.public_key) print("got server public key, creating shared secret key...") dh.make_shared_secret_and_key(other_key) print("setting key on proxy.") p._pyroHmacKey = dh.key print("Calling proxy again...") result = p.process("hey") print("Got reply:", result)
def setup(self, secret_key, public_key): self.dh = DiffieHellman() self.kdf = KDF(secret_key, self.dh.shared(public_key))
def __init__(self): self.dh = DiffieHellman()