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
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))
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'))
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()