Example #1
0
def generate_new_hash_chain(chain_length):
    hash_base = get_random_bytes(16)
    initial_hash = SHA256.new(hash_base).digest()
    hash_chain_list = []
    hash_chain_list.append(initial_hash)
    for index in range(chain_length-1):
        hasher = SHA256.new(initial_hash).digest()
        #print(hasher)
        hash_chain_list.append(hasher)
        initial_hash = hasher
    hash_str = RSA.tostr(hasher)
    if hash_str.find('\t') != -1:
        generate_new_hash_chain(chain_length)
    print("HASH LIST: ", hash_chain_list)
    return hash_chain_list
Example #2
0
def bank_register():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 1234))

    while True:
        print(s.recv(4096).decode('utf-8'))
        bank_option = input("Choose bank option: ")
        s.send(bytes(bank_option, 'utf-8'))

        print(s.recv(4096).decode('utf-8'))
        m = input("Full name: ")
        deposited_sum = input("Deposited_sum: ")
        if m == "exit":
            s.close()
            print("Connection closed")
        package = ''.join([m, '\t', socket.gethostbyname(socket.gethostname()), '\t', str(public_key), '\t', str(deposited_sum)])
        s.send(bytes(package, 'utf-8'))

        #print(s.recv(4096).decode('utf-8'))
        received_certif = RSA.tostr(s.recv(4096)) #.decode('utf-8')

        initial = received_certif
        #print("FULL CERTIF: ", received_certif)
        bank_public_key = str(received_certif).split('\t')[3].replace('b\'', '', 1)
        bank_public_key = bank_public_key.replace('\'', '', 11)
        received_signature = received_certif.split('\t')[7]
        ks = str()
        for item in received_certif.split('\t')[7:]:
            ks += item
            ks += '\t'
            #print("ITEM: ", item)
        ks = ks[:-1]

        received_c = str(str(received_certif).split(received_signature)[0])[1:]
        #print("certif: ", received_c)
        hash = SHA256.new()
        hash.update(bytes(received_c, 'utf-8'))
        hashed_package = hash.digest()
        #print("hashed package: ", hashed_package)
        file_out = open("temp.bin", "w+")

        k = len(bank_public_key.split('\\n'))
        c = 0
        for item in bank_public_key.split('\\n'):
            c += 1
            if c != k:
                file_out.write(item + '\n')
            else:
                file_out.write(item)
        file_out.close()


        #print("data: ", received_c)
        #print("signature: ", received_signature)
        #k1 = base64.b64encode(received_c.encode())
        #k2 = base64.b64encode(received_signature.encode())
        #print("encoded data: ", k1)
        #print("encoded signature: ", k2)

        #print("KKKKK: ", len(ks), ks)
        #print("KKKKK: ", len(received_signature), received_signature)
        open("signature.bin", "wb").write(RSA.tobytes(ks))
        open("message.bin", "wb").write(RSA.tobytes(received_c))
        print(verify_sign("temp.bin", ks, received_c))
Example #3
0
def pay():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 1250))

    while True:
        user_name = input("Enter username: "******"vendors_list.txt", "r") as f:
            file_lines = [x for x in f.readlines()]
            for item in file_lines:
                if vendor_name == item[:-1]:
                    check = True
                    break
        f.close()

        menu_option = s.recv(4096).decode('utf-8')
        print(menu_option)
        menu_sent = input("choose option: ")
        s.send(bytes(menu_sent, 'utf-8'))
        product_list = s.recv(4096).decode('utf-8')
        print(product_list)
        print(s.recv(4096).decode('utf-8'))
        product_number = input("Choose product number: ")
        s.send(bytes(product_number, 'utf-8'))

        with open("hashes.bin", "rb") as f:
            file_lines = [x[:-1] for x in f.readlines()]
        if len(file_lines) == 0:
            chain_length = input("Choose chain length:")
            hash_chain = generate_new_hash_chain(int(chain_length))
        else:
            hash_chain = file_lines

        if not check:
            s.send(bytes("first_time", 'utf-8'))
            sig = RSA.tostr(open("signature.bin", "rb").read())
            chain_length = input("Choose chain length:")
            hash_chain = generate_new_hash_chain(int(chain_length))
            with open("hashes.bin", "wb") as f:
                for item in hash_chain:
                    f.write(item)
                    f.write(b'\n')
            chain_base = RSA.tostr(hash_chain[-1])
            print("HASH CHAIN: ", hash_chain)
            actual_date = (datetime.date.today()).isoformat()

            commit = ''.join(
                    [sig, '\t', str(actual_date),'\t', chain_base,  '\t', str(chain_length), '\t', vendor_name, '\t', user_name, '\t'])
            user_private_key = RSA.import_key(open('rsa_user_private_key.bin').read(), "generic_passw0rd")
            cipher_rsa = PKCS1_v1_5.new(user_private_key)
            print("HEREEEE")
            print(commit, len(commit))
            hash = SHA256.new()
            hash.update(bytes(commit, 'utf-8'))
            signed_commit = RSA.tostr(cipher_rsa.sign(hash))

            complete_package = commit.join(['\t', signed_commit])
            print("signed_commit:", signed_commit, len(signed_commit))
            print(type(complete_package))
            print("Complete package: ", complete_package, len(complete_package))
            #product_number = input("Choose product number: ")
            s.send(bytes(complete_package, 'utf-8'))
            check = s.recv(4096).decode('utf-8')
            print(check)
            if check == "Signatures passed.":
                with open("vendors_list.txt", "a") as f:
                    f.write(vendor_name + '\n')

        s.send(bytes("not_first_time", 'utf-8'))
        product_number = int(product_number)
        payment_nr = int(product_list.split('\n')[product_number-1].split(' ')[1][:-1])
        payment_packet = "".join([RSA.tostr(hash_chain[-payment_nr-1]), '....', str(payment_nr)])
        print("Payment package: ", payment_packet)

        s.send(bytes(user_name, 'utf-8'))
        s.send(bytes(payment_packet, 'utf-8'))



        #print(s.recv(4096).decode('utf-8'))
        #m = input("Full name: ")
        #deposited_sum = input("Deposited_sum: ")
        #if m == "exit":
        #    s.close()
        #    print("Connection closed")
        #package = ''.join(
        #    [m, '\t', socket.gethostbyname(socket.gethostname()), '\t', str(public_key), '\t', str(deposited_sum)])
        #s.send(bytes(package, 'utf-8'))

        ''''# print(s.recv(4096).decode('utf-8'))
Example #4
0
def handler(clientsocket, clientaddr):
    print("Accepted connection from: ", clientaddr)
    m = input("Vendor name: ")
    clientsocket.send(bytes(m, 'utf-8'))
    while True:
        clientsocket.send(
            bytes("Send 1 for payment. Send 'exit' to quit.", 'utf-8'))
        menu_option = clientsocket.recv(4096).decode('utf-8')
        print("Menu option: ", menu_option)
        if menu_option == "exit" or not menu_option:
            print("Closing connection")
            clientsocket.send(bytes("Closing connection\n", 'utf-8'))
            break

        elif menu_option[0] == '1':
            file_lines = str()
            with open("product_list.txt", "r") as f:
                for x in f.readlines():
                    file_lines += x
            clientsocket.send(bytes(file_lines, 'utf-8'))
            clientsocket.send(bytes("Send product number.", 'utf-8'))
            product_number = clientsocket.recv(4096).decode('utf-8')
            #print(product_number)
            first_val = clientsocket.recv(4096).decode('utf-8')
            print(first_val)
            if first_val == "first_time":
                complete_package = clientsocket.recv(4096).decode('utf-8')
                print(type(complete_package))
                print("Complete package: ", complete_package,
                      len(complete_package))
                print(complete_package.split('\t'))
                data = complete_package.split('\t')[1:7]
                signature = complete_package.split('\t')[7:]
                conc_data = str()
                conc_sign = str()
                for item in data:
                    conc_data += item + '\t'
                for item in signature:
                    conc_sign += item + '\t'
                conc_sign = conc_sign[:-1]
                #conc_data = conc_data[:-1]
                print("conc_sign: ", conc_sign, len(conc_sign))

                #print(type(data))
                print("sig:", signature, len(signature))
                user_sign_check = verify_sign(
                    "../User/rsa_user_public_key.bin", conc_sign, conc_data)
                print(user_sign_check)
                print(complete_package.split('\t'))
                other_sig = str()
                print(complete_package.split('\t'))
                for item in complete_package.split('\t')[1:2]:
                    other_sig += item + '\t'
                other_sig = other_sig[:-1]
                print(other_sig)
                data_from_bank = open("../User/message.bin").read()
                bank_sign_check = verify_sign(
                    "../Bank/rsa_bank_public_key.bin", other_sig,
                    data_from_bank)
                print(bank_sign_check)
                with open("commits.bin", "ab") as c:
                    k = bytes(conc_data, 'utf-8') + b'\n'
                    c.write(k)

                if user_sign_check and bank_sign_check:
                    clientsocket.send(bytes("Signatures passed.", 'utf-8'))

            print("Payment")
            payment_response = clientsocket.recv(4096).decode('utf-8')
            print(payment_response)

            user_name = clientsocket.recv(4096).decode('utf-8')
            print(user_name)

            payment_package = clientsocket.recv(4096).decode('utf-8')
            print(payment_package)

            payment_hash = payment_package.split('....')[0]
            payment_nr_of_hashes = payment_package.split('....')[1]
            print("Payment hash: ", payment_hash)

            with open("commits.bin", "rb") as f:
                file_lines = f.read()
                for item in file_lines.split(b'\t\n')[:-1]:
                    hashs_base = item.split(b'\t')[2:-3][0].decode('utf-8')
                    name = item.split(b'\t')[-1].decode('utf-8')
                    print(hashs_base, len(hashs_base))
                    print(name)
                    if name == user_name:
                        hasher = str()
                        print("HASH base: ", hashs_base)
                        print("PAY hash : ", payment_hash)
                        initial_hash = RSA.tobytes(payment_hash)
                        for index in range(int(payment_nr_of_hashes)):
                            hasher = SHA256.new(initial_hash).digest()
                            print("hasher ind: ", RSA.tostr(hasher))
                            # print(hasher)
                            initial_hash = hasher
                        print("HASH base: ", hashs_base)
                        print("Hasher f : ", RSA.tostr(hasher))
                        if RSA.tostr(hasher) == hashs_base:
                            print("VALID hashes => valid payment")

            #clientsocket.send(bytes("Send X cash.", 'utf-8'))
            '''
            package_list = str(product_number).split('\t')
            full_name = package_list[0]
            ip_adress = package_list[1]
            client_public_key = package_list[2].replace('b\'', '', 1)
            client_public_key = client_public_key.replace('\'', '', 1)
            deposited_sum = package_list[3]
            card_number = random.randint(1000, 9999)
            bank_public_key = open("rsa_bank_public_key.bin", "rb").read()
            bank_public_key = str(bank_public_key).replace('b\'', '', 1)
            bank_public_key = bank_public_key.replace('\'', '', 1)
            expiry_date = (datetime.date.today() + datetime.timedelta(365 / 12)).isoformat()

            bank_package = ''.join([full_name, '\t', ip_adress, '\t', bank_public_key, '\t', str(deposited_sum),
                                    '\t', str(expiry_date), '\t', str(card_number), '\t'])

            with open("lightweight_database.txt", "r") as f:
                file_lines = [x for x in f.readlines()]
            print("FILE:!!!", file_lines)
            with open("lightweight_database.txt", "a") as f:
                if len(file_lines) == 0:
                    f.write(bank_package + '\n')
                    #clientsocket.send(bytes("BANK: authentication completed!" + '\n', 'utf-8'))
                else:
                    for item in file_lines:
                        if str(card_number) not in item and full_name not in item:
                            #clientsocket.send(bytes("BANK: authentication completed!" + '\n', 'utf-8'))
                            f.write(bank_package + '\n')
                            break
                        #else:
                            #clientsocket.send(bytes("BANK: authentication failed!" + '\n', 'utf-8'))


            hash = SHA256.new(RSA.tobytes(bank_package))

            #print("data: ", bank_package)
            #print("hashed package: ", hash.digest())
            #print("len hashed package: ", len(hash.digest()))


            bank_private_key = RSA.import_key(open('rsa_bank_private_key.bin').read(), "some_passw0rd")
            cipher_rsa = PKCS1_v1_5.new(bank_private_key)

            bank_signed_package = cipher_rsa.sign(hash)
            #print("LENGTH: ", len(bank_signed_package))

            #print("LENGTH rsastr: ", len(RSA.tostr(bank_signed_package)))

            bank_signed_package = RSA.tostr(bank_signed_package)

            t1 = base64.b64encode(bank_package.encode())
            t2 = base64.b64encode(bank_signed_package.encode())

            complete_package = bank_package.join(['\t', bank_signed_package])

           # print("data: ", bank_package)
            #print("signature: ", bank_signed_package)
            #print("len signature: ", len(bank_signed_package))
            #print("complete package: ", complete_package)

            clientsocket.send(RSA.tobytes(complete_package))'''

        else:
            clientsocket.send(bytes("ECHO: " + menu_option + '\n', 'utf-8'))

    clients.remove(clientsocket)
    clientsocket.close()