def read_latest_intergroup_message(self, group):
        """
        This is a function for a member to read the latest message that has been sent to his group from members outside his group. 
        Once a message has been added to a group successfully, this function must be called for every member of that group. 
        """

        if self.group_id != group.id:
            print(bcolors.BOLD + bcolors.ERROR + "You are not a member of group ", group.id, "!! \nCannot read messages of the group!!\n" + bcolors.ENDC)
            return False

        if len(group.intergroup_messages) == 0:
            print(bcolors.BOLD + bcolors.ERROR + "No messages have been sent to the group.\n" + bcolors.ENDC)
            return False

        encrypted_message = group.intergroup_messages[-1][0]
        sender_id = group.intergroup_messages[-1][1]
        group_polynomial = group.get_group_polynomial()
        group_key = evaluate_polynomial(group_polynomial, self.secret_key)
        intergroup_polynomial = decrypt_polynomial(group.intergroup_polynomial, group_key)
        key = evaluate_polynomial(intergroup_polynomial, sender_id)
        encoded_key = str(bin(key)[2:])
        decrypted_message = decrypt(encrypted_message, encoded_key)
        decoded_message = decode(decrypted_message)

        print("Message read by member {}: {}\n".format(self.id, decoded_message))

        self.message_history.append((decoded_message, sender_id))

        return True
Example #2
0
    def request_intergroup_key(self, member_id):
        """
        This function returns an inter-group key, 
        when a member outside the group requests for the key to send a message to the group.
        """

        group_key = evaluate_polynomial(self.group_polynomial,
                                        self.secret_keys[0])
        decrypted_polynomial = decrypt_polynomial(self.intergroup_polynomial,
                                                  group_key)
        intergroup_key = evaluate_polynomial(decrypted_polynomial, member_id)
        print(bcolors.BOLD + bcolors.OKGREEN + "Evaluated inter group key : " +
              bcolors.ENDC + str(intergroup_key))

        return intergroup_key
Example #3
0
    def add_member(self, member):
        """
        This function adds a new member to the group. 
        It generates a new group key and a new group polynomial.
        """
        member_id = member.id
        member_group = member.group_id

        if member_group is not None:
            print("\nMember {} already part of Group {}".format(
                member_id, member_group))
            print("\nCannot add member")
            return False

        print("\n****** Printing re-keying process *******")

        member_key = random.randint(2**FLAGS.l, 2**FLAGS.h)
        member.set_group_id(self.id)
        member.set_secret_key(member_key)
        self.members[member_id] = member
        self.secret_keys.append(member_key)

        print(bcolors.BOLD + bcolors.OKGREEN +
              "\nMember {} with secret key {} added to Group {}.".format(
                  member_id, member_key, self.id) + bcolors.ENDC)

        if (len(self.secret_keys) == 1):
            print(bcolors.BOLD + bcolors.OKGREEN + "\nMaking ", member_id,
                  " the admin of the group: ", self.id, "\n" + bcolors.ENDC)
            self.admin_id = member_id

        # Generating new group polynomial and new group key
        self.group_polynomial = generate_polynomial(self.secret_keys)

        # Generating new intergroup polynomial
        group_key = evaluate_polynomial(self.group_polynomial,
                                        self.secret_keys[0])
        intergroup_polynomial = gen_intergroup_polynomial(len(
            self.secret_keys))
        encrpyted_intergroup_polynomial = encrypt_polynomial(
            intergroup_polynomial, group_key)
        self.intergroup_polynomial = encrpyted_intergroup_polynomial
        print(bcolors.BOLD + bcolors.OKGREEN +
              "\nEncrypted Inter Group Polynomial : " + bcolors.ENDC +
              self.intergroup_polynomial)

        return True
Example #4
0
    def remove_member(self, member_id):
        """
        This function removes a member with given id from the group. 
        It generates a new group key and a new group polynomial.
        """

        if member_id not in self.members.keys():
            print(bcolors.BOLD + bcolors.ERROR +
                  "\nMember {} is not part of Group {}".format(
                      member_id, self.id) + bcolors.ENDC)
            print(bcolors.BOLD + bcolors.ERROR + "\nCannot remove member" +
                  bcolors.ENDC)
            return False
        if (member_id == self.admin_id):
            print(bcolors.BOLD + bcolors.ERROR +
                  "Admin of group cannot be removed" + bcolors.ENDC)
            return False

        print("\n****** Printing re-keying process *******")

        member = self.members.pop(member_id)
        member.set_group_id(None)
        self.secret_keys.remove(member.secret_key)

        print(bcolors.BOLD + bcolors.OKGREEN +
              "\nMember {} with secret key {} removed from Group {}.\n".format(
                  member_id, member.secret_key, self.id) + bcolors.ENDC)

        # Generating new group polynomial and new group key
        self.group_polynomial = generate_polynomial(self.secret_keys)

        # Generating new intergroup polynomial
        group_key = evaluate_polynomial(self.group_polynomial,
                                        self.secret_keys[0])
        intergroup_polynomial = gen_intergroup_polynomial(len(
            self.secret_keys))
        encrpyted_intergroup_polynomial = encrypt_polynomial(
            intergroup_polynomial, group_key)
        self.intergroup_polynomial = encrpyted_intergroup_polynomial
        print(bcolors.BOLD + bcolors.OKGREEN +
              "\nEncrypted Inter Group Polynomial : {}\n".format(
                  self.intergroup_polynomial) + bcolors.ENDC)

        return True
    def add_message_to_group(self, group, message):

        """
        This is a function that handles the sending of a message by a member to the other members of the group that he is part of.
        The function returns True if message was written successfully, and False otherwise.
        """

        if self.group_id != group.id:
            """
            Inter Group Message
            """
            print("Sending inter-group message from member {} to group {}: {}\n".format(self.id, group.id, message))
            
            key = group.request_intergroup_key(self.id)
            encoded_key = str(bin(key)[2:])
            encoded_message = encode(message)
            encrypted_message = encrypt(encoded_message, encoded_key)
            group.add_intergroup_message(encrypted_message, self.id)

            print("Message has been sent to the group successfully.\n")

        else:
            """
            Intra Group Message
            """
            print(bcolors.BOLD + bcolors.WARNING + "Sending intra-group message from member {} to group {}: {}\n".format(self.id, group.id, message) + bcolors.ENDC)

            group_polynomial = group.get_group_polynomial()
            group_key = evaluate_polynomial(group_polynomial, self.secret_key)
            encoded_message = encode(message)
            encoded_key = str(bin(group_key)[2:])
            encrypted_message = encrypt(encoded_message, encoded_key)
            group.add_message_to_group(encrypted_message)

            print("Message has been added to the group successfully.\n")

        return True