예제 #1
0
    def DH(self, client, cipher):
        print '\n############### STARTING D-H ##################'

        myDH = DiffieHellman()

        # Receive value from client
        recvDH = client.recv(1024).strip()

        # Decrypt received value from client
        publicVal = cipher.decrypt(recvDH)

        print 'Received encrypted value: ', recvDH.encode('hex')
        print '\n'
        print 'g^a mod p value is: ', publicVal
        print '\n'

        # Encrypt DH's public key AES using shared cipher
        sendDH = cipher.encrypt(str(myDH.public_key))
        print 'g^b mod p value is: ', myDH.public_key
        print '\n'
        print 'Sending encrypted value: ', sendDH.encode('hex')
        print '\n'

        # Send computed DH to client
        client.send(str(sendDH))

        # Compute shared key
        myDH.calc_shared_key(long(publicVal))

        print 'Calculated session key:', myDH.key

        self.sessionKey = myDH.key

        print '################## D-H OVER ###################\n'
예제 #2
0
    def DH(self, sharedKey):
        print '\n############### STARTING D-H ##################'
        # Create AES object with shared key
        cipher = AESCipher(sharedKey)

        #generate key to send to server
        myDiffieHellman = DiffieHellman()
        print 'g^a mod p value is: ', myDiffieHellman.public_key

        print '\n'

        #send key to server
        sendDH = cipher.encrypt(str(myDiffieHellman.public_key))
        print 'Sending encrypted value: ', sendDH.encode('hex')
        self.send(str(sendDH))

        print '\n'

        recvDH = self.waitToRec()

        #decrypt received DH value
        reply = cipher.decrypt(recvDH)
        print 'Received encrypted value: ', recvDH.encode('hex')
        print '\n'
        print 'g^b mod p value is: ', reply
        print '\n'

        #calculate session key
        myDiffieHellman.calc_shared_key(long(reply))
        print "Calculated session key:", myDiffieHellman.key
        self.sessionKey = myDiffieHellman.key

        print '################## D-H OVER ###################\n'
예제 #3
0
  def __establish_session(self, con):
    generator, prime = self.__receive_generator_and_prime(con)

    diffie_hellman = DiffieHellman(generator, prime)
    result = diffie_hellman.get_result()
    result_from_client = int(con.recv(1024))
    con.send(bytes(str(result), 'utf8'))
    
    self.__key = diffie_hellman.calculate_shared_secret(result_from_client)
    self.__session_estabilished = True
    print("Session key: " + str(self.__key))

    self.__key = self.__key.to_bytes(32, byteorder = "big")

    self.__aes = pyaes.AESModeOfOperationCTR(self.__key)
예제 #4
0
    def __init__(self):
        super(Client, self).__init__()

        # Server connection variables
        try:
            self.server_ip = "127.0.0.1"
            self.server_port = 8080
            self.socket = socket(AF_INET, SOCK_STREAM)
            self.socket.connect((self.server_ip, self.server_port))
        except Exception as e:
            log_error("Error connecting with the server\n")
            raise
            return
        self.cc = CC_Interaction()
        try:
            self.uuid = self.cc.get_pubkey_hash_int()
        except ValueError:
            log_error("Error getting uuid\n")
            raise
            return
        self.id = None
        self.sessionKeys = DiffieHellman()

        #assimetrica gerada por nos (nao do cc)

        self.AsyCypher = Asy_Cyphers(self.uuid)
        self.blockChain = None
        self.certCertificate = None
예제 #5
0
    def establish_session(self):
        generator, prime = Math.generate_generator_and_prime(256)
        self.__tcp_client.send(bytes(str(generator), 'utf8'))
        self.__tcp_client.send(bytes(str(prime), 'utf8'))

        diffie_hellman = DiffieHellman(generator, prime)
        result = diffie_hellman.get_result()

        self.__tcp_client.send(bytes(str(result), 'utf8'))

        result_from_server = int(self.__tcp_client.recv(1024))

        self.__key = diffie_hellman.calculate_shared_secret(result_from_server)

        print("Session key: " + str(self.__key))

        self.__key = self.__key.to_bytes(32, byteorder="big")

        self.__aes = pyaes.AESModeOfOperationCTR(self.__key)
예제 #6
0
    def handle(self):
        self.__debugflag = self.server.conn
        self.__dh = DiffieHellman.DH()

        # print the Client-IP
        print("[{}] Client connected.".format(self.client_address[0]))

        # init
        self.initDiffieHellman()
        print("> The secret key is {}\n".format(self.__dh.key))
예제 #7
0
 def __init__(self,
              comm,
              compress=False,
              addr="\x00\x00",
              psk="",
              dh_callback=None):
     self.compress = compress
     self.addr = addr
     self.last_iv = 0x00
     self.last_seq = 0x00
     self.comm = comm
     self.streams = []
     self.stream_cnt = 0
     self.pub_key = 0
     self._psk = psk
     self.dh_callback = dh_callback
     self._secret = ""
     if not self._secret:
         INFO("Calculating diffie hellman public key")
         self.dh = DiffieHellman()
예제 #8
0
    def test_diffie_hellman_exchange(self):
        """
        Simulates a diffie-hellman key exchange
        """

        # Alice and Bob agree for a secure generator and prime
        base, modulus = Math.generate_generator_and_prime(128)
        alice = DiffieHellman(base, modulus)
        bob = DiffieHellman(base, modulus)

        # Alice calculates her exponentiation
        alice_result = alice.get_result()

        # Bob calculates his exponentiation
        bob_result = bob.get_result()

        # so, they exchange the result and calculates the shared secret
        secret_alice = alice.calculate_shared_secret(bob_result)
        secret_bob = bob.calculate_shared_secret(alice_result)

        # And if right, both secrets must be equal.
        self.assertEqual(secret_alice, secret_bob)
예제 #9
0
    def __init__(self, socket, addr):
        self.socket = socket
        self.bufin = ""
        self.bufout = ""
        self.addr = addr
        self.id = None
        self.uuid = None
        self.sa_data = None
        self.sessionKeys = DiffieHellman()
        self.blockChain = None
        self.clientCertificate = None

        try:
            pub = b""
            priv = b""
            pub_file = "Seguranca_Signed.pem"
            private_file =  "NovaKey.pem"
            with open(pub_file, "rb") as key_file:
                pub = key_file.read()
            with open(private_file, "rb") as key_file:
                priv = key_file.read()
            self.certServe = Cert_Sign(pub, priv)
        except Exception as e:
            print(e)
예제 #10
0
from DiffieHellman import DiffieHellman
from binascii import hexlify

if __name__ == "__main__":

    alisa = DiffieHellman()
    bob = DiffieHellman()

    print('Alisa:')
    alisa_key = alisa.generateSharedKey(bob.getPublicKey(), show_results=True)
    print('\n')
    print('Bob:')
    bob_key = bob.generateSharedKey(alisa.getPublicKey(), show_results=True)

    print('\n')
    print(f'Kljucevi su isti: {alisa_key == bob_key}')
    print('\n')

    if alisa_key == bob_key:
        print(
            f'Kljuc koji se moze koristiti za AES sifru: {hexlify(alisa_key)}')
        print(f'Duzina kljuca je {len(alisa_key)*8} bitova')
예제 #11
0
 def __init__(self, debugflag):
     self.__dh = DiffieHellman.DH()
     self.__debugflag = debugflag
예제 #12
0
파일: test.py 프로젝트: mhdr/Thesis
from binascii import hexlify
from DiffieHellman import DiffieHellman

a = DiffieHellman()
b = DiffieHellman()

a.genKey(b.publicKey)
b.genKey(a.publicKey)

#a.showParams()
#a.showResults()
#b.showParams()
#b.showResults()

if(a.getKey() == b.getKey()):
    print("Shared keys match.")
    print("Key:", hexlify(a.key))
else:
    print("Shared secrets didn't match!")
    print("Shared secret A: ", a.genSecret(b.publicKey))
    print("Shared secret B: ", b.genSecret(a.publicKey))
from DiffieHellman import DiffieHellman

Alice = DiffieHellman()
Bob = DiffieHellman()

Alice.generate_secret()
Bob.generate_secret()

print('Alice secret', Alice.get_secret())
print('Bob secret', Bob.get_secret())

A = Alice.get_public()
B = Bob.get_public()

print('Alice public', A)
print('Bob public', B)

Alice.set_other_public(B)
Bob.set_other_public(A)

Alice.generate_shared_private_key()
Bob.generate_shared_private_key()

print('shared1', Alice.get_shared_private_key())
print('shared2', Bob.get_shared_private_key())
예제 #14
0
 def __init__(self, state):
     self.state = state
     self.dh = DiffieHellman()
예제 #15
0
class UserChat:
    def __init__(self, state):
        self.state = state
        self.dh = DiffieHellman()

    def handleMsg(self, resp):
        header = resp.split(';')[0]
        if header == 'e':
            self.state = 'lead'
            raise toSChatError(resp.split(';')[1])
        if self.state == 'syn':
            self.handleOkResp(resp)
        if self.state == 'wait':
            #self.handleSynReq(resp)
            raise SChatError('Unknown Error')
        if self.state == 'okSent':
            self.handleGrResp(resp)

    def handleSynReq(self, resp, serverKey):
        header = resp.split(';')[0]
        if header != 'h':
            raise SChatError(
                'Got invalid msg(header) while in \'wait\' state!')
        try:
            token, self.encData = resp.split(';')[1:]
            return binascii.unhexlify(
                AESCipher(serverKey).decrypt(token)).split(
                    ';')  #username,sharedKey
        except Exception as err:
            raise SChatError(
                'Invalid content in Hi request, problem with decryption! - ' +
                str(err))

    def sendOkMsg(self, peer):
        self.peer = peer
        dhKey, self.nounce = self.peer.aes.decrypt(self.encData).split(';')
        self.peer.send(
            'o;' +
            self.peer.aes.encrypt(self.nounce + ';' + str(self.dh.publicKey))
        )  #+';'+str(peer.sport)))
        self.dh.genKey(int(dhKey))
        self.peer.aes = AESCipher(binascii.hexlify(self.dh.getKey()))
        self.state = 'okSent'

    def handleGrResp(self, resp):
        #expect the next message (g - ack)
        header = resp.split(';')[0]
        if header != 'g':
            raise SChatError(
                'Got invalid msg(header) while in \'okSent\' state!')
        recvNounce = int(self.decryptAes(resp.split(';')[1]))
        if recvNounce != int(self.nounce) + 1:
            raise SChatError(
                'Received nounce sent back by the peer isn\'t compatible with the\n nounce number sent originally by you... \nYou may be under attack if this error continue to apper!'
            )
        self.state = 'ready'

    def decryptAes(self, msg):
        try:
            return self.peer.aes.decrypt(msg)
        except Exception as er:
            raise SChatError(
                'Invalid msg, can\'t decrypt the data, maybe wrong key or unauthorized source! - '
                + str(er))

    def handleOkResp(self, respAddr):
        resp = respAddr[0]
        addr = respAddr[1]
        header = resp.split(';')[0]
        if header != 'o':
            raise SChatError('Got invalid msg(header) while in \'syn\' state!')
        nounce, DHKey = self.decryptAes(resp.split(';')[1]).split(';')
        self.peer.changePort(addr[1])
        self.dh.genKey(int(DHKey))
        self.peer.aes = AESCipher(binascii.hexlify(self.dh.getKey()))
        if nounce != self.nounce:
            raise SChatError(
                'Received nounce sent back by the peer isn\'t compatible with the\n nounce number sent originally by you... \nYou may be under attack if this error continue to apper!'
            )
        self.peer.send('g;' + self.peer.aes.encrypt(str(int(self.nounce) + 1)))
        #self.peer.send('g;' + self.peer.aes.encrypt(str(int(self.nounce) + 1)))
        self.state = 'ready'

    def sendSyn(self, peer, token):
        self.peer = peer
        if self.state != 'lead':
            raise SChatError(
                'Can\'t start chat without getting info from the server about the unknown user!'
            )
        self.nounce = str(randint(1, 65555))
        self.peer.send(
            'h;' + token + ';' +
            self.peer.aes.encrypt(str(self.dh.publicKey) + ';' + self.nounce))
        self.state = 'syn'
예제 #16
0
from DiffieHellman import DiffieHellman

dhAlice = DiffieHellman()
g, p, publicKey = dhAlice.getBaseAndModulusAndPublicKey()
dhBob = DiffieHellman(g, p, publicKey)

print(dhBob.sharedSecret == dhAlice.calcSecret(dhBob.publicKey))
예제 #17
0
 def initDiffieHellman(self):
     new_window = DiffieHellman.Diffie_HellmanApp(self)
     new_window.show()
예제 #18
0
                header = data['header']
                body = data['data']
                toSend = {}
                print('received: %s' % data)

                if header == "DH":
                    if (verifyMsg(body['publicKey'], body['hasz'],
                                  body['signature'])):
                        print('>>> DIGITAL SIGNATURE VERIFIED! <<<')

                        g, p, alicePublicKey = body['message'].split(':')
                        g = int(g)
                        p = int(p)
                        alicePublicKey = int(alicePublicKey)

                        dhBob = DiffieHellman(g, p, alicePublicKey)
                        toSend['header'] = 'DH'
                        toSend['data'] = str(dhBob.publicKey)
                        print('Bob SharedSecret(%d): %d' %
                              (dhBob.sharedSecret.bit_length(),
                               dhBob.sharedSecret))
                        aesOBJ = AESCipher(str(dhBob.sharedSecret))
                    else:
                        print('DIGITAL SIGNATURE NOT VERIFIED!')
                elif header == "AES":
                    decryptedBody = aesOBJ.decrypt(body)
                    print("RESPONSE: %s" % decryptedBody)
                    inpt = input('Your message > ')
                    enc = aesOBJ.encrypt(inpt)
                    toSend['header'] = 'AES'
                    toSend['data'] = enc
예제 #19
0
print 'times to decrypt N Bytes: '
pprint( dict(zip([1, 10, 100, 1000, 10000], dtimes)) )

# decrypting M times
M = 1000
N = 100
# generate a random secret key
key = Random.new().read(KEY_SIZE)
# generate a random IV
iv_bytes = Random.new().read(BLOCK_SIZE)
# create a cipher object using the random key and IV
cipher = AES.new(key, mode, iv_bytes)
# decode the encoded string
encoded = EncodeAES(cipher, 'c' * N)
stmt='''
for i in xrange(M):
    decoded = DecodeAES(cipher, iv_bytes + encoded)[len(iv_bytes):]
'''
print 'time to decrypt ' + str(M) + ' messages, each of ' + str(N) + ' Bytes of plaintext size: ' , \
timeit(stmt, setup="from __main__ import DecodeAES, cipher, iv_bytes, encoded, M", number=rep) / rep


## Diffie Hellman benchmark
a = DiffieHellman()
b = DiffieHellman()
a.genKey(b.publicKey)
b.genKey(a.publicKey)

# compute timing of performing modular exponentiation
print 'time to perform modular exponentiation: ', \
timeit("pow(b.publicKey, a.privateKey, a.prime)", setup="from __main__ import a, b", number=rep) / rep
예제 #20
0
    while len(data) < n:
        sock.settimeout(20)
        packet = sock.recv(n - len(data))

        if not packet:
            print("Timeout")
            return None
        data += packet
    return data


while True:
    try:
        #        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock = socket.create_connection((TCP_IP, TCP_PORT), 10)
        a = DiffieHellman()
        msg = b64encode(str(a.publicKey).encode())
        sys.stdout.flush()
        print("Len: ", len(msg))
        sock.sendall(msg)
        m = recvall(sock, 2468)
        msg = b64decode(m)
        print("Alice Pub: ", str(a.publicKey))
        a.genKey(int(msg))
        a.showResults()

        print("Key {}".format(a.key))
        aes = AESCipher(a.key)

        f = open('script.txt')
        count = 0
예제 #21
0
from RSAdigitalSignature import signMsg

aesOBJ = object()

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect the socket to the port where the server is listening
server_address = ('localhost', 9998)
print('connecting to %s port %s' % server_address)
sock.connect(server_address)

try:

    # Diffie Hellman
    dhAlice = DiffieHellman()
    aliceSharedSecret = ''
    g, p, alicePublicKey = dhAlice.getBaseAndModulusAndPublicKey()
    message = str(g) + ':' + str(p) + ':' + str(alicePublicKey)

    # Send data
    toSend = {}
    toSend['header'] = 'DH'
    toSend['data'] = signMsg(message)
    print('sending: %s' % toSend)
    sock.sendall(pickle.dumps(toSend))

    while True:
        # Look for the response
        amount_received = 0
        amount_expected = len(message)
예제 #22
0
bob_port = 5005

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((TCP_IP, TCP_PORT))
server.listen(1)

print("Listening on {}:{}".format(TCP_IP, TCP_PORT))
sys.stdout.flush()


while True:
    try:
        alice, addr = server.accept()

        data = b64decode(alice.recv(4096).decode()) # buffer size is 1024 bytes
        a = DiffieHellman()
        msg = b64encode(str(a.publicKey).encode())
        alice.sendall(msg)
        a.genKey(int(data))

        bob = socket.create_connection((bob_ip, bob_port), 30)
        b = DiffieHellman()
        msg = b64encode(str(b.publicKey).encode())
        bob.sendall(msg)
        msg = b64decode(bob.recv(4096).decode())
        b.genKey(int(msg))
        
        aes_a = AESCipher(a.key)
        aes_b = AESCipher(b.key)

        while True:
예제 #23
0
파일: bob.py 프로젝트: tamuctf/TAMUctf-2019
    while True:
        try:
            print("Waiting for conn")
            sys.stdout.flush()
            conn, addr = sock.accept()
            m = recvall(conn, 2468)
            #            m = conn.recv(10000).decode()
            print("Recvd: ", m)
            print("Len: ", len(m))
            sys.stdout.flush()
            data = b64decode(m)  # buffer size is 1024 bytes
            print("Recved pub key")
            sys.stdout.flush()

            b = DiffieHellman()
            msg = b64encode(str(b.publicKey).encode())
            conn.sendall(msg)

            b.genKey(int(data))
            print("Generated private key")
            sys.stdout.flush()
            #        ciphertext = conn.recv(4096)

            aes = AESCipher(b.key)

            f = open('script.txt')

            count = 0
            for line in f:
                #            print("In loop")